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,请相应调整NGINXbacklog参数,使其与listen指令匹配。net.core.netdev_max_backlog:数据包移交给CPU之前由网卡缓冲的速率。增大此值可以提升高带宽计算机的性能。请检查内核日志中与此设置相关的错误,并参阅网卡文档,了解有关更改此值的建议。
文件描述符
文件描述符是操作系统资源,可用于表示连接、打开的文件等。每个连接最多可占用NGINX的两个文件描述符。例如,当NGINX执行代理时,通常会为客户端连接使用一个文件描述符,并为与被代理服务器的连接使用另一个文件描述符。不过,如果使用HTTP持久连接,这一比例会低得多。对于需要处理大量连接的系统,可能需要调整以下设置:
sys.fs.file-max:系统范围内的文件描述符数量上限nofile,用户文件描述符限制,在“/etc/security/limits.conf”文件中设置
临时端口
当NGINX充当代理时,与上游服务器建立的每个连接都会使用一个临时端口,也称为“短暂”端口。您可能需要更改此设置:
net.ipv4.ip_local_port_range:端口值范围的起始值和结束值。如果发现端口即将耗尽,请扩大该范围。常用设置为端口1024至65000。
调优NGINX配置
以下是一些可能影响性能的NGINX指令。如上所述,我们仅讨论可自行安全调整的指令。建议不要在没有NGINX团队指导的情况下更改其他指令的设置。
工作进程
NGINX可以运行多个工作进程,每个进程都能处理大量并发连接。可以使用以下指令控制工作进程的数量及其处理连接的方式:
worker_processes:NGINX工作进程的数量(默认值为1)。在大多数情况下,每个CPU核心运行一个工作进程即可获得良好效果,建议将此指令设置为auto。在某些情况下,可能需要增加工作进程数量,例如工作进程必须执行大量磁盘I/O时。worker_connections:每个工作进程可同时处理的最大连接数。默认值为 512,但大多数系统都有足够的资源支持更多连接。适当的设置取决于服务器规模和流量特征,可通过测试确定。
Keepalive 连接
Keepalive连接可减少打开和关闭连接所需的CPU及网络开销,从而显著提升性能。NGINX会终止所有客户端连接,并与上游服务器建立彼此独立的连接。NGINX支持客户端和上游服务器使用Keepalive连接。以下指令与客户端Keepalive连接相关:
keepalive_requests:客户端可通过单个keepalive连接发出的请求数。默认值为100,但在使用负载生成工具进行测试时,设置更高的值可能特别有用,因为此类工具通常会从单个客户端发送大量请求。keepalive_timeout,空闲的keepalive连接保持打开状态的时长。
以下指令与上游长连接有关:
keepalive:每个工作进程与上游服务器保持打开状态的空闲keepalive连接数。无默认值。
要启用与上游服务器的 keepalive 连接,还必须在配置中包含以下指令:
proxy_http_version 1.1;proxy_set_header Connection "";访问日志记录
记录每个请求都会占用CPU和I/O周期。要降低这种影响,可以启用访问日志缓冲。启用缓冲后,NGINX不再为每条日志记录单独执行写入操作,而是先缓冲一系列日志记录,再通过一次操作将其一并写入文件。
要启用访问日志缓冲,请在buffer=size 指令中添加 access_log 参数;当缓冲区达到 size 值时,NGINX会将缓冲区内容写入日志。要让NGINX在指定时间后写入缓冲区,请添加 flush=time 参数。同时设置这两个参数后,当下一条日志记录无法放入缓冲区,或缓冲区中的记录已超过指定时间时,NGINX会分别将记录写入日志文件。工作进程重新打开日志文件或关闭时,也会写入日志记录。要完全禁用访问日志记录,请在off 指令中添加 access_log 参数。
Sendfile
操作系统的sendfile()系统调用将数据从一个文件描述符复制到另一个文件描述符,通常可实现零复制,从而加快TCP数据传输。要让NGINX使用此系统调用,请在sendfile指令中,将其添加到http上下文、server上下文或location上下文中。这样,NGINX无需切换到用户空间,即可通过套接字写入缓存或磁盘上的内容,从而大幅提高写入速度并减少CPU周期消耗。但请注意,由于通过sendfile()复制的数据会绕过用户空间,因此不会经过常规的NGINX处理链和会更改内容的过滤器,例如gzip。如果某个配置上下文同时包含sendfile指令和用于启用内容更改过滤器的指令,NGINX会自动为该上下文禁用sendfile。
限制
您可以设置各种限制,帮助防止客户端消耗过多资源,以免对系统性能、安全性和用户体验造成不利影响。以下是一些相关指令:
limit_conn和limit_conn_zone:限制NGINX接受的客户端连接数,例如来自单个IP地址的连接数。设置这些指令有助于防止单个客户端打开过多连接并占用超出其应有份额的资源。limit_rate:按连接限制向客户端传输响应的速率(因此,打开多个连接的客户端可在每个连接上使用相应的带宽)。设置限制可防止某些客户端导致系统过载,确保所有客户端获得更均衡的服务质量。limit_req和limit_req_zone:限制NGINX处理请求的速率,其作用与设置limit_rate相同。它们还可以提升安全性,尤其适用于登录页面。通过将请求速率限制在适合人类用户、但对试图用大量请求压垮应用程序的程序而言过慢的水平,可降低此类程序带来的风险(例如发起DDoS攻击的机器人)。max_conns参数,用于server指令,位于upstream配置块中。该参数用于设置上游组中一台服务器可接受的最大并发连接数。设置限制有助于防止上游服务器过载。将值设置为 0(零,默认值)表示不设限制。queue(NGINX Plus):当上游组中的所有可用服务器均已达到max_conns限制时,创建一个队列来存放请求。此指令用于设置队列中的最大请求数,还可选择设置返回错误前请求在队列中的最长等待时间(默认为60 秒)。如果省略此指令,则请求不会进入队列。
缓存和压缩有助于提升性能
NGINX还有一些可用于提升Web应用性能的功能。严格来说,这些功能并不属于调优范畴,但由于可能显著影响性能,仍值得一提,其中包括缓存和压缩。
缓存
在为一组Web服务器或应用服务器提供负载均衡的NGINX实例上启用缓存,可以显著缩短对客户端的响应时间,同时大幅降低后端服务器的负载。缓存本身是一个独立的主题,本文不作详细介绍。请参阅《NGINX Plus管理指南》。
压缩
压缩发送给客户端的响应可以大幅减小响应大小,从而减少网络带宽占用。但由于压缩数据会消耗CPU资源,因此只有在确实需要减少带宽占用时,压缩才最有用。请注意,不应对已经压缩的对象(例如JPEG文件)启用压缩。有关详细信息,请参阅《NGINX Plus管理指南》。
有关详细信息,请参阅:
- NGINX 基准测试:提高准确性,获得有意义的结果(点播网络研讨会)
- NGINX参考文档,位于nginx.org
- 比较NGINX模型
- NGINX Plus 技术规格
要试用NGINX Plus,请立即开始30天免费试用,或联系我们获取演示。
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
