Nginx限速

本文深入解析Nginx的限速机制,包括其在防止DDoS攻击、保护磁盘I/O及优化用户体验方面的应用。文章详细介绍了Nginx限速的实现方式,如limit_req_zone和limit_conn_zone模块的配置与使用,以及通过案例演示如何具体实施限速策略。

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

限速介绍

  • 限速该特性可以限制某个用户在一个给定时间段内能够产生的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   
Nginx 提供了多种限速方法和配置方式,以下是一些常见的限速配置: ### 基于速率的限速配置 #### 简单速率限制 可以通过 `limit_rate` 指令直接限制下载速度。例如,若要对所有请求进行限速,可在 `server` 块或 `location` 块中添加如下配置: ```nginx location / { limit_rate 100k; # 限定下载速度为 100k } ``` #### 按流量大小后限速 使用 `limit_rate_after` 和 `limit_rate` 结合,可实现先让一定流量通过,之后再进行限速。例如,对 `/upload/` 路径下的资源,流量超过 1000k 后开始限速: ```nginx location /upload/ { limit_rate_after 1000k; limit_rate 100k; } ``` 此配置针对该路径下的视频等资源,先让 1000k 流量通过,之后以 100k 的速度进行限速 [^1]。 ### 基于并发连接数的限速配置 #### 限制同一 IP 的并发连接数 通过 `limit_conn_zone` 和 `limit_conn` 指令,可限制同一 IP 的并发连接数。例如: ```nginx limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /abc { limit_conn addr 1; # 限制同一 IP 并发为 1 limit_rate 100k; # 下载速度为 100K } } ``` 这里 `limit_conn_zone` 定义了一个存储会话状态的共享内存区域,`limit_conn` 用于指定每个 IP 的最大连接数 [^4]。 ### 针对突发请求的限速配置 使用 `limit_req_zone` 和 `limit_req` 指令可对突发请求进行限速。例如,每处理一次请求,对突发超过 5 个以后的请求放入缓存区: ```nginx http { limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s; server { location /search/ { limit_req zone=baism burst=5 nodelay; } } } ``` 其中 `limit_req_zone` 定义了一个请求速率限制区域,`limit_req` 用于应用这个速率限制 [^4]。 ### 流媒体视频流限速配置 对于流媒体视频流,可采用如下配置: ```nginx http { include mime.types; default_type application/octet-stream; server_tokens off; sendfile on; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 81; server_name localhost; charset utf-8; location / { root html; index index.html index.htm; } location /a { limit_conn addr 1; # 同一 IP 同一时间下载连接数 limit_rate 100k; # 下载最大速率 limit_rate_after 250m; # 下载到多少时开始限速 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ``` 在这个配置中,`/a` 路径下的视频下载,会限制同一 IP 同一时间只有 1 个下载连接,下载到 250m 时开始限速,最大下载速率为 100k [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值