Gname

广告

DangYun

广告

RackNerd VPS建站教程:使用Nginx限制恶意请求

美国云服务器推荐

网站遇到频繁刷新、暴力登录或大量接口请求时,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配置Nginx

RackNerd 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群

QQ群号:938255063

主机优惠发布与交流

温馨提示:

1、本站部分图片来源于互联网,如有侵权请联系删除。邮箱:2942802716#qq.com(#改为@)

2、本文评论没有专人回复,如果您有问题请到美国主机侦探论坛提问!

3、美国主机侦探免费为您提供美国主机购买咨询。

RakSmart美国服务器
下一篇
RackNerd VPS建站教程:使用Nginx限制恶意请求
已经没有了
返回顶部