直接压测长轮询接口可验证least_conn是否按“谁空闲就给谁”调度,核心是观察其能否避开连接堆积节点;需部署至少两台后端(每台sleep 5–10秒)、启用http/1.1 keep-alive、配置upstream的least_conn与keepalive 32、透传connection头,并用wrk长连接压测,通过stub_status和access log验证连接数实时均衡性。

直接压测长轮询接口,就能真实看到 least_conn 是不是在按“谁空闲就给谁”的逻辑调度。它不看响应快慢,只盯每个后端当前有多少没关的连接,所以测试核心是:能不能避开连接堆积的节点。
搭一个靠谱的长耗时后端环境
至少准备两台后端服务,每台提供一个能稳定模拟长等待的 HTTP 接口:
- 返回前 sleep 5–10 秒(比如用 Python Flask 或 FastAPI 写个 /lp 接口,加 time.sleep(7))
- 必须用 HTTP/1.1 + keep-alive,禁用短连接——否则连接秒建秒断,活跃数永远接近 0,least_conn 就失效
- 后端别主动快速断连,例如 Tomcat 关掉 linger,Uvicorn 设置 --keep-alive 5,避免 Nginx 误判连接已释放
配对的 Nginx upstream 要写全关键项
光写 least_conn; 不够,必须搭配连接复用和头透传:
- upstream 块第一行必须是 least_conn;,后面紧跟 server 行
- 加上 keepalive 32;(建议值 32–100),让空闲连接可复用,连接数统计才真实
- 在 proxy_pass 所在的 location 里写:proxy_http_version 1.1; 和 proxy_set_header Connection '';
- 每个 server 行后补上健康检查,比如 max_fails=2 fail_timeout=10s;,防止卡死节点还在收请求
用长连接工具压测并观察分发行为
别用 ab 或 curl 单次请求,要模拟真实用户持续建立新长连接:
- 用 wrk 发起 100+ 并发,脚本保持连接直到后端返回(例如 wrk -t4 -c100 -d60s http://domain/lp)
- 压测跑 30–60 秒期间,持续有新连接进来,观察各后端 access log 的请求数分布
- 对比轮询配置:least_conn 下,当某台后端因 sleep 卡住、连接数涨上去后,新请求应明显转向另一台
查 stub_status 确认连接数是否实时均衡
在 Nginx 配置里开 stub_status,访问 /nginx_status 查每台 server 的活跃连接数:
- 压测前记下初始 conn_active 值;压测中刷新看变化趋势
- 如果某台连接数一直比其他高一截,先检查 max_conns 是否设得太小,或 keepalive 值过大导致空闲连接占满“名额”
- 再核对后端机器的 ss -an | grep :8080 | grep ESTAB | wc -l,确认 Nginx 统计和实际 TCP 连接一致











