必须启用realip模块并配置set_real_ip_from、real_ip_header,再用$request_time与$upstream_response_time双变量结合$realip_remote_addr,在php location块中启用json格式日志,确保耗时绑定真实用户。

要在 Nginx 中通过 PHP-FPM 场景精准记录客户端真实访问耗时,核心不是配 PHP-FPM 本身,而是利用 Nginx 的 $request_time 和 $upstream_response_time 变量,并确保日志能反映真实客户端 IP——因为耗时分析必须绑定到真实用户才具备业务意义。
启用并校准真实客户端 IP
若前端有 CDN、负载均衡或反向代理,$remote_addr 只是上一跳地址。必须启用 realip 模块并配置可信来源:
- 在
http块中添加:set_real_ip_from 10.0.0.0/8;(替换成你实际的代理网段,如192.168.1.0/24或具体 CDN IP) - 指定头字段:
real_ip_header X-Forwarded-For; - 可选:开启递归解析多级代理:
real_ip_recursive on; - 之后才能安全使用
$realip_remote_addr—— 这才是经校验后的最终客户端 IP
定义含真实 IP 与双耗时的日志格式
在 http 块中定义结构清晰、便于解析的格式(推荐 JSON):
log_format php_audit '{"time":"$time_iso8601","client":"$realip_remote_addr","xff":"$http_x_forwarded_for","uri":"$request_uri","status":$status,"rt":$request_time,"urt":"$upstream_response_time","method":"$request_method"}';
-
$request_time:Nginx 接收首字节到发完响应的总耗时(秒,毫秒精度) -
$upstream_response_time:PHP-FPM 返回首字节所用时间(逗号分隔,如"0.032") - 差值 ≈ Nginx 自身开销(SSL、重写、日志等),突增说明瓶颈在 Nginx 层
- 用
$time_iso8601保证 UTC 时间统一,避免时区混乱 - 数值字段不加引号,利于 ELK 或 Grafana 直接识别为数字类型
在 server 或 location 块中启用该日志
针对 PHP 处理路径(如 location ~ \.php$)单独启用,避免污染静态资源日志:
location ~ \.php$ {<br> include snippets/fastcgi-php.conf;<br> fastcgi_pass unix:/run/php/php8.1-fpm.sock;<br> access_log /var/log/nginx/php_access.log php_audit;<br>}
- 确保
php_audit格式名与log_format定义一致 - 路径需有写权限(如
www-data用户可写) - 若全局已启用 access_log,此处会覆盖,实现按路径分流记录
验证与生效
改完配置后必须执行两步:
-
nginx -t:检查语法是否正确 -
nginx -s reload:热重载配置,无需中断服务 - 发起一次 PHP 请求后,查看日志文件:
tail -n 1 /var/log/nginx/php_access.log - 确认输出含
"rt":0.047、"urt":"0.039"及正确的"client"字段
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











