ip hash 不防 ddos 反增风险,应改用 consistent hash、least_conn 等抗攻击分发策略,并配置 max_conns、限流限连、健康探测与熔断机制。

IP Hash 算法本身不防 DDoS,反而在攻击场景下容易放大风险——它把同一 IP(或 NAT 后的整个用户群)固定打到某台后端,一旦该 IP 被恶意高频请求,对应后端会率先过载甚至崩溃。真正有效的做法不是依赖 hash 本身,而是用“隔离 + 限流 + 智能剔除”组合策略来保护单台后端。
停用 ip_hash,改用更抗攻击的分发方式
ip_hash 在 DDoS 场景下是隐患:运营商出口、校园网、移动基站等 NAT 环境下,成百上千真实用户共用一个公网 IP,攻击者只需打这个 IP,流量就全压向一台后端。建议替换为:
- hash $request_uri consistent:按请求路径哈希,相同接口请求分散更均匀,也利于缓存穿透防护
- least_conn:优先发给当前连接数最少的后端,但需配合 slow_start=30s,防止新上线节点被突袭打垮
- 避免纯轮询(round-robin),它不感知节点负载,容易雪崩
给每台后端加硬性连接上限
即使分发逻辑合理,单台后端也不能无限制接请求。必须在 upstream 中为每个 server 显式设限:
- max_conns=150(或根据实际业务调低):超过此并发数,Nginx 直接拒绝,不转发
- 搭配 proxy_next_upstream error timeout http_500 http_502 http_503:后端返回这些状态时,自动重试其他节点
- 加上 max_fails=2 fail_timeout=15s:连续失败 2 次,15 秒内不再分发新请求
在入口层对源 IP 主动限速和限连
攻击流量还没到达后端前,就得在 Nginx proxy 层卡住:
- limit_conn_zone $binary_remote_addr zone=perip:10m + limit_conn perip 10:单 IP 最多 10 个并发连接
- limit_req_zone $binary_remote_addr zone=ddos:10m rate=10r/s + limit_req zone=ddos burst=20 nodelay:每秒最多 10 请求,突发允许 20,超了直接 503
- 对高危路径如
/login、/api/pay单独限得更严,比如rate=2r/s
配合健康探测与快速熔断
开源版 Nginx 虽不支持主动 health_check,但可用被动机制补足:
- 设置 proxy_connect_timeout 3s、proxy_read_timeout 8s:缩短超时,快速释放卡死连接
- 开启 proxy_next_upstream_tries 3 和 proxy_next_upstream_timeout 10s:单次请求最多尝试 3 台,总耗时不超过 10 秒
- 日志中监控
upstream_response_time和upstream_status,发现某台延迟飙升或 5xx 集中,手动临时摘除











