公开服务难免遭遇爬虫、恶意刷接口。Nginx 内置的限流模块能在网关层挡住异常流量,保护后端。
一、两种限流方式
- limit_req:限制请求速率(每秒多少次)
- limit_conn:限制并发连接数
二、按 IP 限速
先在 http 块定义限流区域:
# nginx.conf 的 http 块内
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
rate=10r/s 表示每 IP 每秒 10 个请求。然后在 server/location 里启用:
location /api/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend;
}
burst=20:允许突发 20 个请求排队nodelay:突发请求不延迟,立即处理(超出才拒绝)
三、限制并发连接数
# http 块
limit_conn_zone $binary_remote_addr zone=perip:10m;
# location 块
limit_conn perip 10; # 单 IP 最多 10 个并发连接
四、自定义拒绝响应
默认超限返回 503,可改成 429(Too Many Requests)更语义化:
limit_req_status 429;
$binary_remote_addr 用二进制形式存 IP,比文本形式节省内存,是限流的标配写法。
五、限流位置选择
- 全站:放在 server 块
- 特定接口:放在对应 location
- 下载/大文件:建议用 limit_rate 限带宽
六、小结
限流是高可用的重要防线。配合防火墙、WAF 形成多层防护。注意阈值要结合压测数据设定,过低误伤正常用户,过高失去保护意义。