应改用hash $http_x_forwarded_for consistent;并配置set_real_ip_from声明cdn可信网段,配合max_conns限流与proxy_next_upstream自动漂移防止单点过载。

排查 IP_hash 模式下因全量 CDN 回源引发的流量倾斜,核心在于识别“CDN 回源 IP 集中”与“Nginx upstream 中 IP_hash 散列失衡”的双重叠加效应。CDN 边缘节点回源时通常使用固定出口 IP 池(如几十个),而非真实用户 IP;若 Nginx upstream 直接对这些有限的回源 IP 做 ip_hash,极易导致哈希碰撞、少数后端被高频命中。
确认是否为 CDN 回源 IP 导致的 hash 倾斜
先验证问题根源:不是客户端真实 IP 分布不均,而是 CDN 回源 IP 过少且集中。
- 在 Nginx access 日志中开启 $remote_addr 和 $upstream_addr 字段,采样 5–10 分钟回源请求
- 按 $remote_addr 聚合统计,检查实际出现的回源 IP 数量(例如:仅 23 个不同 IP)
- 再按 $upstream_addr 统计各后端接收的请求数,若某台 server 承担超 60% 请求,且其对应回源 IP 集中(如 80% 请求来自其中 3 个 CDN 出口 IP),即可判定为回源 IP 引发的 hash 倾斜
区分真实用户 IP 与回源 IP
CDN 一般会在请求头中透传原始用户 IP(如 X-Forwarded-For 或 Cf-Connecting-IP),但 Nginx 默认的 ip_hash 不识别这些字段。
- 禁用默认 ip_hash,改用 hash $http_x_forwarded_for consistent;(需确保 CDN 真实填充该头)
- 若 CDN 使用自定义头(如 X-Real-IP),则配置 hash $http_x_real_ip consistent;
- 务必配合 set_real_ip_from 指令,将 CDN 节点网段声明为可信来源,否则 Nginx 不会信任并覆盖 $remote_addr
监控与基线比对
仅靠日志抽样易漏判,需建立可持续观测机制。
- 通过 stub_status 或 openresty 的 lua-resty-prometheus 暴露 upstream 各 server 的 active 连接数、request 数
- 每分钟采集 $upstream_addr + $http_x_forwarded_for 的组合分布,计算 Gini 系数或标准差,设定阈值告警(如标准差 > 2.5 表示严重倾斜)
- 对比启用 XFF hash 前后,同一后端的独立客户端 IP(非回源 IP)数量变化——健康状态下应接近均匀
兜底防护:避免单点过载
即使修复了 hash 逻辑,仍需防止突发异常(如某 CDN 节点故障后流量涌向剩余几个出口 IP)。
- 在 upstream 中为每个 server 设置 max_conns=150,硬性限制并发连接数
- 启用 proxy_next_upstream error timeout http_502 http_503,失败请求自动漂移
- 添加轻量限流:limit_req zone=per_backend burst=30 nodelay;,作用于每个 upstream server 的出入口











