Nginx限流

Nginx限流主要分为两种方式:限制访问频率 / 限制并发连接数

为什么需要限流?

开源人员可以通过限流限制访问速度来防止外部暴力扫描,或者减少密码被暴力破解的可能性。也可以解决流量突发问题(如线上活动导致访问量突增)。用一句话来概括就是说限流是用于保护服务器不会因为承受不住同一时刻的大量并发请求而宕机。接下来我们分别来看看Nginx的两种限流方式

Nginx限流漏桶算法和令牌桶算法的区别

两种算法都能够限制数据传输速率,但令牌桶还允许某种程度的突发传输。因为令牌桶算法只要令牌桶中存在令牌,那么就可以突发的传输对应的数据到目的地,所以更适合流量突发的情形下进行使用。

Nginx限流漏桶方法

定义:漏桶算法是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。也就是我们刚才所讲的情况。漏桶算法提供的机制实际上就是刚才的案例:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。

特点:请求以恒定速率流出。当请求进来时放入桶内,遵循先进先出的规则,以设定的速率恒定流出,当桶放满时,不再接收请求。

Nginx限流令牌桶方法

定义:令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。

特点:请求以恒定速率流入,往桶内以恒定速率往桶里注入令牌,每个请求进来时会获取令牌,若没有获取到令牌则会放弃此请求,当桶满后不再注入令牌。

nginx使用漏桶算法实现限流,当同一ip(一般使用ip限流,$binary_remote_addr)进入网关时,放入桶内,以恒定速率流出,若设定速率 rate=20r/s;则以0.05s一个的速率流出。

contentRateLimit:设定空间大小,用于储存桶请求,1M能存储16000 IP地址的访问信息。

在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发。这个时候接口进行限流是非常有必要的,而限流是Nginx最有用的特性之一,而且也是最容易被错误配置的特性之一。

# 参数详解:
    # limit_req_zone: 定义了流量限制相关的参数
    # $binary_remote_addr: 通过IP地址来限流
    # $server_name: 通过域名(服务器)来限制请求速率
    # zone: 用于存储每个IP地址状态以及被限制请求URL访问频率的共享内存区域。
    #       iplimit就是这个内存区域,20m是指这块内存区域的大小
    # rate: 最大请求速率。10r/s 表示每秒最大请求数不超过10个,600/m 表示每分钟最大请求数不超过600个
    limit_req_zone $binary_remote_addr zone=iplimit:20m rate=10r/s;

根据ip地址限制流量

           

 # 参数详解:
            # burst: 定义了超出 limit_req_zone 指定速率的情况下,客户端还能发起多少请求。
            #        超出的请求将会被放入burst 设置的队列中,默认情况下每隔100ms从队列中获取一个请求进行处理。
            #        超出队列的请求数将直接拒绝处理返回503
            # nodelay: 延迟模式,nodelay不会按照100ms固定的速率延迟处理,而是会立马处理burst桶中的请求
            limit_req zone=iplimit burst=20 nodelay;
            # 流量限制日志记录,Nginx以error级别来记录被拒绝的请求
            limit_req_log_level warn;
            # 客户端超过配置的流量限制时,Nginx默认响应状态码为503(Service Temporarily Unavailable)。
            # 可以使用limit_req_status指令来设置为其它状态码,但状态码强制限制在400和599之间
            #limit_req_status 503;
            #limit_conn_status 503;
            # 每个客户端IP最多持有连接数
            limit_conn perip 1;
            # 以上的配置都是基于客户端进行限流,不同客户端之间互不影响,也可以统一限制服务端的请求总数
            # perserver 后台服务最多处理的并发连接数,只有当 request header 被后端server处理后,这个连接才进行计数
            limit_conn perserver 2;

突发流量限制访问频率(令牌桶)

http {
    limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s;
}
server {
    location / {
        limit_req zone=myLimit burst=5 nodelay;
        rewrite / http://www.xxx.com permanent;
    }
}

可以看到我在原有的location中的limit_req指令中添加了burst=5 nodelay,如果没有添加nodelay参数,则可以理解为预先在内存中占用了5个请求的位置,如果有5个突发请求就会按照200ms去依次处理请求,也就是1s内把5个请求全部处理完毕。如果1s内有新的请求到达也不会立即进行处理,因为紧急程度更低。这样实际上就会将额外的5个突发请求以200ms/个去依次处理,保证了处理速率的稳定,所以在处理突发流量的时候也一样可以正常处理。如果添加了nodelay参数则表示要立即处理这5个突发请求。

限制并发连接数(漏桶)

Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:

http {
    limit_conn_zone $binary_remote_addr zone=myip:10m;
    limit_conn_zone $server_name zone=myServerName:10m;
}
server {
    location / {
        limit_conn myip 10;
        limit_conn myServerName 100;
        rewrite / http://www.xxx.com permanent;
    }
}

上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。

当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。

 

 

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
宝塔面板是一款开源的服务器管理面板,通过宝塔可以轻松管理服务器上的各种资源及服务。而nginx则是一款高性能的Web服务器,通过nginx可以有效地提升网站的性能。在建立一个高流量的网站或者服务时,往往需要对访问量进行限制来保证服务器的稳定性,而nginx有着丰富的限流配置功能,可以通过宝塔面板上的配合来实现。 要实现nginx限流功能,主要是通过nginx里面的limit_req模块来完成。宝塔面板上的nginx限流功能主要是针对limit_req模块进行配置的。其具体配置方式是在宝塔面板上找到网站设置,在配置选项中选择nginx高级配置,然后在location中添加limit_req配置即可。这里需要简单介绍一下nginx limit_req模块的参数配置:limit_req_zone、limit_req等。其中limit_req_zone参数 mainly是配置一些基本变量,用于nginx来记录请求的状态。此外,还通过limit_req参数来控制请求速度,该参数可包括limit_req_zone、rate和burst等。 总体来说,宝塔nginx限流操作相对简单,只需要按照上述步骤进行一些简单配置,即可实现对服务器的流量进行限制。但需要注意的是,具体的限流配置应该根据实际的情况进行调整,这样才能实现最佳的限流效果。另外,在限流时,还要注意用户的访问体验,适度限制,以免出现过度限制的情况,将用户严重的限制在界外。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值