ip_hash在cdn回源场景失效主因是cdn边缘节点统一用自身出口ip回源,导致nginx将所有请求识别为同一客户端ip;须通过日志分析确认ip倾斜、启用real_ip_module还原真实ip,并改用hash $http_x_forwarded_for consistent等替代策略。

IP_HASH模式本身不适用于CDN回源场景,因为CDN边缘节点会统一用自身出口IP回源,导致所有请求被Nginx识别为同一个客户端IP,全部打到后端同一台服务器上——这就是典型的回源IP倾斜。
确认是否真由CDN回源引发倾斜
先查Nginx access日志,筛选出高频回源IP:
- 执行awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20,看前20个IP中是否有大量来自同一段(如 CDN厂商的POP出口网段)
- 比对这些IP与已知CDN提供商的ASN或IP段(如阿里云全站加速、腾讯云ECdn、Cloudflare的公开IP列表),确认是否属于边缘节点出口
- 检查日志里X-Forwarded-For头是否携带了真实用户IP,而$remote_addr却是固定几个地址——这说明$remote_addr已被CDN覆盖,ip_hash失去意义
验证Nginx实际分发是否失衡
在后端各服务器上分别统计接收请求数(例如通过nginx stub_status或自定义日志计数):
- 若某台机器QPS/连接数长期是其他机器的3倍以上,且与$remote_addr分布高度相关,基本可锁定ip_hash失效
- 临时关闭ip_hash,改用least_conn或hash $request_uri consistent,观察后端负载是否趋于均衡
根本解决:绕过ip_hash依赖真实用户标识
CDN回源时,应让Nginx依据真实用户特征做负载,而不是伪造的回源IP:
- 启用real_ip_module,配置set_real_ip_from为CDN提供的可信回源网段,并设置real_ip_header X-Forwarded-For
- 改用hash $http_x_forwarded_for consistent(注意需提取首层真实IP,避免代理链污染)
- 更稳妥的做法:让CDN在回源Header中注入X-Real-User-ID或X-Hash-Key(例如对真实IP哈希后截取),Nginx直接按该Header哈希分发
配套检查CDN侧配置
部分CDN默认不透传X-Forwarded-For,或自动清洗该头:
- 登录CDN控制台,确认“回源请求头”中已开启透传X-Forwarded-For,且未勾选“自动替换/清洗”选项
- 检查CDN缓存规则是否把带不同X-Forwarded-For的请求视为同一资源(导致缓存复用异常),必要时在Cache Key中加入X-Forwarded-For字段











