Nginx 请求速率限制是一项内置功能,用于控制客户端在指定时间内可以发起的 HTTP 请求数量。无需安装其他软件,它就能减少针对 API、登录页面和资源密集型应用的滥用性流量。
本指南将介绍如何配置 Nginx 请求限制、安全地进行测试,并在 Ubuntu 服务器上启用防护。
Nginx 请求速率限制的工作原理是什么?
Nginx 使用 limit_req 模块跟踪传入的请求,通常按客户端 IP 地址进行跟踪。
例如,您可以将平均速率限制设为每秒五个请求,同时允许短时间内出现流量突增。超过允许的突增范围的请求则会被拒绝。
这有助于防止过量请求使应用不堪重负。
注意:请求速率限制有助于缓解某些第 7 层 HTTP 洪水攻击,但无法阻止使网络连接饱和的大规模网络层 DDoS 攻击。

前提条件
您需要一台已安装 Nginx 的 Ubuntu 服务器、具有 sudo 权限的 SSH 访问权限,以及一个现有的网站或应用。
如果您是首次设置 Nginx,请参阅我们的Nginx 反向代理教程。
在进行更改之前,请备份现有的网站配置。
步骤 1:定义速率限制区域
通过 SSH 连接到服务器。
在标准的 Ubuntu Nginx 安装环境中,创建一个新的配置文件:
sudo nano /etc/nginx/conf.d/rate-limit.conf
添加:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
此配置使用客户端 IP 地址跟踪请求,分配 10 MB 空间存储跟踪数据,并将每个 IP 的平均速率限制设为每秒五个请求。
limit_req_zone 指令必须放在 Nginx 的 http 上下文中。Ubuntu 的标准配置会在该上下文中包含 conf.d 文件。
保存文件。
步骤 2:为网站启用请求速率限制
打开现有的 Nginx 网站配置文件:
sudo nano /etc/nginx/sites-available/app.example.com
将文件名替换为实际的配置文件名。
对于运行在 3000 端口上的 HTTP 应用,受保护的 API 端点配置可以如下所示:
location /api/ {
limit_req zone=perip burst=10 nodelay;
limit_req_status 429;
limit_req_dry_run on;
proxy_pass http://127.0.0.1:3000;
}
以下是几个重要指令的作用:
limit_req:应用之前定义的限制。burst=10:允许短时间内出现超出平均速率的突增请求。nodelay:立即处理允许通过的突增请求。limit_req_status 429:在拒绝请求时返回 HTTP 429。limit_req_dry_run on:记录过量请求,但不阻止它们。
重要:请将这些速率限制指令添加到现有的匹配请求的 location 块中。不要创建重复的 location 块,也不要替换现有的后端配置。
这里显示的数值仅供参考。请根据应用的正常请求模式选择限制值。
步骤 3:验证 Nginx 配置
检查配置:
sudo nginx -t
如果测试通过,重新加载 Nginx:
sudo systemctl reload nginx
如果出现错误,请先修正,再重新加载。
步骤 4:测试速率限制
由于已启用试运行模式,请求暂时不会被拒绝。
监控 Nginx 错误日志:
sudo tail -f /var/log/nginx/error.log
在另一个终端中,向您控制的端点发送一小批突增测试请求:
for i in $(seq 1 15); do
curl -s -o /dev/null -w "%{http_code}\n" \
https://app.example.com/api/health
done
将 URL 替换为您自己的测试或预发布应用中可用的端点地址。
如果请求超出限制,Nginx 应在错误日志中记录包含 limiting requests, dry run 的消息。
由于尚未启用限制措施,应用应继续返回正常响应。
步骤 5:启用请求速率限制
检查测试结果并确认限制值合适后,从受保护的 location 块中移除以下指令:
limit_req_dry_run on;
再次验证配置并重新加载 Nginx:
sudo nginx -t
sudo systemctl reload nginx
此时,过量请求可能收到 HTTP 429 Too Many Requests 响应。
再次进行受控测试并检查响应状态码。具体结果取决于请求发送的时间间隔和您配置的限制值。
如何撤销更改
如果正常用户受到影响,请恢复以下指令:
limit_req_dry_run on;
验证配置并重新加载 Nginx。这样配置就会恢复为只监控、不拒绝请求的模式。
之后,您可以根据实际流量调整限制值。
重要事项:Nginx 位于 Cloudflare 或其他 CDN 后方时
当 Nginx 位于反向代理后方时,Nginx 看到的客户端 IP 可能属于代理服务器,而不是原始访问者。
如果不先纠正这一问题就按 IP 实施限制,可能会将互不相关的用户归为一组。
在按客户端实施限制之前,请使用 Nginx 的 Real IP 模块和代理服务商公布的 IP 地址范围,配置可信的客户端 IP 识别机制。
切勿信任访问者随意提供的 IP 请求头。
Nginx 请求速率限制能取代 DDoS 防护吗?
不能。Nginx 可以限制到达应用的过量 HTTP 请求,但无法过滤已经使服务器上游网络连接饱和的流量。
要获得更全面的防护,请将应用层控制措施与托管服务层面的攻击缓解措施结合使用。
我们的DDoS 防护指南介绍了网络层和应用层防御措施如何相互补充。
常见问题
是的。Nginx Open Source 包含 limit_req 模块。
会。设置过于严格可能导致正常请求被拒绝,尤其是在多个用户共用一个 IP 地址时。启用限制措施前,请先在试运行模式下进行测试。
适用。它尤其适合控制发送到 API 端点及其他资源密集型应用路径的过量请求。
总结
Nginx 提供内置的请求速率限制功能,无需安装其他软件即可帮助减少滥用性 HTTP 流量。
配置请求限制,在试运行模式下进行测试,并且只在检查结果后启用限制措施。
要全面保护服务器,请在实施请求速率限制的同时,采取适当的上游 DDoS 缓解措施。