least_conn 不导致客户端 IP 丢失,根本原因是反向代理链路中请求头透传与 real_ip 模块配置缺失;需正确设置 proxy_set_header、启用 real_ip 模块并配置可信源与递归解析,后端须优先读取 X-Real-IP 或过滤后的 X-Forwarded-For。

least_conn 本身不导致客户端 IP 丢失——IP 丢失和负载均衡算法无关,而是反向代理链路中请求头透传与真实 IP 解析配置缺失造成的。排查重点不在 least_conn,而在 upstream 转发环节的 header 设置、real_ip 模块启用及后端读取逻辑。
确认 proxy_set_header 是否正确透传关键头
在使用 least_conn 的 location 或 server 块中,必须显式设置以下三行(顺序不能乱):
-
保留原始 Host:防止后端重定向出错或租户路由异常
proxy_set_header Host $http_host; -
单点真实 IP 标识(适合单层代理):
proxy_set_header X-Real-IP $remote_addr; - 完整转发路径链**(推荐,尤其多层场景):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
检查是否启用了 real_ip 模块并配置可信源
仅靠 X-Forwarded-For 不安全,Nginx 必须用 real_ip 模块从该头中“剥洋葱”还原真实 IP。需在 http 或 server 块中添加:
-
声明可信代理网段(如你自己的 WAF、CDN 回源段、或上一级 Nginx 内网 IP):
set_real_ip_from 10.0.0.0/8;set_real_ip_from 172.16.0.0/12;set_real_ip_from 192.168.0.0/16; -
指定解析来源头:
real_ip_header X-Forwarded-For; - 开启递归解析**(关键):
real_ip_recursive on;
配置生效后,$remote_addr 就是真实用户 IP,日志、限流、风控等可直接使用,无需再手动解析 XFF。
验证后端是否正确读取真实 IP
即使 Nginx 配置完美,后端代码若只调用 request.getRemoteAddr(),仍会拿到 Nginx 的内网地址。应按优先级读取:
- 首选
X-Real-IP(前提是 Nginx 已用real_ip模块还原) - 次选
X-Forwarded-For中第一个非私有地址(需过滤127.0.0.1、10.x.x.x、172.16–31.x.x、192.168.x.x) - 禁用
request.getRemoteAddr()直接取值
排除 keepalive 和连接复用干扰
虽然 least_conn 依赖连接数统计,但 keepalive 复用本身不会导致 IP 丢失。不过要注意:
- 若后端服务未正确关闭长连接,可能造成
X-Forwarded-For头被复用或覆盖(尤其在 WebSocket/gRPC 等 stream 场景) - TCP 层长连接需走
stream模块,HTTP 的least_conn对其无效;此时真实 IP 传递需依赖stream模块下的proxy_protocol+ 后端启用 PROXY 协议解析


















