详解Nginx http资源请求限制(三种方法)
作者:alpha 的博客 发布时间:2021-09-29 20:51:43
前置条件:nginx 需要有 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,可以使用命令 2>&1 nginx -V | tr ' ' '\n'|grep limit 检查有没有相应模块,如果没有请重新编译安装这两个模块。
测试版本为:nginx版本为1.15+
限制链接数
1.使用 limit_conn_zone 指令定义密钥并设置共享内存区域的参数(工作进程将使用此区域来共享密钥值的计数器)。第一个参数指定作为键计算的表达式。第二个参数 zone 指定区域的名称及其大小:
limit_conn_zone $binary_remote_addr zone=addr:10m;
2.在 location {} , server {} 或者 http {} 上下文中使用 limit_conn 指令来应用限制,第一个参数为上面设定的共享内存区域名称,第二个参数为每个key被允许的链接数:
location /download/ {
limit_conn addr 1;
}
使用 $binary_remote_addr 变量作为参数的时候,是基于 IP 地址的限制,同样可以使用 $server_name 变量进行给定服务器连接数的限制:
http {
limit_conn_zone $server_name zone=servers:10m;
server {
limit_conn servers 1000;
}
}
限制请求速率
速率限制可用于防止 DDoS,CC 攻击,或防止上游服务器同时被太多请求淹没。该方法基于 leaky bucket 漏桶算法,请求以各种速率到达桶并以固定速率离开桶。在使用速率限制之前,您需要配置 "漏桶" 的全局参数:
key - 用于区分一个客户端与另一个客户端的参数,通常是变量
shared memory zone - 保留这些密钥状态的区域的名称和大小(即 "漏桶")
rate - 每秒请求数(r/s)或每分钟请求数(r/m)("漏桶排空")中指定的请求速率限制。每分钟请求数用于指定小于每秒一个请求的速率。
这些参数使用 limit_req_zone 指令设置。该指令在 http {} 级别上定义 - 这种方法允许应用不同的区域并请求溢出参数到不同的上下文:
http {
#...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}
使用此配置,将创建大小为 10m 字节,名称为 one 的共享内存区域。该区域保存使用 $binary_remote_addr 变量设置的客户端 IP 地址的状态。请注意, $remote_addr 还包含客户端的 IP 地址,而 $binary_remote_addr 保留更短的 IP 地址的二进制表示。
可以使用以下数据计算共享内存区域的最佳大小: $binary_remote_addr IPv4 地址的值大小为 4 个字节,64 位平台上的存储状态占用 128 个字节。因此,大约 16000 个 IP 地址的状态信息占用该区域的 1m 字节。
如果在 NGINX 需要添加新条目时存储空间耗尽,则会删除最旧的条目。如果释放的空间仍然不足以容纳新记录,NGINX 将返回 503 Service Unavailable 状态代码,状态码可以使用 limit_req_status 指令重新定义。
一旦该区域被设置,你可以使用 NGINX 配置中的任何地方使用 limit_req 指令限制请求速率,尤其是 server {} , location {} 和 http {} 上下文:
http {
#...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
#...
location /search/ {
limit_req zone=one;
}
}
}
使用如上配置,nginx 在 /search/ 路由下将每秒处理不超过 1 个请求,延迟处理这些请求的方式是总速率不大于设定的速率。NGINX 将延迟处理此类请求,直到 "存储区"(共享存储区 one)已满。对于到达完整存储桶的请求,NGINX 将响应 503 Service Unavailable 错误(当 limit_req_status 未自定义设定状态码时)。
限制宽带
要限制每个连接的带宽,请使用以下 limit_rate 指令:
location /download/ {
limit_rate 50k;
}
通过此设置,客户端将能够通过单个连接以最高 50k/秒 的速度下载内容。但是,客户端可以打开多个连接跳过此限制。因此,如果目标是阻止下载速度大于指定值,则连接数也应该受到限制。例如,每个 IP 地址一个连接(如果使用上面指定的共享内存区域):
location /download/ {
limit_conn addr 1;
limit_rate 50k;
}
要仅在客户端下载一定数量的数据后施加限制,请使用该 limit_rate_after 指令。允许客户端快速下载一定数量的数据(例如,文件头 - 电影索引)并限制下载其余数据的速率(使用户观看电影而不是下载)可能是合理的。
limit_rate_after 500k;
limit_rate 20k;
以下示例显示了用于限制连接数和带宽的组合配置。允许的最大连接数设置为每个客户端地址 5 个连接,这适用于大多数常见情况,因为现代浏览器通常一次最多打开 3 个连接。同时,提供下载的位置只允许一个连接:
http {
limit_conn_zone $binary_remote_address zone=addr:10m
server {
root /www/data;
limit_conn addr 5;
location / {
}
location /download/ {
limit_conn addr 1;
limit_rate_after 1m;
limit_rate 50k;
}
}
}
内容翻译自 nginx 请求限制部分文档 ,稍微调整了一点语义。
来源:https://alpha2016.github.io/2019/05/22/Nginx-http资源请求限制/
猜你喜欢
- 一、什么是虚拟主机?所谓虚拟主机,就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Inte
- Exchange Server 2007 日志规则新日志向导日志报告中包括的内容您是否曾经不得不记录您与某位特定用户之间往来的电子邮件,而结
- 看到有论坛反应会员注册邮箱验证不能使用,经过这几天的测试,会员注册验证没有多大问题,刚看到论坛有提供解决方案的,看了一下,只是争对UFT8的
- 盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的
- 又有机会爆料国内 Web 2.0 网站的架构了。这次是 Yupoo! 。非正式的采访了一下 Yupoo!(又拍网) 的创建人之一的 阿华(沈
- 2010年对于网络赚钱人士来说是不平凡的一年,在这里一年中网赚人士迎来了少有的寒冬,不管是网站站长,还是专业的拉下线网赚模式,无论是哪种网赚
- 看到这个标题,想必大家会不屑一顾,“需要分析IIS日志吗?我有流量统计、51yes、cnzz、51la等等一大堆,功能全面,用起来也方便”,
- 本文介绍的将是一种“奇特”的挂马方式:ARP挂马。与前文介绍的服务器端网站挂马方式不同的是,ARP挂马并不是针对网站服务器端,也就是说,AR
- 安装步骤1.创建虚拟机2.选择【自定义(高级)】,点击【下一步】。3.点击【下一步】4.选择【稍后安装操作系统】,点击【下一步】。5.操作系
- 就在Windows 7正式发售的前一天,微软放出了两个重要工具:软硬件兼容中心(Compatibility Center)、升级顾问(Upg
- 西方的传统节日万圣节,是一个神秘又有趣的节日,同样是西方故事背景的《商业大亨》自由城,也准备了趣味的万圣节活动,以及南瓜头像南瓜装,与各位大
- 你的服务器上是否存有一些不能随意公开的重要数据呢?当然有吧。最近,偏偏服务器遭受的风险又特别大,越来越多的病毒、心怀不轨的黑客,以及那些商业
- 一、为何要DDoS?随着Internet互联网络带宽的增加和多种DDoS黑客工具的不断发布,DDoS拒绝服务攻击的实施越来越轻易,DDoS攻
- 第一步:查看当前内核rew $ uname -aLinux rew 4.15.0-42-generic #45~16.04.1-Ubuntu
- 似乎正应了那句“你不理财,财不理你!”,从来没有指望google adsense能给我赚到钱,事实上它也没给我带来财富。 八月份的
- 核心提示: 2.0的疲势在于盈利模式的不清晰,盈利模式的不清晰,又在于它没有一张清晰的脸,也就是首页。web2.0,有如digg、delic
- foreach($kws as $k) { $k = trim($k); if($k!=”") { if($i > $max
- 一、安装PHP4我们需要安装的是win32版本,下载当然也是win32版本 php4.3.0-win32.zip1、下载后,解压到c:\ph
- 其实,Windows2000 含有很多的安全功能和选项,如果你合理的配置它们,那么windows 2000将会是一个很安全的操作系统。具体清
- 1)善用域名后缀(.com/.cn/.info)国别域名可以告诉谷歌和其他搜索引擎,你的网站所服务的对象来自特定的国家,这样你的网站在这个国