网站遇到频繁刷新、暴力登录或大量接口请求时,CPU和数据库连接可能被持续占用,正常访问也会受到影响。针对这类情况,可以在Nginx中设置请求限速,减少单个来源短时间内向后端发送的请求。
Nginx内置请求限速模块,不需要另外安装插件。下面以Ubuntu服务器为例,介绍限速区域、网站规则和测试方法。
需要注意,Nginx限速主要用于控制应用层请求。如果攻击流量已经占满服务器带宽,仍需要上游流量清洗等防护,不能靠几条Nginx配置解决。本文也不代表RackNerd普通VPS默认包含高防服务。
点击访问:RackNerd VPS官网
RackNerd美国KVM VPS新一轮促销方案(限量销售,售完即止):
| 方案 | CPU | 内存 | SSD存储 | 月流量 | 端口 | 价格 | 购买链接 |
| 1GB KVM VPS | 1核 | 1GB | 20GB SSD | 3TB | 1Gbps | $21.99/年 | 点击购买 |
| 2GB KVM VPS | 2核 | 2GB | 35GB SSD | 5TB | 1Gbps | $35.99/年 | 点击购买 |
| 4GB KVM VPS | 3核 | 4GB | 60GB SSD | 7TB | 1Gbps | $59.99/年 | 点击购买 |
| 6GB KVM VPS | 6核 | 6GB | 100GB SSD | 12TB | 1Gbps | $89.99/年 | 点击购买 |
| 8GB KVM VPS | 7核 | 8GB | 150GB SSD | 20TB | 1Gbps | $119.99/年 | 点击购买 |
一、什么是请求限速
请求限速用于控制客户端访问网站的频率。例如,将每个IP的平均请求速率设置为每秒10次,超出部分根据配置延迟处理或拒绝。
Nginx采用漏桶算法执行限速,按照设定速率控制请求处理节奏。它并非简单地每到一秒就重新开始计数。
这种方式可以限制单个来源的过量访问,但多名用户共用同一个公网IP时,也可能受到同一条规则影响。因此,限速阈值需要结合网站实际访问情况调整。
二、了解两个主要配置指令操作前,确认服务器已经安装Nginx,并备份准备修改的配置文件。
本次主要使用两个指令。
| 指令 | 作用 |
| limit_req_zone | 定义共享内存区域、限速依据和请求速率 |
| limit_req | 将规则应用到网站或具体路径 |
其中,limit_req_zone需要放在http配置块内,不能直接写入location。
三、定义请求限速区域编辑Nginx主配置文件,常见路径如下。
sudo nano /etc/nginx/nginx.conf
在已有的http块内部加入下面这一行。
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
不要覆盖整个配置文件,也不要重复创建http块。
这条规则包含三个部分。
- $binary_remote_addr使用客户端IP作为限速依据,以二进制形式保存地址;
- zone=one:10m创建名为one的共享内存区域,大小为10MB;
- rate=10r/s将平均处理速率设置为每个IP每秒10次请求。
这里的10MB用于记录限速状态,并非带宽或流量额度。每秒10次也是按IP计算,不是整台服务器只能处理10次请求。
四、在网站中应用限速规则打开实际生效的网站配置。Ubuntu常见的软件包安装环境中,配置可能位于以下目录。
/etc/nginx/sites-available/
下面假设网站已经通过Nginx转发到本机8080端口。将限速指令加入原有的对应location块,并保留网站已有的转发设置。
location / {
limit_req zone=one burst=20 nodelay;
limit_req_status 429;
proxy_pass http://127.0.0.1:8080;
}
各项参数的含义如下。
| 参数 | 作用 |
| zone=one | 使用前面定义的限速区域 |
| burst=20 | 允许一定数量的超额突发请求 |
| nodelay | 突发额度内的请求立即处理,超出可用额度后拒绝 |
| limit_req_status 429 | 将限速拒绝状态码设置为429 |
如果不设置limit_req_status,Nginx默认返回503。去掉nodelay后,突发额度内的超额请求会被延迟处理。
8080只是示例端口,不能直接套用。 如果网站通过PHP、静态文件或其他方式处理请求,应保留原来的配置,只加入需要的限速指令。
如果网站中已经存在location /,直接修改原配置,不要再添加一个重复的同名配置块。
五、检查配置并重载Nginx修改完成后,先检查配置语法。
sudo nginx -t
确认检查通过,再重载Nginx。
sudo systemctl reload nginx
如果检查失败,先根据提示修正问题,不要继续重载。
1、确认普通访问正常先向自己的测试页面发送一次请求,将示例域名替换成实际地址。
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/
检查返回状态是否符合预期。如果此时已经出现502、503等错误,应先排查网站或后端服务,不能直接认为是限速导致的。
2、进行小规模并发测试可以使用ApacheBench测试自己拥有或获准测试的服务器。Ubuntu中可通过以下命令安装。
sudo apt update sudo apt install apache2-utils
选择测试环境中的轻量页面,不要使用下单、支付或其他会产生业务数据的接口。
ab -n 100 -c 20 https://example.com/
该命令总共发送100次请求,并发数为20。测试会占用资源,生产环境应谨慎执行。
按照本文配置,触发限速拒绝的请求应返回429。测试后还要检查Nginx日志,确认请求确实因为限速被拒绝,而非后端服务出错。
sudo tail -n 100 /var/log/nginx/error.log
如果网站单独设置了日志路径,请查看对应文件。
ApacheBench中的非2xx响应数量,不能单独证明限速已经正确生效。需要结合具体状态码和日志判断。
六、使用CDN时先确认客户端IP如果网站前面接入了CDN或负载均衡,Nginx看到的连接地址可能是这些中间节点的IP。直接按这个地址限速,多名访客就可能被算到同一个来源下。
这种环境需要正确配置真实客户端IP。使用Real IP模块时,只信任实际使用的CDN或负载均衡地址,并设置对应的请求头,不要无条件信任任意客户端提交的IP信息。
配置后,先查看访问日志中的客户端地址是否正确,再测试限速规则。
七、正式使用时如何调整本文的每秒10次请求和20个突发额度仅用于演示,不是所有网站都适用的标准。
上线前,建议检查首页加载、登录、搜索和API调用是否正常。全站限速可能同时影响图片、脚本等资源,如果只想保护某个接口,应将规则放到实际处理该接口的配置中。
调整后,还要观察429响应是否明显增加。如果正常用户频繁被拒绝,先检查以下内容。
- 请求速率是否设置得过低;
- 突发额度是否足够;
- 客户端IP是否识别正确;
- 是否有大量用户共用同一个公网IP;
- 限速范围是否包含了不需要限制的资源。
不要只看异常请求有没有被拦住,正常访问是否受到影响同样重要。
八、使用RackNerd VPS配置NginxRackNerd Linux KVM VPS提供root管理权限,可以自行安装Nginx、修改网站配置和查看日志,适合部署网站及进行服务器管理操作。
已经在RackNerd VPS上运行网站的用户,可以先对一个测试路径设置限速,确认配置和日志正常,再根据实际访问情况扩大使用范围。
选择VPS时,仍应先满足网站程序、数据库和正常访问量的资源需求。请求限速可以减少过量访问的影响,但不能替代服务器扩容,也不能当作大规模DDoS攻击的完整防护方案。
相关阅读:
《RackNerd VPS部署Netdata教程:集中监控Linux服务器性能》
《RackNerd VPS搭建Wiki.js知识库教程(Docker版)》
《RackNerd VPS搭建Mail-in-a-Box邮件服务器教程》
(本文由美国主机侦探原创,转载请注明出处“美国主机侦探”和原文地址!)
微信扫码加好友进群
主机优惠码及时掌握
QQ群号:938255063
主机优惠发布与交流





