Nginx无内置全局累计请求数,但可通过stub_status模块获取实时总数、日志聚合工具长期统计、或OpenResty共享字典计数器实现;$request_number仅表单连接内序号,非全局值。
Nginx 本身不直接提供“自启动以来累计请求总数”的内置计数器,也无法在 access_log 中自动写入一个递增的全局请求数。但可以通过几种实用方式间接实现该目标,核心思路是:将请求计数从日志生成环节转移到外部统计或运行时变量环节。
$request_number 是 Nginx 1.11.0+ 提供的变量,表示当前 TCP 连接中第几个请求(HTTP/1.1 keepalive 或 HTTP/2 多路复用下会递增),但它不是服务级累计值,重启后归零,且每个连接独立计数。例如:
log_format count_log '$request_number - $remote_addr - $time_local - "$request"';
这只能用于调试连接行为,不能替代全局累计请求统计。
启用 ngx_http_stub_status_module 后,可通过 /nginx_status 端点获取实时指标,其中 “Requests” 行显示的就是自启动以来的总请求数:
location /nginx_status {stub_status on;
allow 127.0.0.1;
deny all;
}
curl http://localhost/nginx_status 输出类似:
Active connections: 3
server accepts handled request
123456 123456 789012
最后一列 789012 即为累计请求数
这是最可靠、生产常用的方式:让 Nginx 正常记录每条请求,再由外部工具(如 awk、logrotate 配合计数脚本、或 ELK/Prometheus)汇总解析日志文件,得出总量。
logrotate 归档策略保留历史)wc -l /var/log/nginx/access.log*(注意:若日志含多行记录如 JSON 或带换行的 UA,需更精准解析)total_requests.log,或用 Prometheus + nginx-vts-exporter 实现指标持久化与监控如果使用 OpenResty 或编译了 ngx_http_lua_module,可在内存中维护一个跨 worker 的原子计数器:
lua_shared_dict req_counter 10m;
log_by_lua_block {local dict = ngx.shared.req_counter
dict.inc("total", 1)
}