Nginx Keepalive 连接优化指南
Nginx Keepalive 连接是提升 Web 服务器性能的关键优化技术。通过允许在单个 TCP 连接上传输多个 HTTP 请求和响应,Keepalive 显著减少了每次请求建立新连接的开销,从而降低延迟、提高资源利用率并改善用户体验。
本文将详细探讨如何优化 Nginx Keepalive 连接,包括客户端和上游服务器的配置,以及相关的系统级调优。
一、客户端 Keepalive 优化
客户端 Keepalive 设置控制着 Nginx 与最终用户浏览器或客户端之间的交互。
1. keepalive_timeout
此指令设置空闲客户端连接在服务器端保持打开状态的时间。
- 目的:更长的超时时间允许客户端重用现有连接进行后续请求,减少了新的 TCP 握手需求。
- 配置:通常在
http、server或location块中设置。常见值为15s到65s。 - 语法:
keepalive_timeout 15s 15s;第一个值是服务器超时时间,可选的第二个值通过Keep-Alive: timeout=响应头发送给客户端,告知客户端超时时间。 - 注意事项:
- 设置过高可能导致大量空闲套接字,占用文件描述符和
worker_connections,在高并发下可能使工作进程资源耗尽。 - 设置过低会增加重新连接的频率和
TIME_WAIT压力。 - 根据应用程序的典型页面加载时间和用户行为调整此值。
- 设置过高可能导致大量空闲套接字,占用文件描述符和
2. keepalive_requests
此指令指定单个 Keepalive 连接可以处理的最大请求数。
- 目的:在达到此请求数后,连接将被关闭。这对于释放每个连接的内存分配是必要的。
- 配置:
keepalive_requests 1000;(默认值为 100)。 - 注意事项:
- 虽然较高的值有利于负载测试,但在生产环境中,过高的值(例如 100,000)可能导致内存使用量增加。
- 最佳值应在连接重用和内存管理之间取得平衡。
二、上游 (Backend) Keepalive 优化
当 Nginx 作为反向代理时,它会与后端(上游)服务器建立单独的连接。优化这些连接对于整体性能至关重要。
1. keepalive (在 upstream 块中)
此指令设置每个工作进程保持打开状态的空闲上游服务器 Keepalive 连接数。
- 目的:它允许 Nginx 重用与后端服务器的连接,减少建立新连接的开销,并防止 Nginx 服务器上的
TIME_WAIT耗尽。 - 配置:
nginx
upstream app_backend {
server 127.0.0.1:8080;
keepalive 32; # 每个工作进程的空闲连接数
} - 注意事项:此值控制的是连接池中的空闲连接数,而不是总连接数。一个好的经验法则是将其设置为上游组中服务器数量的大约两倍。
2. proxy_http_version 1.1 和 proxy_set_header Connection ""
这些指令对于启用上游 Keepalive 至关重要。
proxy_http_version 1.1:HTTP/1.1 默认支持连接重用。proxy_set_header Connection "":这会从客户端请求中移除 “Connection” 头,允许 Nginx 管理其与上游服务器的连接行为。如果没有此设置,Nginx 和上游服务器之间的 Keepalive 将无法正常工作。- 配置:
nginx
location /api/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://app_backend;
}
三、相关 Nginx 指令与系统级优化
除了特定的 Keepalive 设置外,其他 Nginx 和系统级配置也会影响整体连接处理和性能:
worker_processes:设置为auto或 CPU 核心数以获得最佳效率。worker_connections:定义一个工作进程可以处理的最大连接数。此值与worker_processes共同决定了 Nginx 可以管理的总并发连接数。client_body_timeout和client_header_timeout:这些指令定义了 Nginx 等待客户端发送请求体或请求头的时间。适当设置这些值有助于缓解 Slowloris 类的 DoS 攻击。send_timeout:设置向客户端传输响应的超时时间。- 文件描述符:确保系统和 Nginx (
worker_rlimit_nofile) 具有足够的文件描述符限制,因为每个连接都会占用文件描述符。 - 内核 Keepalive 设置:Linux 内核参数,如
net.ipv4.tcp_keepalive_time,也会影响操作系统管理空闲 TCP 连接的方式。
四、最佳实践与注意事项
- 定制化值:根据应用程序的特定特性、流量模式和预期响应时间,定制
keepalive_timeout和keepalive_requests的值。 - 监控性能:持续监控应用程序性能和连接行为。像 NGINX Amplify 这样的工具可以帮助可视化指标并识别瓶颈。
- 安全性:虽然 Keepalive 提高了性能,但持久连接可能会增加 DoS 攻击和资源耗尽的脆弱性。
- 通过设置合理的超时和请求限制来降低风险。
- 使用 Nginx 的
limit_req和limit_conn模块实现速率限制,以防止滥用。 - 监控异常连接模式。
- 外部代理/负载均衡器:如果 Nginx 位于其他代理(例如 Cloudflare)之后,请将 Nginx 的
keepalive_timeout与上游代理的空闲超时保持一致,以避免意外的连接重置。 - 避免常见错误:确保指令放置正确,并理解每个参数的控制作用(例如,
upstream中的keepalive限制的是空闲连接,而不是总连接)。
五、结论
通过仔细调整这些 Nginx 指令并考虑系统级设置,您可以显著优化 Keepalive 连接,从而实现更高效、响应更迅速的 Web 服务器。这将直接转化为更快的页面加载速度、更低的服务器资源消耗以及更优质的用户体验。