Nginx轮询按请求而非连接调度:短连接每次请求均轮询,分发均匀;长连接首次请求轮询,后续同连接请求粘滞原后端,新连接仍轮询。需结合日志、抓包与多工具测试验证混合场景下的分发效果。

在 Nginx 的轮询(round-robin)负载均衡模式下,测试长连接与短连接混合调度效果,核心是验证连接复用是否影响后端节点的请求分发均匀性,以及 Nginx 是否仍能按预期轮询分发新连接或新请求。
理解关键前提:长连接 vs 短连接对轮询的影响
Nginx 的 upstream round-robin 默认按「请求」(request)轮询,不是按「连接」(connection)轮询。这意味着:
- 短连接(每次请求建连 + 关闭):每个请求都触发一次轮询选择,分发非常均匀;
- 长连接(keepalive,复用 TCP 连接发送多个 HTTP 请求):同一连接内的后续请求,默认由同一个 upstream server 处理(Nginx 不在连接内做重调度),这会「弱化」轮询效果;
- 但长连接本身仍会参与上游连接池的初始选择——即首次请求走轮询,后续同连接请求「粘滞」在该后端,直到连接关闭或超时。
搭建可观察的测试环境
需要清晰区分后端响应、连接行为和 Nginx 调度路径:
- 启动至少 2 个带唯一标识的后端服务(如用 Python Flask 或 netcat 模拟),返回自身地址或序号(如
Server: backend-1); - Nginx 配置启用
keepalive并合理设置超时:
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
keepalive 32; # 连接池大小
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_keepalive_requests 100;
proxy_keepalive_timeout 60s;
}
}- 确保客户端支持 HTTP/1.1 keepalive(curl 默认开启,但需显式复用连接)。
设计两类对比测试用例
用不同连接模式发起相同请求数量,观察后端日志或响应头分布:
-
短连接测试:用 curl 循环发起独立请求(禁用复用):
for i in {1..20}; do curl -s http://localhost/ | grep Server; done
→ 应看到近似 10:10 的均匀分布(忽略初始抖动); -
长连接测试:用单个 curl 复用连接发多个请求:
curl -sH "Connection: keep-alive" --http1.1 -H "Host: localhost" http://localhost/ http://localhost/ http://localhost/
或用ab -n 30 -c 1 -k http://localhost/(-k 表示 keepalive);
→ 观察前几个请求是否集中落在同一后端(因复用首个连接),而新连接(如新开 ab 进程)仍会轮询; - 进阶:用
wrk -t1 -c10 -d5s -H "Connection: keep-alive" http://localhost/模拟多连接+长连接混合场景,统计各后端响应次数。
抓包与日志辅助验证
仅看响应不够直观,建议结合:
- Nginx 开启
log_format记录 upstream 地址:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr"';
→ 直接从 access.log 查看每次请求实际转发到哪个后端; - 用
tcpdump -i lo port 8001 or port 8002抓包,确认 TCP 连接建立频次与请求频次的关系; - 检查后端连接数(
ss -tn src :8001 | wc -l),长连接下活跃连接数远小于请求数,但连接生命周期内请求堆积在单节点。


















