nginx限流

limit_conn_zone限定IP最大连接数:


limit_req_zone限定IP最大请求数:

 ab -n   全部请求数   -c   并发数   测试 url

ab -n 100 -c 10 http://m.xxxx.com/

-r              Don't exit on socket receive errors.                 # 在遇到socket接收错误后,不退出测试
-s timeout      Seconds to max. wait for each response    # 最大超时时间,默认30s
                    Default is 30 seconds
-k              Use HTTP KeepAlive feature                          # keep-alive保持连接


参考:

限制请求速率:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

http请求限制:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

stream转发请求限制:http://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html

实际操作:

nginx中该模块的使用配置示例l

    imit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
     
    server {
     
        location  /search/ {
     
            limit_req zone=one burst=5 nodelay;
     
        }

第一段配置参数:

    $binary_remote_addr :表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址
    zone=one:10m:表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
    rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,即每秒只处理一个请求,还可以有比如30r/m的,即限制每2秒访问一次,即每2秒才处理一个请求。

 

第二段配置参数:

    zone=one :设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
    burst=5:重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
    nodelay:
        如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s)
        如果没有设置,则所有请求会依次等待排队

 

     这里的burst参数主要采用了令牌桶算法。令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据数目,并允许突发数据的发送。

     令牌桶这种控制机制基于令牌桶中是否存在令牌来指示什么时候可以发送流量。令牌桶中的每一个令牌都代表一个字节。如果令牌桶中存在令牌,则允许发送流量;如果令牌桶中不存在令牌,则不允许发送流量。因此,如果突发门限被合理地配置并且令牌桶中有足够的令牌,那么流量就可以以峰值速率发送。令牌桶算法的基本过程如下:

 

    假如用户配置的平均发送速率为10r/s,则每隔0.1秒一个令牌被加入到桶中;
     
    假设桶最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃;
     
    当一个n个字节的数据包到达时,就从令牌桶中删除n个令牌,并且数据包被发送到网络;
     
    如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在流量限制之外;
     
    算法允许最长b个字节的突发,但从长期运行结果看,数据包的速率被限制成常量r。对于在流量限制外的数据包可以以不同的方式处理:
        它们可以被丢弃;
        它们可以排放在队列中以便当令牌桶中累积了足够多的令牌时再传输;
        它们可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃。

 

注意:令牌桶算法不能与另外一种常见算法“漏斗算法(Leaky Bucket)”相混淆。这两种算法的主要区别在于“漏斗算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输数据外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。(这部分是网上很多博客都错误的地方)

看下面的链接
https://blog.csdn.net/hellow__world/article/details/78658041

原文地址:https://www.cnblogs.com/keta/p/14777969.html