nginx官方未提供nhttptest工具,压测应使用wrk或ab等通用工具,结合stub_status监控与系统资源观测,通过-c参数匹配worker_processes×worker_connections值,验证实际连接上限。

Nginx 官方并没有提供名为 nhttptest 的压测工具。这是一个常见误解——Nginx 官方从未发布或维护叫 nhttptest 的工具,相关名称多见于社区误传、旧文档混淆,或与某些第三方 Go/Python 小工具(如 nhttp、nhtp)混用所致。
实际生产中验证 worker_connections 上限,应使用通用、可控、可复现的 HTTP 压测工具,并配合 Nginx 自身状态监控和系统资源观测。关键不在于“用哪个工具”,而在于如何设计压测逻辑来准确触达并识别连接数瓶颈。
? 明确你要测什么:不是“理论值”,而是“实际生效上限”
worker_connections 4096 不代表你一定能稳定维持 4096 个并发连接。真实上限受三重约束:
- 操作系统级文件描述符限制(
ulimit -n) -
worker_processes × worker_connections的乘积是否被worker_rlimit_nofile和系统允许 - 网络连接建立速率、keepalive 行为、后端代理开销等运行时因素
压测目标是:让 Nginx 达到连接拒绝(503 / connection reset / “too many open files”)的临界点,并确认该瓶颈是否由 worker_connections 配置触发。
? 推荐压测组合方案(实操有效)
✅ 工具选型:wrk(推荐)或 ab(简单场景)
-
wrk更轻量、支持长连接、可精准控并发连接数(-c)和线程数(-t),适合验证连接层极限 -
ab(Apache Bench)较老但直观,适合短连接压测(注意-k开启 keepalive 否则连接开销极大)
示例(wrk):
# 启动 Nginx 后,压测单机 loopback(排除网络干扰) wrk -t4 -c8192 -d60s http://127.0.0.1:80/
-
-t4:4 个工作线程(匹配常见 CPU 核数) -
-c8192:维持 8192 个持久连接 -
-d60s:持续 60 秒
⚠️ 注意:
-c值应 ≥worker_processes × worker_connections才可能打满。例如worker_processes 4; worker_connections 2048;→ 理论上限 8192,那就设-c8192或略高(如 8500)观察是否溢出。
✅ 实时监控 Nginx 连接状态
启用 stub_status 模块(确保 nginx.conf 中有):
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
压测中轮询查看:
curl http://127.0.0.1/nginx_status # 输出类似: # Active connections: 8191 # server accepts handled requests # 123456 123456 246912 # Reading: 0 Writing: 1 Waiting: 8190
-
Active connections接近你设定的worker_processes × worker_connections? - 若卡在
8192不再上涨,且 error.log 出现accept() failed (24: Too many open files),说明系统 fd 耗尽 → 未调ulimit - 若
Active connections远低于理论值(如只到 3000),但ss -s | grep tcp:显示大量TIME-WAIT或ESTAB,需查 keepalive 设置或客户端行为
✅ 同步检查系统资源水位
# 查看当前 nginx worker 进程的 fd 限制 cat /proc/$(pgrep -f "nginx: worker")/limits | grep "Max open files" # 查看实时 TCP 连接数统计 ss -s | grep "TCP:" # 查看 nginx error.log 是否有连接拒绝日志 tail -f /var/log/nginx/error.log | grep -i "too many\|503\|accept.*failed"
? 关键配置协同验证(避免单点误判)
仅改 worker_connections 是无效的。必须同步检查以下项是否对齐:
-
worker_processes auto;或显式设为 CPU 核数(如4) events { worker_connections 4096; use epoll; multi_accept on; }-
worker_rlimit_nofile 100000;(建议 ≥worker_processes × worker_connections × 1.2) -
/etc/security/limits.conf中对应用户(如www-data)的nofile设置 - systemd service 中
LimitNOFILE=100000 - 启动前执行
ulimit -n 100000(或确保服务加载时已生效)
全部对齐后,worker_connections 才真正“可达到”。
? 如何判断是 worker_connections 到顶了?
出现以下组合现象,才说明是该参数成为瓶颈:
-
Active connections稳定卡在worker_processes × worker_connections附近,不再上升 -
Waiting状态连接数持续高位(如 >95%),Writing很低 - 客户端收到大量
Connection refused或503 Service Temporarily Unavailable -
error.log没有too many open files错误(说明系统 fd 充足) -
ss -s显示ESTAB连接数 ≈Active connections,无异常TIME-WAIT泛滥
此时可尝试微调 worker_connections + 重启,观察 Active connections 是否同步提升。
不复杂但容易忽略的是:压测必须关闭浏览器、CDN、负载均衡等中间层,直连 Nginx;否则你测的不是 Nginx 的 worker_connections,而是整个链路的最弱一环。











