用 Nginx limit_req 给接口加简单限流

举报
yd_257918670 发表于 2026/10/24 06:28:43 2026/10/24
【摘要】 公开 API 或登录接口如果不加限流,很容易被脚本刷爆,导致正常用户访问变慢,甚至把小规格云主机打挂。Nginx 自带的 limit_req 模块(基于漏桶算法)就能在反代层挡住突发请求,配置简单,适合入门级防护。本文用 Ubuntu 上的 Nginx 演示如何按 IP 限流。 一、确认模块可用主流发行版的 Nginx 包一般已编译进 ngx_http_limit_req_module,用下...

公开 API 或登录接口如果不加限流,很容易被脚本刷爆,导致正常用户访问变慢,甚至把小规格云主机打挂。Nginx 自带的 limit_req 模块(基于漏桶算法)就能在反代层挡住突发请求,配置简单,适合入门级防护。本文用 Ubuntu 上的 Nginx 演示如何按 IP 限流。

一、确认模块可用

主流发行版的 Nginx 包一般已编译进 ngx_http_limit_req_module,用下面命令确认:

nginx -V 2>&1 | tr ' ' '\n' | grep limit_req

若能看到 --with-http_limit_req_module(或没有「without」字样),就可以直接用。

二、定义共享内存区与速率

在 http { } 块里(通常在 /etc/nginx/nginx.conf)加一行:

http {
    # zone 名称为 api_limit,占 10MB 内存;平均速率 10 请求/秒
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    # ... 其余配置
}

说明:

  • $binary_remote_addr:按客户端 IP 计数(比字符串形式的 $remote_addr 更省内存)
  • 10m:大约能记几万个 IP 的状态
  • rate=10r/s:每个 IP 平均每秒最多 10 个请求

三、在 location 上启用

针对需要保护的接口路径启用,并允许短时突发:

server {
    listen 80;
    server_name api.example.com;

    location /api/ {
        # burst=20:桶里最多再攒 20 个请求;nodelay:突发时立刻处理而不是排队
        limit_req zone=api_limit burst=20 nodelay;

        # 超限时返回 429(默认是 503)
        limit_req_status 429;

        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

改完后检查并重载:

sudo nginx -t && sudo systemctl reload nginx

四、用 ab 或 curl 快速验证

本地可用 ab 压一下(需安装 apache2-utils):

ab -n 200 -c 50 http://127.0.0.1/api/ping

观察响应里是否出现 429。也可以写个小循环:

for i in $(seq 1 40); do
  curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/api/ping
done

前若干次应是 200,超出 rate + burst 后开始出现 429。

五、常见调优建议

  1. 登录、发短信接口更严:可单独建一个更慢的 zone,例如 rate=1r/s、burst=3。
  2. 静态资源别限:location 只罩 /api/,避免把 CSS/图片一起限死。
  3. 反向代理后的真实 IP:若前面还有 CDN/负载均衡,要用 real_ip 模块把 $remote_addr 还原成用户 IP,否则所有人共享一个地址,限流会误伤。
  4. 日志:在 error_log 里能看到 limiting 相关记录,便于排查误拦。
  5. 不要只靠 Nginx:限流是第一道闸,业务层仍要做鉴权、验证码和幂等。

六、小结

limit_req_zone + limit_req 几行配置,就能给接口加上「按 IP 的平均速率 + 短时突发」保护,对入门级云主机特别实用。先从宽松参数起步,用压测观察 429 比例,再逐步收紧;同时记得处理好代理链上的真实客户端 IP。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。