nginx 默认 access_log 不记录 worker 进程 pid,但 ≥1.19.10 版本可通过 log_format 中使用 $pid 变量实现;需确认版本与日志模块启用,配置后日志首字段即为当前写入日志的 worker pid,注意其非请求全程唯一标识。

Nginx 的 access_log 默认不记录 worker 进程 ID(PID),因为日志格式设计聚焦于请求上下文(如 IP、路径、状态码等),而非运行时进程元信息。但可通过自定义 log_format 配合内置变量实现,前提是 Nginx ≥ 1.19.10(引入 $pid 变量)。
确认是否支持 $pid 变量
执行以下命令检查版本及变量可用性:
-
nginx -v—— 查看版本,必须 ≥ 1.19.10 -
nginx -V 2>&1 | grep -o 'with-http-log-module'—— 确保日志模块已编译启用
在 log_format 中加入 $pid
编辑 /etc/nginx/nginx.conf 或站点配置,在 http 块中定义含 PID 的格式:
log_format with_pid '$pid - $remote_addr - [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
然后在 server 或 location 块中启用:
access_log /var/log/nginx/access.log with_pid;
注意实际效果与限制
$pid 记录的是写入该条日志时**当前 worker 进程的 PID**,不是处理整个请求生命周期的唯一标识(因长连接或子请求可能跨 worker)。常见场景下它能反映日志行由哪个 worker 生成,但不等于“该请求全程由该 worker 处理”。
若需更精确追踪请求路径(例如区分 master/worker 协作、子请求分发),应结合 $request_id + 后端服务日志,而非依赖 PID。
验证是否生效
重载配置后,触发一次请求,再查看日志:
nginx -s reloadcurl -I http://localhost-
tail -1 /var/log/nginx/access.log—— 检查首字段是否为数字 PID











