Nginx以高性能负载平衡,缓存和Web服务器而闻名,支持全球40%的繁忙站点。在大多数使用场景中,Nginx和Linux系统的默认配置表现更好,但仍需要进行一些调整以实现最佳性能。
本文讨论调整系统时需要考虑的一些Nginx和Linux配置。这些配置有很多,但在本文中我们仅介绍适合大多数用户的配置。未涵盖的配置仅由对Nginx和Linux有深入了解或Nginx专家服务团队推荐的人员考虑。
Nginx Expert Services已与世界上一些最受欢迎的网站合作,调整Nginx以获得最佳性能,并支持任何需要充分利用系统功能的客户。
介绍
这里假设读者对Nginx架构和配置概念有基本的了解。本文不重复Nginx文档的内容,而是概述各种配置选项并提供相关文档的链接。
调整时,有一个更好的规则,一次只能更改一个配置项。如果更改后没有性能改进,则会返回原始值。
我们首先讨论Linux调优,因为某些值会影响可以在Nginx配置中使用的值。
Linux配置
现代Linux内核(2.6+)是调整各种配置的好方法,也是您可能想要更改的一些配置。如果操作系统配置太低,您将在内核日志中看到错误消息,因此您需要调整这些配置。有很多Linux配置项。本文仅提及在正常工作负载下最有可能需要调整的配置项。如果您需要有关这些配置的更多信息,请参阅Linux文档。
积压队列
以下设置与连接及其排队方式直接相关。如果传入连接速率很高并且性能级别混合,则更改配置可能很有用,例如某些连接似乎已暂停。
Net.core.somaxconn这为等待Nginx接受的连接设置队列大小。由于Nginx非常快地接受连接,因此该值通常不需要非常大,但默认值非常低,因此如果您拥有高流量网站,则添加此值是个好主意。如果设置太低,那么您可以在内核日志中看到错误消息,然后您应该增加此值,直到没有错误消息。注意:如果将其设置为大于512的值,则应通过匹配listen命令的backlog参数的值来更改Nginx配置。Net.core.netdev_max_backlog设置NIC在切换到CPU之前缓冲数据包的速率。对于带宽较高的机器,可能需要增加此值。检查NIC文档以获取建议,或检查内核日志中是否有错误消息。
文件描述符
文件描述符是一种操作系统资源,用于处理连接和打开文件等操作。对于每个连接,Nginx最多可以使用两个文件描述符。例如,如果将Nginx用作代理,则其中一个用于客户端连接,另一个用于连接到代理服务器。如果使用HTTP keepalive,连接描述符的使用将少得多。对于具有大量连接的系统,可能需要调整以下设置:
Sys.fs.file_max这是系统范围的文件描述符限制。
Nofile这是用户级文件描述符限制,在/etc/security/limits.conf文件中配置
临时港口
当Nginx用作代理时,与上游服务器的每个连接都使用临时端口。
Net.ipv4.ip_local_port_range用于指定可以使用的起始和结束端口号。如果您看到端口耗尽,则可以增加此范围。常用设置为1024到65000。
Net.ipv4.tcp_fin_timeout用于指定另一个连接可以再次使用不再使用的端口的时间。通常,此值默认为60秒,但可以安全地减少到30秒甚至15秒。
Nginx配置
以下是一些可能影响性能的Nginx指令。如前所述,我们仅讨论建议大多数用户调整的说明。如果没有Nginx团队的指导,不建议使用此处未提及的任何说明。
工作过程
Nginx可以运行多个工作进程,每个进程都能够处理大量连接。您可以使用以下说明控制工作进程的数量以及如何处理连接:
Worker_processes它控制Nginx运行的工作进程数。在大多数情况下,运行工作进程的CPU核心可以很好地工作。您可以将此指令设置为auto以达到与CPU核心数匹配的工作进程数。有时,您可以增加此值,例如当工作进程需要处理大量磁盘IO操作时。该值默认为1。
Worker_connections这表示每个工作进程可以同时处理的最大连接数。默认值为512,但大多数系统可以处理更大的值。应该设置多少这个值取决于服务器硬件配置和流量的特征,这可以通过测试发现。保活
持久连接可以减少打开和关闭连接所需的CPU和网络开销,从而对性能产生重大影响。 Nginx终止所有客户端连接,并与上游服务器具有单独的连接。 Nginx支持客户端和上游服务器之间的持久连接。以下说明涉及客户端持久连接:
Keepalive_requests这表示客户端可以在单个持久连接上发送的请求数。默认值为100,可以设置为更高的值,这在负载生成器从单个客户端发送大量请求的测试方案中很有用。
Keepalive_timeout表示空闲持久连接保持打开的时间。
以下说明涉及上游持久连接:
Keepalive它指定每个工作进程连接到上游服务器的空闲持久连接数。此命令没有默认值。
要启用到上游的持久连接,您需要添加以下指示信息:
Proxy_http_version 1.1;
Proxy_set_header连接'';
访问日志
减少每个请求记录CPU和IO周期的影响的一种方法是启用访问日志缓冲。这将导致Nginx缓冲一系列日志条目,然后将文件写入一次而不是单次写入。
可以通过指定access_log指令的'buffer=size'选项打开访问日志缓冲区,该选项指定要使用的缓冲区的大小。您还可以使用'flush=time'选项告诉Nginx将缓冲区中的条目写入文件的时间。
定义这两个选项后,当缓冲区无法适应下一个日志,或者缓冲区中的条目超过flush参数指定的时间时,Nginx会将缓冲区中的条目写入日志文件。当工作进程重新打开日志文件或关闭时,缓冲区中的条目也会写入该文件。也可以完全禁用访问日志记录。
发送文件
Sendfile是一种可在Nginx上启用的操作系统功能。它可以通过将数据从一个文件描述符复制到内核中的另一个文件描述符来实现零TCP拷贝,从而提供更快的TCP数据传输。 Nginx可以使用这种机制将缓存或磁盘内容写入套接字,而无需从内核空间切换到用户空间,因此它非常快并且使用较少的CPU开销。由于数据从不接触用户空间,因此无法将需要访问数据的过滤器插入到处理链中。您不能使用任何需要更改内容的Nginx过滤器,例如gzip过滤器。默认情况下,Nginx不启用此机制。限制
Nginx和Nginx Plus允许您设置各种限制来控制客户端资源消耗,以防止系统性能和用户体验和安全性。以下是一些相关说明:
Limit_conn/limit_conn_zone这些指令可用于限制Nginx允许的连接数,例如来自单个客户端IP地址的连接数。这可以防止单个客户端打开太多连接并消耗太多资源。
Limit_rate这用于限制客户端在单个连接上允许的带宽。这可以防止某些客户端导致系统过载,从而有助于为所有客户端提供QoS保证。
Limit_req/limit_req_zone这些指令可用于限制Nginx请求处理的速率。与limit_rate一起,它可以防止一些客户端导致系统过载,这有利于为所有客户端提供QoS保证。这些说明还可用于增强安全性,特别是对于登录页面,通过限制请求的速率,使其适合人类用户,以及减慢尝试访问您的应用程序的程序。
Max_conns用于同时限制上游组中单个服务器的最大连接数。这可以防止上游服务器过载。默认值为0,表示没有限制。
队列如果设置了max_conns,则queue指令用于确定无法处理请求时发生的情况,因为上游组中没有可用的服务器,或者服务器是否达到max_conns限制。此命令用于设置将排队的请求数和时长。如果未设置此命令,则不会出现排队行为。
其他考虑
Nginx还具有一些可用于提高Web应用程序性能的功能。这些特征通常不会出现在调优讨论中,但有必要提及它们,因为它们的影响可能相当大。我们将讨论其中两个功能。
高速缓存
对于针对一组Web服务器或应用程序服务器进行负载平衡的Nginx实例,启用缓存可以显着减少响应时间,同时显着减少后端服务器上的负载。缓存本身是一个主题,这里不再讨论。