公开服务难免遭遇爬虫、恶意刷接口。Nginx 内置的限流模块能在网关层挡住异常流量,保护后端。

一、两种限流方式

二、按 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;
}

三、限制并发连接数

# 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,比文本形式节省内存,是限流的标配写法。

五、限流位置选择

六、小结

限流是高可用的重要防线。配合防火墙、WAF 形成多层防护。注意阈值要结合压测数据设定,过低误伤正常用户,过高失去保护意义。