要实现nginx负载均衡压力测试记录,需自定义log_format记录$upstream_addr、$upstream_response_time等字段,配合wrk等工具发起带标识的并发请求,并让后端返回x-backend-process-time与$request_id,最终通过日志聚合分析各节点调用量、响应延迟及错误状态。

要实现 Nginx 负载均衡器对后端服务器的流量压力测试记录,核心在于两方面:一是构造真实、可控的压测流量;二是让 Nginx 和后端服务共同留下可分析的日志痕迹,便于还原请求分发路径与压力分布。
配置 Nginx 记录详细上游信息
Nginx 默认 access_log 不包含后端服务器地址和响应时间等关键负载指标。需自定义 log_format,并在 location 或 upstream 块中启用:
- 在 http 块中定义日志格式,例如:
log_format upstream_log '[$time_local] $remote_addr - $request_method $scheme://$host$request_uri '
'"$status" $body_bytes_sent "$http_referer" "$http_user_agent" '
'$upstream_addr $upstream_response_time $upstream_status $request_time'; - 在 server 或 location 块中引用该格式:
access_log /var/log/nginx/upstream_access.log upstream_log; - $upstream_addr 显示实际转发到的后端 IP:PORT(支持多个,用逗号分隔);
$upstream_response_time 是 Nginx 等待该后端响应的时间(秒,精度毫秒);
$request_time 是整个请求从读取首字节到日志写入的总耗时。
使用压测工具模拟多路并发请求
推荐使用 wrk、ab 或 hey,它们轻量、支持长连接与定制 header,便于验证负载策略:
- 用 wrk 模拟 100 并发、持续 30 秒的 GET 请求:
wrk -t4 -c100 -d30s http://your-nginx-domain/api/test - 若需区分压测来源,可在请求头中添加标识:
wrk -H "X-Loadtest-ID: stress-v1" -t4 -c100 ...
然后在 Nginx log_format 中加入 $http_x_loadtest_id,便于后续从日志中筛选压测流量。 - 避免单点瓶颈:确保压测机与 Nginx、后端服务之间网络通畅,禁用客户端连接复用限制(如 ab 的 -k 参数慎用,可能掩盖连接建立压力)。
后端服务同步打点,对齐请求生命周期
仅靠 Nginx 日志无法判断后端是否处理超时、异常或内部排队。建议后端在收到请求时记录 trace_id、接收时间、处理开始/结束时间:
- 在响应 Header 中返回处理耗时,例如:
X-Backend-Process-Time: 127.4ms - Nginx 可通过 proxy_pass_headers 或 add_header 将其透传回客户端,或写入日志:
log_format ... '$upstream_http_x_backend_process_time'; - 配合唯一请求 ID(如通过 Nginx 注入 $request_id),可将 Nginx 日志与后端应用日志按 ID 关联,精准定位某次慢请求是卡在网络、Nginx 转发,还是后端逻辑。
聚合分析与关键指标提取
压测结束后,从日志中提取核心指标辅助评估负载均衡效果:
- 按 $upstream_addr 统计各后端被调度次数及平均 $upstream_response_time,验证轮询/加权是否生效;
- 统计 $request_time > 1s 的请求数占比,结合 $upstream_response_time 判断延迟主要来自哪一环;
- 检查 $upstream_status(如 502/504)出现频次,识别后端宕机或超时未及时摘除问题;
- 用 awk + sort + uniq 快速生成简要报告,例如:
awk '{print $11}' /var/log/nginx/upstream_access.log | sort | uniq -c | sort -nr
($11 对应 $upstream_addr 字段,用于查看各节点调用量)











