Nginx对部分用户请求IP检测异常问题排查求助
Nginx访问日志IP记录异常的排查与解决
问题概述
某用户实际IP为x.x.69.209,但Nginx访问日志中记录为x.x.69.210。该用户更换网络、使用MacOS Chrome及iOS Safari测试均出现此问题,未使用代理或VPN。其他用户IP记录正常。
站点部署在AWS EC2 CentOS 7实例,Nginx版本1.20.1;同系统、同Nginx版本及配置的其他EC2站点可正常记录该用户IP。已尝试重启、升级Nginx,问题依旧。
排查步骤与解决方案
1. 检查AWS网络层面配置差异
- 对比异常站点与正常站点的EC2弹性IP(EIP)配置,确认是否存在IP映射规则差异。
- 查看VPC路由表、NAT网关设置,排查是否有网络地址转换(NAT)规则导致源IP被修改。
- 开启VPC Flow Logs,追踪该用户请求的IP传输路径,确认IP是否在AWS网络环节被转换。
2. 验证Nginx日志格式与变量
- 检查
main日志格式的定义,确保正确记录客户端原始IP:
确认日志格式中使用的是grep -r "log_format main" /etc/nginx/$remote_addr(直接连接的客户端IP),而非被代理修改后的变量。 - 临时修改日志格式,添加
$http_x_forwarded_for字段,对比日志中的IP值,判断是否存在多层代理导致的IP覆盖。
3. 排查Nginx模块与第三方服务
- 检查Nginx是否加载了
ngx_http_realip_module模块,执行命令查看编译参数:
如果启用了该模块,确认nginx -Vset_real_ip_from规则是否正确,错误的规则会导致IP被错误替换。 - 排查站点是否默认接入了AWS Shield、CDN或第三方WAF服务,这类服务可能会修改源IP;对比正常站点是否未启用此类服务。
4. 验证后端应用的IP处理逻辑
- 检查3000端口的后端应用是否会修改
X-Real-IP或X-Forwarded-For请求头,导致日志记录的是应用处理后的IP。 - 添加临时测试location,绕过后端应用直接验证Nginx的IP记录:
让用户访问server { # 保留原有配置,新增以下location location /test-ip { return 200 "RemoteAddr: $remote_addr\nX-Real-IP: $http_x_real_ip\nX-Forwarded-For: $http_x_forwarded_for"; access_log /var/log/nginx/test-ip.log main; } }https://<domain-of-my-site>/test-ip,查看返回内容与日志记录,定位问题出在Nginx还是后端应用。
5. 对比配置差异
- 将异常站点的Nginx配置(包括Certbot生成的
options-ssl-nginx.conf)与正常站点完全对齐,测试是否解决问题。 - 检查
/etc/letsencrypt/options-ssl-nginx.conf中是否存在代理相关的配置,可能影响IP记录。
内容的提问来源于stack exchange,提问作者Neil Nguyen
相关产品推荐
相关产品推荐

