access.log 不能反映并发连接峰值,因其仅记录 http 请求事务而非 tcp 连接,keep-alive 下多请求共享一连接却生成多行日志,且连接建立/断开本身不记入日志。

access.log 本身不记录连接数或 worker_connections 相关指标,它只记录 HTTP 请求级别的信息(如时间、IP、URL、状态码、响应大小等)。无法直接从 access.log 统计 Nginx 的并发连接峰值,因为一个 TCP 连接可能承载多个 HTTP 请求(Keep-Alive),也可能一个请求就关闭连接;而 worker_connections 限制的是所有 worker 进程能同时处理的 活跃 TCP 连接总数,与日志条目不是一一对应关系。
为什么 access.log 不能反映连接峰值
– 每行日志 = 一次 HTTP 事务,不是一次 TCP 连接
– 启用 keepalive 时,多个 request 共享同一个 connection,但会生成多条日志
– 静态资源、健康检查、长轮询等请求会延长连接生命周期,但日志只在请求结束时写入
– connection 建立/断开本身不记入 access.log(除非用第三方模块如 nginx-module-vts 或自定义 log_format 记录 $connection 或 $connection_requests)
真正能统计连接峰值的方法
1. 使用 stub_status 模块(推荐)
确保编译时包含 `--with-http_stub_status_module`,并在配置中暴露状态页:
stub_status on;
allow 127.0.0.1;
deny all;
}
访问 http://your-nginx/nginx-status 可得类似输出:
server accepts handled requests
254321 254321 682345
Reading: 3 Writing: 12 Waiting: 109
其中 Active connections 就是当前所有 worker 的总并发连接数。用脚本定时抓取并记录该值,即可得到峰值。
2. 通过系统级指标监控
Nginx 进程的文件描述符使用量 ≈ 当前连接数(每个连接至少占 1 个 fd):
lsof -p $(cat /var/run/nginx.pid) | wc -l-
ss -s | grep "tcp:"(看已建立的 ESTAB 连接数,含非 Nginx) -
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files"(对比上限)
3. 日志辅助估算(仅作参考,不精确)
若必须基于 access.log 做粗略趋势分析,可按时间窗口统计每秒请求数(RPS),再结合平均连接保持时间(keepalive_timeout)估算连接下限:
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c | sort -nr | head -20
例如某秒有 800 次请求,keepalive_timeout=60s,则理论连接数可能在几十到几百之间——但这只是数量级参考,不能替代真实连接监控。
如何调优 worker_connections
– 查看当前设置:nginx -T 2>/dev/null | grep worker_connections
– 理想值 ≈ max_open_files / worker_processes(需留余量)
– 检查是否打满:grep "worker_connections is not enough" /var/log/nginx/error.log
– 调整后必须 reload:nginx -s reload,且需同步调高系统 limit(ulimit -n)











