Nginx压测调优需借助wrk/ab等外部工具发起压力,配合Shell/Python脚本自动采集QPS、P95/P99延迟及stub_status指标,生成结构化报告并对比调优效果。

在 Nginx 环境中做压测调优,核心不是“让 Nginx 运行脚本”,而是用外部工具对 Nginx 服务发起压力,再通过脚本自动采集、对比调优前后的关键指标(如吞吐量 QPS、P95/P99 响应延迟)。Nginx 本身不内置压测能力,但可配合标准工具 + Shell/Python 脚本实现闭环自动化。
用 wrk 或 ab 搭配 Shell 脚本快速压测
wrk 是现代高并发压测首选,轻量、支持 Lua、结果清晰;ab(Apache Bench)更简单但单线程瓶颈明显。推荐用 wrk,搭配 Shell 脚本封装常用场景:
- 写一个
benchmark.sh,接受参数:URL、持续时间、并发数、是否记录结果 - 每次运行前清空系统缓存(
sync && echo 3 > /proc/sys/vm/drop_caches),减少干扰 - 用
wrk -t4 -c100 -d30s http://localhost:80/测基础 QPS,提取输出中的Requests/sec和Latency行 - 用
grep -oE 'Requests/sec:[[:space:]]*[0-9.]+' | awk '{print $2}'提取数值,存入 CSV 文件
自动采集 Nginx 自身指标辅助分析
Nginx 的 stub_status 模块或 nginx-module-vts 可暴露实时连接、请求计数等,但不直接提供延迟分布。需配合压测工具使用:
- 启用
stub_status(需编译时含该模块,配置中加location /status { stub_status; }) - 压测中每 5 秒 curl 一次
http://localhost/status,记录Active connections和requests累计值,计算单位时间请求数 - 若用了 OpenResty,可用 Lua 记录每个请求的
ngx.now() - ngx.req.start_time(),写入 log 或共享内存,再用脚本解析
结构化保存与对比调优前后数据
避免人工比对,用脚本生成带时间戳的报告文件,统一格式便于追踪:
- 每次压测生成 JSON 文件:
result_20240520_1422.json,含字段:config(worker_processes、keepalive_timeout 等)、qps、latency_p95_ms、cpu_avg、mem_rss_mb - 用 Python 脚本读取多个结果,按 config 字段分组,输出 Markdown 表格或绘图(用 matplotlib/seaborn)
- 关键对比逻辑:QPS 提升 >15% 且 P95 延迟增长
常见陷阱与稳定压测前提
很多“调优无效”其实是压测环境不可靠导致的误判:
- 客户端机器 CPU/网络打满?用
htop和iftop监控,确保压测机资源充足 - Nginx 是否启用了
reuseport?高并发下未开启会导致 worker 争抢 accept 锁,掩盖真实性能 - 后端服务(如 PHP-FPM、上游 API)是否成为瓶颈?压测时需同步监控其 CPU、慢日志、连接池耗尽情况
- SSL/TLS 握手开销大?压测 HTTP 时关 TLS,压测 HTTPS 时固定复用 session ticket,避免握手抖动干扰延迟
不复杂但容易忽略:真正有效的自动化压测,80% 功夫在环境一致性控制和数据归因,而不是脚本多炫酷。先跑通单次可复现的流程,再封装成脚本,比一上来写个“全自动调优机器人”更靠谱。


















