要实现政企B端客户流量精准黏滞,需结合真实IP识别、可信网段限定与独立upstream分组:先确认客户固定出口IP段并验证透传,再为每个客户单独配置含ip_hash的upstream,通过map指令将源IP映射至对应upstream变量,最后用set_real_ip_from等指令强化多层代理下的真实IP还原与容错。

要让特定政企B端客户的流量稳定黏滞到固定后端节点,ip_hash 是一个可快速落地的方案,但直接用默认 ip_hash 无法区分“特定客户”,它对所有客户端一视同仁。必须结合真实 IP 识别、可信网段限定与 upstream 分组策略,才能实现精准黏滞。
明确目标客户的真实出口IP范围
政企客户通常使用固定公网出口(如专线、SD-WAN 或 NAT 网关),其访问流量源 IP 高度集中且可预知。你需要:
- 向客户确认其实际出口 IP 段(例如:203.107.45.0/24、112.64.128.128/25)
- 验证该网段是否在 CDN/WAF/云 LB 后透传——若前端有代理,需确保 X-Forwarded-For 中首项为其真实出口 IP
- 在 Nginx 日志中用 $http_x_forwarded_for 和 $remote_addr 对比,确认解析无误
为政企客户单独定义 upstream + ip_hash
不要把政企客户和普通用户混在一个 upstream 里。应隔离配置,避免普通用户流量干扰哈希分布:
- 为每个重点客户(或客户群)新建独立 upstream 块,名称体现业务含义,如 upstream beijing_gov_backend
- 在该 upstream 中仅写入专供该客户的后端服务器(例如:仅 2 台高配节点),并紧贴首行启用 ip_hash
- 示例:
upstream beijing_gov_backend {
ip_hash;
server 10.20.30.101:8080;
server 10.20.30.102:8080;
}通过 map + if 实现客户流量自动路由
不能靠客户端自己带标识,而是由 Nginx 主动识别来源 IP 并分发。推荐用 map 指令做静态匹配,再结合 proxy_pass 动态指向:
- 在 http 块顶部定义 map,将客户 IP 段映射为 upstream 名称:
map $remote_addr $backend_cluster {
default "common_backend";
~^203\.107\.45\. "beijing_gov_backend";
~^112\.64\.128\.(12[8-9]|1[3-9][0-9]|2[0-5][0-9]|26[0-5]) "beijing_gov_backend";
}- 在 server 的 location 中使用变量 proxy_pass:
location / {
proxy_pass http://$backend_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}- 注意:Nginx 不允许在 if 中嵌套 proxy_pass,所以务必用 map + 变量方式,安全且高效
强化真实 IP 还原与容错机制
政企环境常有多层转发(如省级政务云网关 → 地市 WAF → 你方 Nginx),必须防住 IP 伪造和链路截断:
- 在 http 块中声明所有可信上游代理网段(含政务云出口、WAF 内网 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; set_real_ip_from 203.107.45.0/24; # 客户出口也设为可信,避免被二次覆盖 real_ip_header X-Forwarded-For; real_ip_recursive on;
- 开启 real_ip_recursive on,支持多跳 X-Forwarded-For 解析(取最左非可信项)
- 配合日志格式输出 $http_x_forwarded_for 和 $realip_remote_addr,用于线上核验


















