Nginx防CC攻击核心是请求抵达后端前按需限速、限连、精准拦截;必须在http块定义limit_req_zone和limit_conn_zone共享内存区,配合$binary_remote_addr等合理key及burst/nodelay参数分层配置,并通过429状态码和日志字段验证生效。
Nginx 防 CC 攻击的核心不是“封IP”,而是**在请求抵达后端前,按需限速、限连、精准拦截**。配置有效,关键不在堆参数,而在理解每个指令的职责和协作逻辑。单独写 limit_req 或 limit_conn 不生效——它们只是“执行开关”,真正干活的是定义在 http 块顶层 的对应 zone 指令:
别用 $remote_addr,改用 $binary_remote_addr:
这两个参数决定攻击者能否靠“瞬时堆请求”瘫痪你的队列:
burst=0:超速请求立刻返回 503/429,但正常用户点快两下也可能被拦burst=10 nodelay:允许最多 10 个请求“秒进”,后续仍严格按 rate 匀速放行——这是生产环境最稳的组合nodelay 时,burst 内请求会被摊到几秒内缓慢发给后端,反而延长资源占用时间全站一刀切限流容易伤及静态资源或真实用户。应分层处理:
rate=1r/s burst=3 nodelay
rate=5r/s burst=15 nodelay
limit_req off 或设宽松规则(如 rate=50r/s)"$binary_remote_addr$uri",防单 IP 刷多个接口,也降低误封概率配完不加这三步,等于没配:
limit_req_status 429:把默认 503 改为语义明确的 429 Too Many Requests,前端能区分是限流还是后端崩了$limit_req_status,例如:log_format main "... $limit_req_status";
rejected 或 passed,验证是否真生效