突发流量或恶意爬虫把站点打挂,最常见的自救手段就是限流。Nginx 的 limit_req 模块按客户端地址做漏桶限流。

操作步骤

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;

    server {
        location / {
            limit_req zone=perip burst=20 nodelay;
            limit_req_status 429;
        }
    }
}

要点速览

  • limit_req_zone 定义在 http 块,用客户端地址做 key,10m 大约能存 16 万个地址。
  • burst=20 允许瞬时排队,nodelay 表示超出直接拒绝而非延迟,配合 429 状态码更明确。
  • 限流过严会误伤正常用户,先在测试环境用压测调出合理阈值再上生产。
限流不是越紧越好,要先测出业务的真实峰值再定阈值。