NGNIX 性能调优

NGINX是众所周知的高性能负载均衡器,缓存和Web服务器,为世界上最繁忙的网站提供40%的服务。对于大多数使用情况,默认的NGINX和Linux设置就能运行良好,但是实现最佳性能有时需要一些调整。本文讨论了调整系统时要考虑的一些NGINX和Linux设置。

你可以调整几乎任何设置,但这篇文章集中在几个设置,调谐有利于最多的用户。有一些设置,我们建议您只有在您对NGINX和Linux有深刻理解或者按照我们的支持或专业服务团队的指示进行更改,我们不在这里覆盖。专业服务团队已与世界上最繁忙的网站合作,调整NGINX以实现最高性能水平,并可与您一起充分利用您的NGINX或NGINX Plus部署。

介绍

假定对NGINX架构和配置概念有基本的了解。本文不尝试复制NGINX文档,而是提供各种选项的概述以及相关文档的链接。

调整时一个好的规则是一次更改一个设置,如果更改不能提高性能,请将其设置为默认值。

我们从讨论Linux调优开始,因为一些操作系统设置的值决定了如何调整NGINX配置。

Linux的配置调整

Linux内核(2.6)中的设置适用于大多数情况,但更改其中的一些是有益的。检查内核日志以获取指示设置过低的错误消息,并根据建议进行调整。这里我们只介绍那些在正常工作负载下最有可能受益于调整的设置。有关调整这些设置的详细信息,请参阅Linux文档。

Backlog队列

以下设置与连接及其如何排队有关。如果您的传入连接率很高,并且性能不一致(例如某些连接似乎停滞),则更改这些设置可能有所帮助。

  • net.core.somaxconn - 可以排队等待NGINX接受的最大连接数。默认值通常非常低,这通常是可接受的,因为NGINX接受连接很快,但如果您的网站流量很大,则应该增加。如果内核日志中的错误消息指示值太小,请将其改大,直到错误提示停止。
    注意:如果将此值设置为大于512,请将backlog参数更改为NGINX listen指令。

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

文件描述符

文件描述符是用于表示连接和打开文件等的操作系统资源。NGINX每个连接最多可以使用两个文件描述符。例如,如果NGINX是代理,它通常使用一个文件描述符用于客户端连接,另一个用于到代理服务器的连接,尽管如果使用HTTP Keepalive,这个比率要低得多。对于服务大量连接的系统,可能需要调整以下设置:

  • 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_requests - 客户端可以通过单个长连接发出的请求数。默认值为100,但是使用负载生成工具从单个客户端发送大量请求进行测试时,设置更高的值尤其有用。

  • keepalive_timeout - 空闲长连接保持打开状态的时间。

下面是和上游服务器长连接的相关指令:

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

要使用连接到上游服务器的长连接,必须要配置文件中下面的指令。

proxy_http_version 1.1;
proxy_set_header Connection "";

访问日志

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

要启用访问日志缓冲,请在 access_log 指令中包含 buffer=size 参数; 当缓冲区达到 size 值时,NGINX将缓冲区内容写入日志。要使NGINX在指定的时间量后写入缓冲区,请包含 flush=time 参数。当两个参数都设置时,当下一个日志条目超出缓冲区值或缓冲区中的条目比指定时间早时,NGINX将条目写入日志文件。当工作进程重新打开其日志文件或关闭时,也会写入日志条目。要完全禁用访问日志记录,请在 access_log 指令中包含 off 参数。

Sendfile

操作系统的 sendfile() 系统调用将数据从一个文件描述符复制到另一个文件描述符,通常实现零复制,这可以加速TCP数据传输。要使NGINX能够使用它,请在 http 上下文或 serverlocation上下文中包含sendfile指令。然后,NGINX可以不将任何上下文切换到用户空间,就将缓存或磁盘内容写入到socket,所以写入非常快速,消耗较少的CPU周期。但请注意,由于使用sendfile()复制的数据绕过了用户空间,因此不受常规NGINX处理链和过滤器(如gzip)的影响。当配置上下文包含sendfile指令和激活内容更改过滤器的指令时,NGINX会自动禁用该上下文的sendfile。

限制

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

  • limit_connlimit_conn_zone - 限制NGINX接受的客户端连接数,例如从单个IP地址的连接。设置它们可以帮助防止单个客户端打开太多的连接并消耗超过它们的资源。

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

  • limit_reqlimit_req_zone- 限制NGINX正在处理的请求的速率,这与设置 limit_rate 具有相同的好处。通过限制请求速率为合理值,它们还可以提高安全性,特别是对于登录页面,但是对于通过程序来尝试请求来压倒应用程序的还是太慢(例如DDoS攻击中的bots)。

  • max_conns 上游配置块中的服务器指令 - 设置上游组中服务器接受的最大并发连接数。使用这个限制可以防止上游服务器过载。将值设置为0(默认值)表示没有限制。

  • queue (NGINX Plus) - 创建一个队列,用于存放上游组中的所有可用服务器都达到其 max_conns 限制时的请求。此指令设置可以队列中的最大请求数,并且可选地设置返回错误之前等待的最大时间(默认为60秒)。如果忽略此指令,请求不会放入队列中。

缓存和压缩可以提高性能

NGINX的一些额外功能可用于提高Web应用程序的性能,它调优的时候程序可以不用关掉,但值得一提,因为它们的影响可能相当大。它们包括缓存和压缩。

缓存

在一组Web或应用程序服务器负载平衡NGINX实例上启用缓存,可以显着缩短对客户端的响应时间,同时显着降低后端服务器的负载。缓存是它自己的一个话题,我们不会试图在这里覆盖。请参见“NGINX Plus管理指南”中的“NGINX内容缓存”。

压缩

压缩发送到客户端的响应可以大大减少其大小,因此它们使用较少的网络带宽。然而,因为压缩数据会消耗CPU资源,所以当真正值得减少带宽使用时,它是最有用的。重要的是要注意,您不应该对已经压缩的对象(例如JPEG文件)启用压缩。有关更多信息,请参阅“NGINX Plus管理指南”中的压缩和解压缩

了解更多:

原文:
Tuning NGINX for Performance

如需转载,请注明出处: https://chadou.me/p/202

最新发布