NGINX性能优化(nginx性能调整)
1. 简介
NGINX是一个常见的跨平台多用途服务器。因此,它可以链接内部或外部网络的许多部分,传输和提供对文件和动态数据的访问。事实上,它还可以用作负载均衡器,确保可用性。为此,我们可能需要配置延迟时间以避免 504 网关超时和 408 请求超时等错误。
在本文中,我们将探讨超时以及在 NGINX 中设置和禁用不同超时的方法。首先,我们解释如何在 NGINX 配置中添加选项。之后,我们枚举并描述 NGINX 超时类型和设置。最后,我们展示了一个代码片段来有效地禁用常见超时。
2. 配置 NGINX
超时是给定进程终止的时间段。虽然这可能是实际的 Linux 进程 ID (PID),但超时是一个一般概念。
由于NGINX可以以许多不同的容量提供服务,因此我们可能想要设置的超时可能取决于我们的目标功能。在这里,所有超时都以秒为单位,但我们也可以使用 NGINX 时间单位:
- ms – 毫秒
- s – 秒
- m – 分钟
- h – 小时
- d – 天
- w – 周
- M – 月, 30 天
- y – 年, 365 天
至关重要的是,对于某些设置,使用 0 会立即超时,因此设置不太可能的高值(如 9999999 或简单的 1y)通常是禁用它们的方法。
为了设置选项,我们修改了NGINX配置文件。最佳实践告诉我们不应该直接更改nginx.conf,而应该在conf.d中创建.conf文件,通常在/etc/nginx中:
ls /etc/nginx/conf.d
xopt.conf
我们讨论的几乎所有选项都可以在三个块中的任何一个中设置:
- 主http block
- server block
- location block
为此,我们只需在空格后添加适当的名称及其参数值,并以 ; 分号结束:
cat /etc/nginx/conf.d/xopt.conf
http {
send_timeout 1800;
}
任何修改后,我们可以检查配置文件语法:
nginx -t -c /etc/nginx/conf.d/xopt.conf
nginx: the configuration file /etc/nginx/conf.d/xopt.conf syntax is ok
nginx: configuration file /etc/nginx/conf.d/xopt.conf test is successful
在这种情况下,nginx 的 -t 标志测试由 -c 指定的文件(通常默认为 /etc/nginx/nginx.conf)。
最后,我们重新加载NGINX:
nginx -s reload
[OR]
systemctl reload nginx
[OR]
service nginx reload
3. 基本 NGINX 超时
几个NGINX超时是基本的,而且相当普遍:
- client_body_timeout – 读取客户端请求正文的最长时间(连续读取之间)(默认值为 60,可能导致 408 请求超时)
- client_header_timeout – 读取客户端请求标头的最长时间(默认值 60,可能导致 408 请求超时)
- keepalive_timeout – 客户端连接在服务器上保持的最长时间(必需的第一个参数,默认值 75,0 禁用),以及保持活动状态的值:timeout=time(可选的第二个参数,默认值 60)
- lingering_timeout – 如果 lingering_close 处于打开状态,则设置更多客户端数据到达的最长时间(默认值 5),它读取并忽略该时间,重复该循环,最长时间为 lingering_time(默认值 30)
- send_timeout – 将响应发送回客户端时的最长时间(连续写入之间)(默认值为 60)
此外,名称解析可能是许多问题的罪魁祸首。通过设置resolver_timeout,我们可以限制或增加使用 NGINX 时解析名称的最长时间(默认为 30)。
此外,ssl_session_timeout是客户端重用 SSL 会话参数的最长时间(默认为 5m)。
以上所有内容都会影响大多数连接。现在,让我们继续讨论一些细节。
4. NGINX 低级 TCP 超时
在较低级别,侦听指令具有用于配置 TCP 侦听套接字的so_keepalive参数。换句话说,通过将其设置为开或关,我们SO_KEEPALIVE启用保持连接机制。
对于支持的操作系统,我们还可以提供以冒号分隔的选项列表:
- keepidle– 设置TCP_KEEPIDLE
- keepintvl – 设置TCP_KEEPINTVL
- keepcnt – 设置TCP_KEEPCNT
另一方面,跳过这些参数中的任何一个都会使系统保持默认值。
5. 服务器
服务器指令具有上游模块提供的自己的参数。其中之一是 fail_timeout,它设置在考虑服务器不可用(默认值 1)之前尝试max_fails(默认值 0, 10 禁用)服务器联系的最长时间。在进行任何重试之前,此状态将保持相同的时间段。如果我们只有一个服务器,则忽略这些选项。
6. NGINXproxy_*超时
NGINX 有三个常见的代理服务器超时值:
- proxy_connect_timeout – 连接到代理服务器的最长时间(默认值为 60,通常低于 75)
- proxy_read_timeout – 读取代理服务器响应的最长时间(两次读取之间)(默认值为 60)
- proxy_send_timeout – 发送代理服务器请求的最长时间(两次写入之间)(默认为 60)
此外,还有一个proxy_cache_lock_timeout,用于定义在打开proxy_cache_lock(默认关闭)时阻止同时缓存请求的最长时间(默认值 5)。过时缓存也可能取决于此超时值。
7. NGINXfastcgi_*超时
当然,NGINX 还提供了 FastCGI 服务器传输约束设置:
- fastcgi_connect_timeout – 连接 FastCGI 服务器的最长时间(默认为 60,通常低于 75)
- fastcgi_read_timeout – 读取 FastCGI 服务器响应的最长时间(两次读取之间)(默认为 60)
- fastcgi_send_timeout – 发送 FastCGI 服务器请求的最长时间(两次写入之间)(默认为 60)
同样,
fastcgi_cache_lock_timeout定义在fastcgi_cache_lock(默认关闭)处于打开状态时阻止同时缓存请求(默认值 5)的最长时间。此外,与 proxy_* 设置类似,过时的缓存可能取决于此超时值。
8. NGINXmemcached_*超时
对于Memcached,NGINX提供了与代理和FastCGI类似的选项:
- memcached_connect_timeout – 与 memcached 服务器连接的最长时间(默认为 60,通常低于 75)
- memcached_read_timeout – 读取 memcached 服务器响应的最长时间(两次读取之间)(默认为 60)
- memcached_send_timeout – 发送 memcached 服务器请求的最长时间(写入之间)(默认为 60)
当然,在这种情况下,我们没有缓存锁。
9. 禁用常见的 NGINX 超时
虽然其他模块也存在类似的设置,但一般来说,为了有效地禁用常见超时选项的效果,我们可以在 http 或服务器块中使用设置列表:
keepalive_timeout 1d;
send_timeout 1d;
client_body_timeout 1d;
client_header_timeout 1d;
proxy_connect_timeout 1d;
proxy_connect_timeout 1d;
proxy_read_timeout 1d;
proxy_send_timeout 1d;
fastcgi_connect_timeout 1d;
fastcgi_read_timeout 1d;
fastcgi_send_timeout 1d;
memcached_connect_timeout 1d;
memcached_read_timeout 1d;
memcached_send_timeout 1d;
在所有情况下,我们将时间段设置为一天。因此,使用这些设置可能会严重降低性能。
10. 总结
在本文中,我们讨论了超时和 NGINX 超时设置。总之,虽然NGINX提供了许多选项来更改不同的超时,但更改正确的超时对于优化性能至关重要。