启用ip_hash只需在upstream块首行添加ip_hash;,它基于客户端ip哈希实现会话保持,不支持weight、要求真实ip透传,且ipv4取前三字节哈希易致负载倾斜。

直接在 upstream 块里加 ip_hash; 这一行,就是启用 ip_hash 负载均衡算法的全部必要操作。它不依赖额外模块(Nginx 1.1.0+ 默认内置),也不需要改其他核心参数,但要注意它的行为边界和配套要求。
ip_hash 必须放在 upstream 块开头位置
ip_hash 是作用于整个 upstream 组的调度策略,必须作为该块的第一条指令(或至少在所有 server 行之前)。顺序错误会导致语法报错或策略不生效:
- ✅ 正确写法:
upstream api_backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
- ❌ 错误写法(ip_hash 在 server 后面、或被注释隔开):Nginx 启动会失败或降级为轮询。
ip_hash 对后端服务器有隐含限制
它基于客户端 IPv4 地址的前三个字节(如 192.168.1.x)或完整 IPv6 地址做哈希,因此:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 同一局域网内多个用户(比如公司出口 NAT 后)可能被映射到同一台后端,造成负载倾斜;
- 不支持动态剔除服务器:如果某台
server被临时注释或下线,哈希环会被打乱,部分用户会话中断; - 不能和
weight参数共用——ip_hash 本身不支持权重配置,加了 weight 会被忽略。
搭配 proxy_pass 使用时需透传真实 IP
ip_hash 的效果依赖 Nginx 能拿到客户端原始 IP。若前端还有 CDN 或代理,需确保 $remote_addr 是真实用户地址,否则哈希失去意义。推荐在 location 中设置:
proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;- 同时确认 Nginx 配置了
real_ip_header和set_real_ip_from(针对可信代理段)。
验证 ip_hash 是否生效的方法
最直接的方式是开启 access_log 并记录 $upstream_addr 和 $remote_addr:
- 定义日志格式:
log_format iphash '$remote_addr — $upstream_addr — $time_local'; - 启用日志:
access_log /var/log/nginx/iphash.log iphash; - 用不同公网 IP(或手机/家用宽带)多次访问,检查同一 IP 是否始终命中同一
upstream_addr。










