Nginx Keepalive 连接优化指南 – wiki基地

Nginx Keepalive 连接优化指南

Nginx Keepalive 连接是提升 Web 服务器性能的关键优化技术。通过允许在单个 TCP 连接上传输多个 HTTP 请求和响应,Keepalive 显著减少了每次请求建立新连接的开销,从而降低延迟、提高资源利用率并改善用户体验。

本文将详细探讨如何优化 Nginx Keepalive 连接,包括客户端和上游服务器的配置,以及相关的系统级调优。

一、客户端 Keepalive 优化

客户端 Keepalive 设置控制着 Nginx 与最终用户浏览器或客户端之间的交互。

1. keepalive_timeout

此指令设置空闲客户端连接在服务器端保持打开状态的时间。

  • 目的:更长的超时时间允许客户端重用现有连接进行后续请求,减少了新的 TCP 握手需求。
  • 配置:通常在 httpserverlocation 块中设置。常见值为 15s65s
  • 语法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.1proxy_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_timeoutclient_header_timeout:这些指令定义了 Nginx 等待客户端发送请求体或请求头的时间。适当设置这些值有助于缓解 Slowloris 类的 DoS 攻击。
  • send_timeout:设置向客户端传输响应的超时时间。
  • 文件描述符:确保系统和 Nginx (worker_rlimit_nofile) 具有足够的文件描述符限制,因为每个连接都会占用文件描述符。
  • 内核 Keepalive 设置:Linux 内核参数,如 net.ipv4.tcp_keepalive_time,也会影响操作系统管理空闲 TCP 连接的方式。

四、最佳实践与注意事项

  • 定制化值:根据应用程序的特定特性、流量模式和预期响应时间,定制 keepalive_timeoutkeepalive_requests 的值。
  • 监控性能:持续监控应用程序性能和连接行为。像 NGINX Amplify 这样的工具可以帮助可视化指标并识别瓶颈。
  • 安全性:虽然 Keepalive 提高了性能,但持久连接可能会增加 DoS 攻击和资源耗尽的脆弱性。
    • 通过设置合理的超时和请求限制来降低风险。
    • 使用 Nginx 的 limit_reqlimit_conn 模块实现速率限制,以防止滥用。
    • 监控异常连接模式。
  • 外部代理/负载均衡器:如果 Nginx 位于其他代理(例如 Cloudflare)之后,请将 Nginx 的 keepalive_timeout 与上游代理的空闲超时保持一致,以避免意外的连接重置。
  • 避免常见错误:确保指令放置正确,并理解每个参数的控制作用(例如,upstream 中的 keepalive 限制的是空闲连接,而不是总连接)。

五、结论

通过仔细调整这些 Nginx 指令并考虑系统级设置,您可以显著优化 Keepalive 连接,从而实现更高效、响应更迅速的 Web 服务器。这将直接转化为更快的页面加载速度、更低的服务器资源消耗以及更优质的用户体验。

滚动至顶部