ip_hash不防爬虫,仅实现同ip请求固定分发;需结合真实ip识别、限流、黑名单及替代方案(如cookie哈希、least_conn)综合防护。

ip_hash 本身不防爬虫,它只负责把同一个 IP 的请求固定打到同一台后端服务器。当大量爬虫共用一个代理 IP(比如某 IDC 出口、公共代理池或 CDN 回源 IP),所有请求会被 hash 到同一台后端机器,极易造成单点过载甚至雪崩。
识别并隔离高危代理 IP 流量
先确认真实客户端 IP 是否被正确传递。如果前端有 CDN、WAF 或多层 Nginx 代理,$remote_addr 可能是上一跳地址而非真实用户 IP。必须配合 set_real_ip_from 和 real_ip_header 提取原始 IP:
- 在 http 或 server 块中配置可信代理网段,例如:set_real_ip_from 192.168.0.0/16;(根据实际代理出口调整)
- 指定头字段获取真实 IP,常见为:real_ip_header X-Forwarded-For; 或 real_ip_header X-Real-IP;
- 验证生效:检查 Nginx 日志中的 $remote_addr 是否已变成真实客户端 IP
限制单 IP 请求频率
即使 IP 被固定分发,也能通过限流降低冲击。使用 limit_req 模块对每个真实 IP 做速率控制:
- 在 http 块定义共享内存区和规则,例如:limit_req_zone $remote_addr zone=perip:10m rate=10r/s;
- 在 location 或 server 中启用:limit_req zone=perip burst=20 nodelay;
- burst 允许短时突发,nodelay 避免排队延迟;可根据业务容忍度调低 rate(如 3r/s)
主动屏蔽已知恶意代理网段
对已知的公开代理、爬虫常用出口 IP 段,直接拒绝访问比依赖 ip_hash 更有效:
- 新建 blacklist.conf,按行写入:deny 114.114.114.0/24;、deny 221.228.228.0/24; 等
- 在 upstream 上游或 server 块中 include:include blacklist.conf;
- 可定期从公开威胁情报源(如 AbuseIPDB、FireHOL)更新黑名单
替代 ip_hash 的更稳健方案
若业务允许,建议放弃纯 ip_hash,改用更抗干扰的会话保持方式:
- hash $cookie_session_id consistent;:基于应用层 Cookie 分发,爬虫无 Cookie 则走默认轮询,天然分散压力
- least_conn; + 健康检查:优先转发给当前连接数最少的后端,动态平衡负载
- 结合 JWT 或 Token 鉴权,在入口层拦截未授权高频请求,不进入 upstream 流程











