You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx转发PHP请求到PHP-FPM后其访问日志显示127.0.0.1如何获取真实客户端IP

PHP-FPM访问日志显示真实客户端IP配置方案

问题原因

PHP-FPM默认访问日志格式中,IP字段%h取的是TCP连接的对端IP,因为Nginx和PHP-FPM在同一台服务器用本地回环通信,所以默认只会显示127.0.0.1,和Nginx通过fastcgi_param传递的客户端IP参数没有关系。

解决步骤

1. 修改PHP-FPM池配置

编辑你对应的PHP-FPM池配置文件(也就是你示例中[domain]段的配置文件),在access.log配置行下方新增自定义日志格式配置:

; 原有配置保留
access.log = /var/log/php-fpm-access.log
; 新增以下自定义日志格式配置
access.format = "%{X-REAL-IP}e - %t \"%m %r\" %s"

格式占位符说明:

  • %{X-REAL-IP}e:读取Nginx传递的X-REAL-IP FastCGI参数值,也就是真实客户端IP,你也可以替换为%{REMOTE_ADDR}e,因为你的Nginx fastcgi_params配置中已经默认传递了值为真实客户端IP的REMOTE_ADDR参数
  • %t:请求时间,和原默认格式的时间样式一致
  • %m:HTTP请求方法(GET/POST等)
  • %r:请求的URI路径
  • %s:HTTP响应状态码
    你可以根据自己的日志需求调整格式字段。

注意:如果Nginx前方还有CDN、负载均衡等七层代理服务,需要先在Nginx中配置ngx_http_realip_module模块,让$remote_addr正确获取到终端用户的真实IP,否则日志中记录的会是上层代理的IP。

2. 重启PHP-FPM服务生效

根据你的PHP版本执行对应的重启命令,示例:

# 通用版本
systemctl restart php-fpm
# 如果你是指定版本的PHP,比如PHP7.4
systemctl restart php7.4-fpm

3. 验证结果

再次访问.php后缀的接口,查看/var/log/php-fpm-access.log,即可看到日志首段已经替换为真实客户端IP。

内容的提问来源于stack exchange,提问作者Brian Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:21:02