Nginx以高性能负载均衡、缓存和web服务器着称,支持全球40%最繁忙的网站。在大多数使用场景下,Nginx和Linux系统的默认配置表现良好,但仍需要进行一些调优以达到最佳性能。本文讨论了在调整系统时要考虑的一些Nginx和Linux配置。这样的配置有很多,但在本文中我们只介绍适合大多数用户的配置。那些没有涵盖的配置只有深入了解Nginx和Linux的人才会考虑,或者由Nginx专家服务团队推荐。Nginx专家服务,已与世界上一些繁忙的网站合作,调优Nginx以达到最佳性能,可以为任何需要充分发挥系统能力的客户提供支持。简介本文假设读者对Nginx架构和配置概念有基本的了解。本文不重复Nginx文档的内容,而是概述各种配置选项并提供相关文档的链接。调整时,一个好的规则是一次只更改一个配置项。如果修改后没有性能提升,则恢复原值。让我们先讨论Linux调优,因为一些值会影响Nginx配置中可用的值。Linux配置现代Linux内核(2.6+)针对各种配置进行了很好的调整,其中一些您可能想要更改。如果操作系统配置太低,您会在内核日志中看到错误信息,因此需要调整这些配置。Linux的配??置项很多,本文仅提及在正常工作负载下最有可能需要调优的配置项。如果您需要有关这些配置的详细信息,请参阅您的Linux文档。积压队列以下设置与连接及其排队方式直接相关。如果传入连接的速率很高并且性能级别不同,例如当某些连接似乎已挂起时,更改这些配置可能会有用。net.core.somaxconn此项设置等待被Nginx接受的连接队列大小。由于Nginx接受连接非常快,这个值通常不需要很大,但默认值很低,所以如果你有一个高流量的网站,增加这个值是个好主意。如果它设置得太低,那么你可以在内核日志中看到错误消息,那么你应该增加这个值直到没有错误消息。注意:如果将其设置为大于512的值,还应更改Nginx配置以将此值与listen命令的backlog参数相匹配。net.core.netdev_max_backlog这设置了NIC在将数据包移交给CPU之前缓冲数据包的速率。对于带宽较高的机器,可能需要增加此值。查看NIC文档以获取建议,或查看内核日志以获取错误消息。文件描述符文件描述符是一种操作系统资源,用于连接和打开文件等操作。对于每个连接,Nginx最多可以使用两个文件描述符。例如,如果使用Nginx作为代理,一个用于客户端连接,另一个用于连接到被代理的服务器。如果使用HTTPkeepalive,连接描述符的使用就会少得多。对于具有大量连接的系统,可能需要调整以下设置: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,但大多数系统可以处理更大的值。这个值应该设置多少取决于服务器的硬件配置和流量的特点,可以通过测试发现。Keepalive通过减少打开和关闭连接所需的CPU和网络开销,对性能产生重大影响。Nginx终止所有客户端连接,并与上游服务器建立单独连接。Nginx支持客户端和上游服务器之间的持久连接。以下指令涉及客户端持久连接:keepalive_requests这表示客户端可以在单个持久连接上发送多少请求。默认值为100,可以设置更高的值,这在负载生成器从单个客户端发送大量请求的测试场景中很有用。keepalive_timeout指示空闲持久连接保持打开状态的时间。以下指令与上游持久连接相关:keepalive这指定每个工作进程与上游服务器的空闲持久连接数。该指令没有默认值。为了启用与上游的持久连接,需要添加以下指令:proxy_http_version1.1;proxy_set_headerConnection"";访问日志记录需要每个请求的CPU和IO周期。减少这种影响的一种方法是启用访问日志缓冲。这将导致Nginx缓冲一系列日志条目,然后将它们一次性写入文件,而不是一次写入。可以通过指定access_log指令的“buffer=size”选项来打开访问日志缓冲,该选项指定要使用的缓冲区的大小。您还可以使用“flush=time”选项来告诉Nginx将条目从缓冲区刷新到文件的时间。定义这两个选项后,当缓冲区不能容纳下一条日志,或者缓冲区中的条目超过flush参数指定的时间时,Nginx会将缓冲区中的条目写入日志文件。当工作进程重新打开或关闭日志文件时,缓冲区中的条目也会写入文件。也可以完全禁用访问日志记录。SendfileSendfile是一个可以在Nginx上启用的操作系统特性。它通常可以通过在内核中将数据从一个文件描述符复制到另一个文件描述符来实现零复制,从而提供更快的TCP数据传输。Nginx可以使用这种机制将缓存或磁盘内容写入套接字,而无需从内核空间到用户空间进行上下文切换,因此速度非常快,占用的CPU开销也较少。由于数据从不接触用户空间,因此不可能在需要访问数据的处理链中插入过滤器,也不能使用任何需要更改内容的Nginx过滤器,例如gzip过滤器。Nginx默认不启用此机制。限制Nginx和NginxPlus允许设置各种限制来控制客户端资源消耗,以防止系统性能、用户体验和安全受到影响。以下是一些相关指令:limit_conn/limit_conn_zone这些指令可用于限制Nginx允许的连接数,例如来自单个客户端IP地址的连接数。这可以防止单个客户端打开太多连接而消耗太多资源。limit_rate这用于限制允许客户端在单个连接上使用的带宽。这可以防止某些客户端使系统过载,从而促进所有客户端的QoS保证。limit_req/limit_req_zone这些指令可用于限制Nginx的请求处理速率。与limit_rate一起,它可以防止某些客户端使系统过载,从而有利于所有客户端的QoS保证。这些指令还可以用于增强安全性,特别是登录页面,通过限制请求率使其适合人类用户,但会减慢试图访问您的应用程序的程序。max_conns用于限制上游组中单个服务器的最大同时连接数。这可以防止上游服务器过载。默认值为0,表示没有限制。queue如果设置了max_conns,则queue指令用于确定由于上游组中没有可用服务器或这些服务器已达到max_conns限制而无法处理请求时会发生什么情况。该指令用于设置将排队多少请求以及多长时间。如果未设置此指令,则不会有排队行为。其他注意事项Nginx还具有一些可用于提高Web应用程序性能的功能。这些功能在调整讨论中并不经常出现,但值得一提,因为它们的影响也可能很大。我们将讨论其中的两个功能。缓存对于负载平衡一组Web服务器或应用程序服务器的Nginx实例,启用缓存可以显着减少响应时间并显着降低后端服务器的负载。缓存本身就是一个话题,这里不做讨论。压缩压缩响应可以大大减小响应的大小并减少带宽使用。但是,这需要CPU资源来处理压缩,因此最好在值得减少带宽使用的情况下使用。应该注意的是,您不能对已经压缩过的东西(例如jpeg图像)重新启用压缩。更多Nginx压缩配置请参考:Nginx管理指南-压缩解压
