Nginx性能优化参数项调整

Nginx性能优化调整,应当遵循一个好的原则,一次只调整一个设置项,如果调整项不能提高性能或产生预期的效果,则将设置恢复为原来的值。

为Nginx调整Linux系统参数

Nginx的很多功能直接由所在的操作系统交付,比如:nginx中连接的分配。之所以只讨论Linux系统参数,是因为很少有Window环境会以Nginx做为最终的交付,各种原由参见Nginx架构,所以操作系统的决定了Nginx可以达到的上限。

Linux系统优化参数调整

现代Linux内核(2.6+)中的设置涵盖了大多数应用场景,如果有针对的策略性调整也未尝不可。检查Linux内核日志找出提示参数设置过低的错误消息,根据建议进行调整。在这里仅介绍那些最有可能从调优获得较大收益的参数设置。有关调整设置的详细信息还需自行参阅Linux文档。

Linux连接队列积压

如果传入连接速率很高,而且性能水平参差不齐(例如某些连接似乎停滞不动),那么更改这些设置会有所帮助。以下设置与连接及其排队方式有关。

net.core.somaxconn - 为等待NGINX响应,排队所能接受的最大连接数

默认值通常很低,并且通常可以接受,因为Nginx接受连接的速度非常快,但如果的网站流量很大,则增加它。如果内核日志中的错误消息指示该值太小,将其增加到错误停止。

注意:如果此值大于512,请将backlog参数更改为Nginx listen指令以进行匹配。

net.core.netdev_max_backlog - 在切换到CPU之前,网卡缓冲数据包的速率

如果具有高带宽的环境,增加该值可以提高计算机的性能。检查内核日志中是否存在与此设置相关的错误,并查阅网卡文档以获取有关更改它的建议。

Linux文件描述符

文件描述符是用于表示连接和打开文件等操作系统资源。Nginx每个连接最多可以使用两个文件描述符。例如,如果Nginx为代理,它通常使用一个文件描述符标识客户端连接,而另一个则用于连接到后端服务器,但如果使用HTTP keepalive,则此比率要低得多。对于提供大量连接的系统,可能需要调整以下设置:

sys.fs.file-max 文件描述符的系统范围限制 

通过cat /proc/sys/fs/file-max查看

nofile 用户文件描述符限制

在/etc/security/limits.conf文件中设置,通过ulimit -n查看。

临时端口号

当Nginx充当代理时,与上游服务器的每个连接都使用临时或短暂的端口。可以更改以下设置:

net.ipv4.ip_local_port_range - 端口值允许的范围

如果发现端口不足,扩大端口范围。常见端口设置从1024到65000。

NGINX参数调整

通过NGINX指令调整性能,只讨论安全地可自行调整的指令。

Nginx Worker进程调整

Nginx允许运行多个Worker进程,每个进程都能够处理大量的并发连接。可以使用以下指令,控制工作进程的数量,以及如何处理连接。

worker_processes

NGINX工作进程的数量(默认值为1)。在大多数情况下,一CPU核心运行一个工作进程效果会比较好,建议将选项设置为auto,以达到此目的。有时可能希望增加此数值,例如当工作进程必须执行大量磁盘I/O时。

worker_connections

每个工作进程可以同时处理的最大连接数。默认值为512,但大多数系统都有足够的资源来支持更大的数值。适当的参数值取决于服务器的大小和流量的性质,这些可以通过测试得出。

Keepalive连接

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

keepalive_requests

客户端可以通过单个keepalive连接发出的请求数。默认值为100,更高的值可能需要借助负载生成工具进行测试。

keepalive_timeout

空闲keepalive连接保持打开状态的时间。

以下指令涉及上游(upstream )Keepalive

keepalive

为每个工作进程,保持打开上游服务器的空闲keepalive连接数,没有默认值。要启用与上游服务器的keepalive连接,还必须在配置中包含以下指令:

proxy_http_version 1.1;
proxy_set_header Connection "";

Nginx访问记录

记录每个请求会消耗CPU和I/O周期,减少影响的一种方法是启用日志缓冲。通过缓冲,Nginx不再为每个条日志执行单独的写操作,而是缓冲一系列条目,并在一次操作中将它们一起写入文件。

要启用访问日志缓冲,需将参数包含在指令中。当缓冲区达到阀值时,Nginx将缓冲区内容写入磁盘日志。要让Nginx在指定的时间后写入缓冲区,则需要在参数中指定时间。

设置这两项参数后,当下一个日志条不适合缓冲区,或缓冲区中的条目超过指定时间时,Nginx会将条目写入日志文件。当工作进程重新打开日志文件或关闭时,也会将日志写入磁盘。要完全禁用访问日志记录,则通过参数指定即可。

buffer=sizeaccess_logsizeflush=timeoffaccess_log

Sendfile

操作系统的sendfile()系统调用将数据从一个文件描述符,复制到另一个文件描述符,通常实现零拷贝,以此加速TCP数据传输。要让Nginx能够使用它,则需在http context 或a server 或 location context中包含该指令。

NGINX可以在socket上写入缓存或磁盘内容,而无需任何上下文切换到用户空间,从而使写入速度极快且占用的CPU周期更少。

注意:由于复制的数据通过sendfile()绕过了用户空间,因此不受常规Nginx处理链,和更改内容的过滤器的限制,例如gzip。当配置上下文即包含sendfile,又激活了内容更改过滤器指令时,Nginx会在这个上下文中自动禁用sendfile。

Nginx限制

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

limit_conn

limit_conn_zone

从单个IP地址限制NGINX接受客户端的连接数,设置它们有助于防止个别客户端,打开太多连接而过多消耗资源。

limit_rate

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

limit_req

limit_req_zone

限制NGINX的请求率,与limit_rate有异曲同工之妙。它们还可以提高安全性,特别是对于登录页面,通过将请求率限制为,对于合法用户而言的合理值。从而降低试图通过请求压跨应用的恶意请求(如DDoS攻击中的僵尸程序)。

max_conns

server配置块中upstream指令的参数。设置上游服务器接受的最大并发连接数。此限制有助于防止上游服务器过载。将值设置为0(零,默认值)表示没有限制。

queue (NGINX Plus)

创建一个队列,当上游可用服务器都达到其max_conns限制时,将在该队列中放置请求。此伪指令设置队列中的最大请求数,以及在返回错误之前等待的最长时间(默认为60秒)(可选)。如果省略此指令,则请求不会排队。

Nginx缓存和压缩提高性能

用于提高Web应用程序性能的一些附加功能,并不属于真正的调优,但值得一提,因为受它们影响的可能很大,如缓存和压缩。 

启用Nginx高速缓存

通过在负载均衡的Nginx实例上启用缓存,可以显着缩短对客户端的响应时间,同时显著减少后端服务器的负载。缓存本身就是一个主题,所以不会过多介绍它。 

启用Nginx压缩

压缩发送给客户端的响应数据,可以大大节省网络带宽。但是,同时也会因压缩数据会消耗CPU资源。请务必注意,不应对已压缩的对象(如JPEG文件)启用压缩。