Introducing ZYNOO General Purpose & CPU Optimized Servers   Learn More >

如何在 Ubuntu 上配置 Nginx 请求速率限制

Nginx 请求速率限制是一项内置功能,用于控制客户端在指定时间内可以发起的 HTTP 请求数量。无需安装其他软件,它就能减少针对 API、登录页面和资源密集型应用的滥用性流量。

本指南将介绍如何配置 Nginx 请求限制、安全地进行测试,并在 Ubuntu 服务器上启用防护。

Nginx 请求速率限制的工作原理是什么?

Nginx 使用 limit_req 模块跟踪传入的请求,通常按客户端 IP 地址进行跟踪。

例如,您可以将平均速率限制设为每秒五个请求,同时允许短时间内出现流量突增。超过允许的突增范围的请求则会被拒绝。

这有助于防止过量请求使应用不堪重负。

注意:请求速率限制有助于缓解某些第 7 层 HTTP 洪水攻击,但无法阻止使网络连接饱和的大规模网络层 DDoS 攻击。

如何配置 Nginx 请求速率限制

前提条件

您需要一台已安装 Nginx 的 Ubuntu 服务器、具有 sudo 权限的 SSH 访问权限,以及一个现有的网站或应用。

在进行更改之前,请备份现有的网站配置。

步骤 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 请求,但无法过滤已经使服务器上游网络连接饱和的流量。

要获得更全面的防护,请将应用层控制措施与托管服务层面的攻击缓解措施结合使用。

常见问题

Nginx 请求速率限制是免费的吗?

是的。Nginx Open Source 包含 limit_req 模块。

Nginx 请求速率限制会阻止正常访问者吗?

会。设置过于严格可能导致正常请求被拒绝,尤其是在多个用户共用一个 IP 地址时。启用限制措施前,请先在试运行模式下进行测试。

Nginx 请求速率限制适用于 API 吗?

适用。它尤其适合控制发送到 API 端点及其他资源密集型应用路径的过量请求。

总结

Nginx 提供内置的请求速率限制功能,无需安装其他软件即可帮助减少滥用性 HTTP 流量。

配置请求限制,在试运行模式下进行测试,并且只在检查结果后启用限制措施。

要全面保护服务器,请在实施请求速率限制的同时,采取适当的上游 DDoS 缓解措施。

Table of Content

Nginx 反向代理接收网站访客的请求,并将其转发到另一台服务器或应用程序。它通常用于让运行在 3000 等端 […]

Nginx 502 网关错误通常意味着 Nginx 未能从上游服务器(如 PHP-FPM、Node.js 或其 […]

当充当网关或代理的服务器未能及时收到另一台服务器的响应时,就会出现 504 网关超时错误。这通常发生在网站后端 […]

Build your next project with ZYNOO

From your first website to demanding applications, choose the resources and control you need.

Shared Hosting

Start your blog or business website with cPanel, LiteSpeed and CloudLinux.

VPS Hosting

Grow your websites and applications with NVMe storage, KVM virtualization and full root access.

Dedicated Servers

Power demanding projects with your own physical server, dedicated resources and control over your environment.

滚动至顶部