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-IPFastCGI参数值,也就是真实客户端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
相关产品推荐
相关产品推荐

