Nginx 放在负载均衡后面,access.log 里 client 全是 10.0.0.12,应用登录日志里所有用户同一个 IP,风控把正常请求判成撞库。乍看像缓存或者权限的锅,追下去往往不是。
set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; real_ip_recursive on; nginx -t && nginx -s reload
追下去是这么回事:默认 remote_addr 是直连上一跳的地址,反代没有把原始客户端写进这个变量。X-Forwarded-For 是逗号分隔的链,直接取第一个也可能是伪造值。
「真实客户端 IP」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。
具体做法是,在 http 或 server 里配 set_real_ip_from 指定可信代理网段;real_ip_header X-Forwarded-For 并打开 real_ip_recursive on;日志格式里用 remote_addr 确认已经换成真实地址;只信任自己这层的代理 不要写 0.0.0.0/0。
验收就看一点,access.log 里出现公网客户端 IP 应用侧取到的地址和 X-Forwarded-For 最后一跳一致。
