突发流量或恶意爬虫把站点打挂,最常见的自救手段就是限流。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 状态码更明确。
- 限流过严会误伤正常用户,先在测试环境用压测调出合理阈值再上生产。
限流不是越紧越好,要先测出业务的真实峰值再定阈值。