7.3.4 连接与超时参数调优

连接与超时参数调优是反向代理与负载均衡中最直接影响稳定性与用户体验的环节。合理的连接管理可以在高并发下保持吞吐、降低延迟,同时避免因后端抖动引发的大面积超时与资源耗尽。

原理草图:连接与超时在链路中的位置#

文章图片

关键连接参数与作用#

  • worker_connections:单个工作进程可处理的最大连接数,决定并发上限。实际并发≈worker_processes×worker_connections。
  • keepalive_timeout:客户端长连接空闲超时,过大易占用连接,过小会频繁握手。
  • keepalive_requests:单连接可处理的最大请求数,控制连接复用程度。
  • client_header_timeout / client_body_timeout:接收请求头/体的超时,防御慢速请求。
  • send_timeout:向客户端发送响应的超时。
  • proxy_connect_timeout:与后端建立连接的超时。
  • proxy_send_timeout / proxy_read_timeout:向后端发送请求/读取响应的超时。
  • upstream keepalive:与后端保持长连接,降低连接建立开销。
  • proxy_next_upstream:后端失败时的重试策略,避免无意义重试造成雪崩。

安装与环境准备(示例)#

以下以 Ubuntu 为例,安装 Nginx 并确认编译参数:

# 安装
sudo apt update
sudo apt install -y nginx

# 查看版本与编译参数(确认是否有模块支持)
nginx -V

# 预期效果:输出包含 --with-http_stub_status_module 等模块信息

调优原则与常见策略#

  1. 按业务流量与后端能力定上限
    先估算峰值QPS与平均响应时间,确保连接上限覆盖峰值。后端连接池与并发能力决定上游keepalive数量与超时阈值。
  2. 缩短前端空闲连接,稳定后端连接
    对客户端保持适中keepalive_timeout(如30~60s),对后端启用upstream keepalive以减少握手开销。
  3. 超时分层设置
    proxy_connect_timeout较短(1~3s),proxy_read_timeout依据业务响应时间设置(如10~60s)。避免全局过大掩盖后端故障。
  4. 防慢速攻击与资源耗尽
    client_header_timeout与client_body_timeout建议设置为较小值(5~15s),并配合limit_conn/limit_req。
  5. 避免过度重试
    proxy_next_upstream次数不宜过多(1~2次),避免雪崩扩散。

典型配置示例(可直接使用)#

# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;

events {
    worker_connections 65535;
}

http {
    # 客户端超时
    keepalive_timeout 30s;
    keepalive_requests 1000;
    client_header_timeout 10s;
    client_body_timeout 10s;
    send_timeout 30s;

    # upstream 连接池
    upstream backend {
        server 10.0.0.11:8080 max_fails=2 fail_timeout=10s;
        server 10.0.0.12:8080 max_fails=2 fail_timeout=10s;
        keepalive 200;
    }

    server {
        listen 80;

        location / {
            proxy_http_version 1.1;
            proxy_set_header Connection "";

            proxy_connect_timeout 2s;
            proxy_send_timeout 10s;
            proxy_read_timeout 30s;

            proxy_next_upstream error timeout http_500 http_502 http_503;
            proxy_next_upstream_tries 2;

            proxy_pass http://backend;
        }
    }
}

配置生效与验证(命令与解释)#

# 检查配置语法
sudo nginx -t
# 预期效果:syntax is ok, test is successful

# 平滑重载
sudo systemctl reload nginx

# 查看当前连接状态(需启用stub_status)
curl -s http://127.0.0.1/nginx_status
# 预期效果:显示Active connections等统计

启用 stub_status 的最小示例:

# /etc/nginx/conf.d/status.conf
server {
    listen 127.0.0.1:80;
    location /nginx_status {
        stub_status;
        allow 127.0.0.1;
        deny all;
    }
}

压测与超时验证示例#

# 使用ab进行压测(安装:sudo apt install -y apache2-utils)
ab -n 2000 -c 200 http://127.0.0.1/
# 关注 Failed requests 与 Time per request

排错步骤(命令与预期)#

# 查看Nginx错误日志
sudo tail -f /var/log/nginx/error.log
# 关注:upstream timed out, connect() failed (111: Connection refused)

# 查看后端端口是否可达
nc -zv 10.0.0.11 8080
# 预期:succeeded,若失败需检查后端服务与防火墙

常见问题与处理#

  • 频繁出现502/504:检查proxy_connect_timeout与后端连接能力,评估后端是否慢启动或拥塞;适当提高proxy_read_timeout。
  • 连接数暴增但吞吐不升:keepalive_timeout过大或客户端长连接滥用;限制keepalive_requests并启用limit_conn。
  • 请求偶发超时:proxy_read_timeout过短或后端业务存在长尾耗时;结合后端APM确认耗时分布。

练习与实践#

  1. keepalive_timeout 分别设置为 10s、30s、60s,使用 ab -n 1000 -c 100 对比吞吐与错误率。
  2. 人为停止一个后端节点(关闭8080服务),观察 proxy_next_upstream 是否生效,记录502/504数量变化。
  3. 增加 proxy_read_timeout 至 60s,并在后端模拟慢响应(sleep 20s),验证是否仍会超时。