美文网首页
nginx--preaccess阶段

nginx--preaccess阶段

作者: 温岭夹糕 | 来源:发表于2020-06-06 23:01 被阅读0次

    preaccess阶段主要进行限速

    1.limit_conn模块(默认不编译进nginx)

    该模块是对连接客户端的限制。即对同一个ip的连接限制
    文档:limit_conn模块
    nginx配置

    在http块中定义
        #定义共享内存大小
        limit_conn_zone $binary_remote_addr zone=addr:10m;
    在server或location中定义
           location / {
              limit_conn addr 10; 
            #单个最大连接数
              limit_rate 50;
             #限速
              limit_conn_log_level warn;
              #记录日志
              limit_conn_status 500;
              #超出响应500状态码       
    }
    
    

    进行ab多次压测
    ab -n 15 -c 15 域名
    结果显示

    Concurrency Level: 5
    Time taken for tests: 20.021 seconds
    Complete requests: 5
    Failed requests: 0
    Write errors: 0
    Total transferred: 4225 bytes
    HTML transferred: 3060 bytes
    ab -n 200 -c 200 域名

    Concurrency Level: 200
    Time taken for tests: 20.020 seconds
    Complete requests: 200
    Failed requests: 10
    (Connect: 0, Receive: 0, Length: 10, Exceptions: 0)
    Write errors: 0
    Non-2xx responses: 190
    貌似连接数小的时候就不起作用了

    若去掉限速后,甚至完全不起作用???
    Concurrency Level: 200
    Time taken for tests: 1.264 seconds
    Complete requests: 200
    Failed requests: 0
    Write errors: 0
    Total transferred: 169000 bytes
    HTML transferred: 122400 bytes
    Requests per second: 158.26 [#/sec] (mean)
    Time per request: 1263.722 [ms] (mean)

    总结:限制客户端每秒连接数不好用

    2.limit_req模块(默认编译进nginx)

    文章参考:https://blog.csdn.net/hellow__world/article/details/78658041
    官方文档

    nginx配置

    http块下
    limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;
    #每分种只处理同一个ip的2个请求(平均),若超过则响应503状态码
           location / {
              limit_req zone=one;
              #limit_req zone=one burst=3 nodelay;
           }
      
    

    参数介绍:

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

    进行ab压测
    Concurrency Level: 10
    Time taken for tests: 0.002 seconds
    Complete requests: 10
    Failed requests: 9
    (Connect: 0, Receive: 0, Length: 9, Exceptions: 0)
    Write errors: 0
    Non-2xx responses: 9
    Total transferred: 7037 bytes
    HTML transferred: 5058 bytes
    Requests per second: 5959.48 [#/sec] (mean)
    Time per request: 1.678 [ms] (mean)
    Time per request: 0.168 [ms] (mean, across all concurrent requests)
    Transfer rate: 4095.39 [Kbytes/sec] received

    生效,还不错
    修改配置

           location / {
              #limit_req zone=one;
              limit_req zone=one burst=3 nodelay;
           }
    

    Concurrency Level: 10
    Time taken for tests: 0.002 seconds
    Complete requests: 10
    Failed requests: 6
    (Connect: 0, Receive: 0, Length: 6, Exceptions: 0)
    Write errors: 0
    Non-2xx responses: 6
    虽然请求被延迟,但也有效果

    注意点

    limit_req模块的执行在limit_conn模块之前,所以当超出限制的连接数到来后,后面响应的是limit_req的503响应码

    3.其他

    文档http://nginx.org/en/docs/http/ngx_http_core_module.html#limit_except
    limit_rate 限速多少b
    limit_rate_after 设置多少bytes过后将启动limit计数,如果小于此值则不限速
    limit_except 方法 限制除了该方法外的方法

    location / {
        limit_except GET {  
       #除了GET以外方法都收到下面条款限制(但是GET已经包含HEAD)
           deny all;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:nginx--preaccess阶段

          本文链接:https://www.haomeiwen.com/subject/ljaftktx.html