Nginx限速

限速不仅仅是为了收取用户的费用,还有其他的原因。

限速介绍

  • 限速该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数。该请求可以简单到就是一个对于主页的GET请求或者一个登录表格的POST请求
  • 限速也可以用于安全目的上,比如防止暴力密码破解攻击。通过限制新来的请求速率,并且(结合日志)标记出目标URL来帮助防范DDos攻击。一般的说,限流是用在保护上游应用服务器不被在同一时刻的大量用户请求湮没。
  • 保护磁盘IO不被大量的数据流而破坏。

应用场景

  • DDos防御
  • 下载场景保护IO,防止硬盘坏死

Nginx限速原理
在这里插入图片描述
技术来自生活,限速原理就是上图的漏桶原理

算法思想是:
水(请求)从上方倒入水桶,从水桶下方流出(被处理);
来不及流出的水存放在水桶中(缓存),以固定流速流出;
水桶满后水溢出(丢弃)

这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃,也就是令牌桶算法

这个算法比较经典,但凡限速基本都会有它的身影。例如,网络中的QOS限速,就用到了令牌桶算法

Nginx限速实现方式
Nginx官方版本限制IP的连接和并发分别由两个模块:
limit_req_zone: 用来限制单位时间内的请求数,即限制速率。(下载速率限制)
limit_conn_zone: 用来限制同一时间连接数,即并发控制。

模块使用方法
·limit_req_zone 参数配置
·Syntax:limit_req zone=name [burst=number][nodelay];
·Default: —
·Context: http,server.location

限速案例一
# 基于IP对下载速率进行限制,限制每秒处理一次请求,对突发超过5个之后的请求放入缓存区
http {
 limit_req_zone $binary_remote_addr zone=zhouxiongxiong:10m rate=1r/s;
 //先在虚拟主机外设置一个桶
 server {
 location /abc {(对abc这个目录做限速)
         limit_req zone=zhouxiongxiong burst=5 nodelay;
         //对哪个目录进行限速
               }
        }
    }
------------------------------------------------------------------------
limit_req_zone $binary_remote_addr zone=zhouxiongxiong:10m rate=1r/s;
第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,
"binary_"的目的是缩写内存占用量,是限制同一客户端ip地址。
第二个参数:zone=zhouxiongxiong:10m表示生成一个大小为10M,名字为zone的内存区域,
用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒
1次,还可以有比如30r/m的。

limit_req zone=zhouxiongxiong burst=5 nodelay;
第一个参数:zone=zhouxiongxiong 设置使用哪个配置区域来做限制,与上面
limit_req_zone 里的name对应。
第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意
思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限
制的请求可以先放到这个缓冲区内。
第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直
接返回503,如果没有设置,则所有请求会等待排队。这个设置是为了提升用户体验,不让用户骂人
限速案例二
#按照案例一对abc目录进行限速
limit_req_zone $binary_remote_addr zone=zhouxiongxiong:10m rate=1r/s;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /abc {
            limit_req zone=zhouxiongxiong burst=5 nodelay;
        }

测试:
1) 创建目录abc

 [root@www conf] mkdir ../html/abc

2) 给abc的默认目录写入数据

 [root@www conf] echo abc > ../html/abc/index.html

3) 重新读取nginx配置文件

 [root@www conf] killall -s HUP nginx

4) 快速访问abc目录

[root@www conf] elinks http:192.168.43.128/abc --dump
   abc
[root@www conf] elinks http:192.168.43.128/abc --dump
   abc
[root@www conf] elinks http:192.168.43.128/abc --dump
   abc
[root@www conf] elinks http:192.168.43.128/abc --dump
                               An error occurred.

   Sorry, the page you are looking for is currently unavailable.
   Please try again later.

   If you are the system administrator of this resource then you should check
   the error log for details.

   Faithfully yours, nginx.

说明限制了快速的访问请求,不过并没有返回503页面,那是因为并没有配置文件中的错误重定向

5) 当将配置文件中的错误重定向页面屏蔽后观察结果

屏蔽错误重定向
       # error_page   500 502 503 504  /50x.html;
       # location = /50x.html {
       #    root   html;
       #}
root@www conf] elinks http:192.168.43.128/abc --dump
   abc
[root@www conf] elinks http:192.168.43.128/abc --dump
   abc
[root@www conf] elinks http:192.168.43.128/abc --dump
   abc
[root@www conf] elinks http:192.168.43.128/abc --dump
                      503 Service Temporarily Unavailable

   --------------------------------------------------------------------------

                                  nginx/1.15.5

出现了503页面,说明nodelay这个参数起作用了

输入:

[root@www conf] netstat -antpl

在这里插入图片描述
发现,仍有一些请求还没处理,还在缓存中等待。

限速案例三
#基于IP做连接限制 限制同一IP并发为1 下载速度为100k(下载限速)
 limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /abc {
            limit_conn addr 1;(同一时间并发能下载几个资源)
            limit_rate 100k;(下载速率是多少)
        }

测试:
1) 生成一个大文件来供测试

 [root@www conf]# dd if=/dev/zero of=../html/abc/bigfile bs=1M count=300
   记录了300+0 的读入
   记录了300+0 的写出
   314572800字节(315 MB)已复制,3.14889 秒,99.9 MB/

2) 切换到临时目录去下载这个文件

  [root@www tmp]# wget http://192.168.43.128/abc/bigfile

先尝试不限速的情况。即不重新加载限速配置的情况下的下载速度
在这里插入图片描述
发现在未限速的情况下,下载速度很快

重新加载配置文件,再下载相同的文件,观察下载过程
在这里插入图片描述
发现下载速度被限制在了100Kb/s

3)接着在下载文件的同时再开一个连接,也下载这个文件
在这里插入图片描述
发现abc目录拒绝了下载的请求,说明只能有一个连接下载文件

还有一个命令,可以下载到多少M后再限速,不过并没有什么实际意义,就粘在这里了,有兴趣的同学可以下去自己试试

limit_conn addr 1;
limit_rate 100k;
limit_rate_after 250m;//这个就是下载到多少M后再限速到100kb   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值