寒歌属熊总冬眠

NGINX性能调优 - NGINX

原文链接: www.nginx.com

NGINX作为众所周知的具有高性能负载均衡缓存web服务器, 支持着世界上超过40%的商业网站。在大多数使用情况下,默认的NGINX和Linux设置都能很好的工作,但是想达到合适的性能,有时候需要一点调试。本篇博客讨论了调试一个系统时可以考虑的一些NGINX和Linux设置。

你可以调试几乎任何设置,但是这篇博客将专注于几个可以让绝大多数用户受益的设置。有一些设置我们建议只在对NGINX和Linux有很深理解的情况下才改变,或者听从我们的支持团队专业服务团队的指导,我们这里就不讨论了。专业服务团队曾为世界上最繁忙的网站工作,调试最高水平性能的 NGINX,能通过 NGINX或NGINX Plus开发达到最大性能。

简介

这篇博客基于读者对NGINX架构和设置概念有基本的理解,虽然不再尝试复述NGINX文档,但是提供了丰富的选项和相关文档的链接。

有一个好的规矩:调试的时候一次只修改一个设置,如果没有提升性能就修改回默认设置。

我们首先讨论调试Linux,因为一些操作系统的设置值将决定你怎么调试你的NGINX设置。

调试你的Linux设置

现代Linux内核(2.6+)设置对于大多数用途来说是合适的,但是改变一些设置可能获益。检查内核日志错误信息,可以判断出一个设置是否过低,进而把它调整到建议值。这里我们只会讨论在常规工作负载下最可能获益的设置。对于调整这些设置的细节,请查阅你的Linux文档。

积压队列

下面的设置与连接和连接排队方式有关。如果传入连接的速率很高,并且性能不均衡(例如某些连接看起来停滞),则更改这些设置可能会有所帮助。

  • net.core.**somaxconn** – NGINX最大可接受的排队连接数量。默认值通常非常小,因为NGINX接受连接非常快所以通常是可以接受的,但是如果你的网站有很重的访问压力就有必要提升它。如果内核日志中的异常信息标明这个值太小了,调大它直到异常消失。

    注意: 如果你设置值大于512,修改backlog参数为NGINX listen 指令以匹配设置值.

  • net.core.**netdev_max_backlog** – 数据包在被切换到CPU之前被网卡缓冲的速率。 增加值可以提高具有大量带宽的机器的性能。 检查内核日志中是否存在与此设置相关的错误,并查阅网卡文档以获取有关更改的建议。

文件描述符

文件描述符是操作系统资源用来表示连接、打开文件和其它东西。一个连接NGINX最多可以使用两个文件描述符。比如说,如果NGINX正在代理,通常使用一个文件描述符代表客户端连接,使用另一个代表被代理的服务器,尽管如果使用http keeplived这个效率要低得多。如果一个系统要服务大量的连接,下面的设置可能需要被调整:

  • sys.fs.**file_max** – 系统对文件描述符的限制;

  • **nofile** – 用户文件连接符限制,在/etc/security/limits.conf文件中设置。

短暂端口

当NGINX作为一个代理,每个连接上游服务器的连接使用一个临时的或者短暂的端口。你可能会想要修改这些设置:

  • net.ipv4.**ip_local_port_range** – 端口值范围。 如果您发现您的端口用完了,请扩大范围。 常见设置是端口1024到65000。

调试你的NGINX设置

以下是一些可以影响性能的NGINX指令。 如上所述,我们只讨论您可以自己进行调整的安全指令。 我们建议您不要在没有NGINX团队指示的情况下更改其他指令的设置。

工作进程

NGINX可以运行多个工作进程, 每一个都可以处理大量的并发连接。你可以使用下列指令来控制工作进程数和进程如何处理连接:

  • worker_processes – NIGNX工作进程数(默认值为1)。在大多数情况下,每个CPU一个工作进程比较好,我们建议把这个指令设置为auto来保证这一点。有时你会想提升这个值,比如工作进程有很多磁盘I/O工作。

  • worker_connections – 每个工作进程可以同时处理的最大连接数。默认值是512,但是大多数系统有足够的资源支持更高的值。 合适的设置取决于服务器的性能和流量的性质,通过测试可以得出。

Keepalive连接

通过减少打开和关闭连接所需的CPU和网络开销,Keepalive连接可以对性能产生重大影响。 NGINX终止所有客户端连接,并为上游服务器创建单独和独立的连接。 NGINX支持客户端和上游服务器的Keepalive。 以下指令涉及客户端Keepalive:

  • keepalive_requests – 一个客户端通过一个独立的Keepalive连接发出的请求数。默认值是100,但是对于使用负载生成工具进行测试而言,更高的值可能特别有用,负载生成工具通常会从单个客户端发送大量请求。

  • keepalive_timeout – 一一个空闲的keepalive连接可以在多长时间保持打开状态。

下面的指令和上游keepalives有关:

  • keepalive – 每个工作进程连接上游服务器保持打开的空闲连接数量。没有默认值。

启用到上游服务器的keepalive连接,你必须在设置中包含下列指令:

proxy_http_version 1.1

proxy_set_header Connection

访问日志记录

记录了每一个请求消费的CPU和I/O循环,减少影响的一种方法是启用访问日志缓冲。通过缓冲,NGINX不是对每个日志条目执行单独的写入操作,而是缓存一系列条目并将它们一起写入文件中。

启用access‑log缓存,包括buffer=_size_参数和access_log指令;当缓存达到_size_值时NGINX把缓存内容写到日志中。要让NGINX在指定时间后写入缓冲区,请包含flush = _time_参数。 当两个参数都被设置时,NGINX分别在下一个日志条目不适合缓冲区或缓冲区中的条目超过指定时间时将条目写入日志文件。 当工作进程重新打开其日志文件或关闭时,也会写入日志条目。 要完全禁用访问日志记录,请将off参数包含到access_log指令中。

传输文件

操作系统的sendfile()系统调用将数据从一个文件描述符复制到另一个文件描述符,通常实现零拷贝,这可以加速TCP数据传输。 为了使NGINX能够使用它,请在httpserverlocation上下文中包含sendfile指令 。NGINX可以将缓存或磁盘内容写入套接字,而不需要把任何上下文切换到用户空间,从而使写入速度非常快并且消耗更少的CPU循环。然而,请注意,由于使用sendfile()复制的数据绕过了用户空间,因此不受用于更改内容的常规NGINX处理链和过滤器的限制,例如gzip。 当配置上下文同时包含sendfile指令和激活内容修改过滤器的指令时,NGINX会自动禁用该上下文的sendfile

限制

您可以设置各种限制,以防止客户消耗太多资源,这会对系统的性能以及用户体验和安全造成不利影响。 以下是一些相关指令:

  • limit_connlimit_conn_zone – 限制NGINX接受的客户端连接数,例如来自一个IP地址。 设置它们可以帮助防止个人客户打开太多连接并消耗更多的资源。

  • limit_rate –限制每个连接将响应传输到客户端的速率(因此,打开多个连接的客户端可以为每个连接使用此量的带宽)。 设置限制可以防止系统被某些客户端超载,从而确保为所有客户提供更均匀的服务质量。

  • limit_reqlimit_req_zone – 限制NGINX处理请求的速率,它与设置limit_rate的作用相同。通过限制请求速率,限制到对于人类用户来说合理的值,但是对试图用请求来压倒你的应用程序的程序太慢(DDoS攻击),能够提升安全性,尤其是对于登陆页面。

  • max_conns参数,对于upstream设置块中server指令–设置上游服务器组中接受的同时连接的最大数量。 实施限制可以帮助防止上游服务器过载。 将该值设置为0(零,默认值)表示没有限制。

  • queue (NGINX Plus) –当上游组中的所有可用服务器达到其“max_conns”限制时,创建放置请求的队列。 该指令设置队列中的最大请求数,并且可选地在返回错误之前设置它们等待的最长时间(默认为60秒)。 如果您省略此指令,请求不会排队。

缓存和压缩可以提升性能

NGINX的一些额外功能可以用来提高Web应用程序的性能,但这些功能并不属于调优的范畴,但值得一提的是它们的影响可能相当大。 它们包括缓存和压缩。

缓存

通过在一组负载均衡Web服务器或应用程序服务器的NGINX实例上启用缓存,可以显著缩短对客户端的响应时间,同时大幅降低后端服务器的负载。 缓存本身就是一个题目,我们不会在这里试图讨论它。参见 NGINX Plus Admin Guide.

压缩

压缩发送给客户端的响应可以大大减少它们的大小,从而使用较少的网络带宽。 但是,因为压缩数据会消耗CPU资源,所以当真正值得减少带宽使用时,它是非常有用的。 请注意,不应对已压缩的对象(如JPEG文件)启用压缩。 了解更多信息,参见NGINX Plus Admin Guide.

想获取更多信息,参见:

想要尝试NGINX Plus, 今天开始30天免费使用或者联系我们获取示例。