zoukankan      html  css  js  c++  java
  • Nginx访问限制模块limit_conn_zone 和limit_req_zone配置使用

    nginx可以通过limit_conn_zone 和limit_req_zone两个组件来对客户端访问目录和文件的访问频率和次数进行限制,另外还可以善用进行服务安全加固,两个模块都能够对客户端访问进行限制,具体如何使用要结合公司业务环境进行配置。

       如能善用此模块能够对 cc、ddos等此类的攻击进行有效的防御。

    一:nginx访问限制模块简介

    nginx限速配置指令

    1.

    指令

    limit_zone

    语法:limit_conn_zone $variable zone=name:size;

    默认值:no

    使用字段:http

    指令描述会话状态存储区域。

    会话的数目按照指定的变量来决定,它依赖于使用的变量大小和memory_max_size的值。

    2.

    指令

    limit_conn

    语法:limit_conn zone_name max_clients_per_ip

    默认值:no

    使用字段:http, server, location

    指令指定一个会话的最大同时连接数,超过这个数字的请求将被返回”Service unavailable” (503)代码。

    如下例:

    http {
      imit_conn_zone $binary_remote_addr zone=one:10m;
    
      ............
    
      server {
        listen       80;
        server_name  www.abc.com;
        location / {
          limit_conn one 1;  #这将指定一个地址只能同时存在一个连接。“one”与上面的对应,也可以自定义命名
          limit_rate 300k;
      }
    
    }

    limit_zone: 是针对每个IP定义一个存储session状态的容器.这个示例中定义了一个10m的容器,按照32bytes/session, 可以处理320000个session。

    limit_conn one 1:限制每个IP只能发起一个并发连接。

    limit_rate 300k: 对每个连接限速300k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。

    nginx限制访问频率配置指令

    3.

    指令

    limit_req_zone

    语法:limit_req_zone  $session_variable  zone=name:size  rate=rate

    默认值:none

    上下文:http

    命令解析:为session会话状态分配一个大小为size的内存存储区,限制了每秒(分、小时)只接受rate个IP的频率。

    4.

    指令

    limit_req

    语法:limit_req  zone=name  burst=burst  [nodelay]

    默认值:none

    使用字段:http、server、location

    命令解析:该指令用于指定使用的内存存储区(zone)名称,以及最大的突发请求数(burse)。如果请求的速率超过了limit_req_zone指令中设置的速率,这些请求将被延迟处理,在这种情况下,请求获得服务不可用信息,返回503状态码。

    如下例:

    http {
      limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    
      server {
        location /{
          limit_req   zone=one  burst=10;
        }
    }

    上面的参数会让nginx 每个IP一秒钟只处理一个请求,但是仍然会有很多还在队列里面等待处理,这样也会占用很多tcp连接,从上面那条命令的结果中就能看得出来。

    如果加上nodelay就会立即丢弃

    limit_req zone=one burst=10 nodelay;

    5.

    指令

    limit_conn_log_level

    语法: limit_conn_log_level info | notice | warn | error

    默认值: error

    使用字段: http, server, location

    指定当连接数超过设定的最大连接数,服务器限制连接时的日志等级。

    二、实际应用

    如果作为代理服务器,我们需要限制每个用户的请求速度和链接数量,但是,由于一个页面有多个子资源,如果毫无选择的都进行限制,那就会出现很多不必要的麻烦,如:一个页面有40个子资源,那么如果想让一个页面完整的显示,就需要将请求速度和连接数都调整到40,以此达到不阻塞用户正常请求,而这个限制,对服务器性能影响很大,几百用户就能把一台nginx的处理性能拉下来。

    所以我们需要制定哪些请求是需要进行限制的,如html页面;哪些是不需要限制的,如css、js、图片等,这样就需要通过配置对应的location进一步细化。

    我们不对css、js、gif、png,jpg等进行连接限制,而对除此之外的链接进行限制

    http {
    
      limit_conn_zone $binary_remote_addr zone=addr:10m;
      limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
      ...
    
      server {
        ...
    
        location ~ .*.(gif|png|css|js|icon)$ {
          proxy_set_header Host $http_host;
          proxy_set_header X-Real_IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    
        location ~* .*.(jpeg|jpg|JPG)$ {
          proxy_set_header Host $http_host;
          proxy_set_header X-Real_IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
          #p_w_picpath_filter resize 480 -;
          #p_w_picpath_filter_jpeg_quality 50;
          #p_w_picpath_filter_sharpen 10;
          #p_w_picpath_filter_buffer 4M;
    
        }
    
        location / {
          proxy_set_header Host $http_host;
          proxy_set_header X-Real_IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          #limit
          limit_conn addr 3;
          limit_req zone=one burst=5;
        }
    
    }

    补充路径详解:

    格式:location ??? {

    }

    路径优先级 (与代码所在前后顺序无关,只与规则有关)
    1. = /error.html
    2. ^~ /images/
    3. ~* .(gif|jpg|jpeg|png|bmp|swf)$
    4. /static/
    5. /

    解释:
    1.表示完整匹配,用=和完全的路径匹配,比如 =/error.html 就匹配 error.html =/ 匹配根路径
    2.表示开头等于,优先级第二,越长就越能匹配,比如^~ /abc/cd ^~/abc 第一个会优先匹配/abc/cd/xxx
    3.表示不区分大小的正则,并且正则中含义是.jpg等结尾的,优先级第三,同样正则越长越高。
    4.表示开头等于/static/的,但是优先级比第二种低,是一种其他配置找不到再找它,越长就越能匹配。
    5.因为4说了是越长越能匹配,当能匹配/static/就不会匹配/,而/是所有其他的一个默认匹配。

    特别补充比如:location ~* .(gif|jpg|jpeg|png|bmp|swf)$ { //注意正则与其他符号要空格,其他一些配置也是如是。

    参考官方文档:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

  • 相关阅读:
    转--后台开发人员的技术栈
    hadoop +streaming 排序总结
    python 的tempfile学习
    hadoop学习日志
    shell sort 排序大讨论
    系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
    推荐系统评测指标--准确率(Precision)和召回率(Recall)、F值(F-Measure)
    shell 数组
    leecode第七百四十六题(使用最小花费爬楼梯)
    leecode第四百七十五题(供暖器)
  • 原文地址:https://www.cnblogs.com/pengyunjing/p/10662612.html
Copyright © 2011-2022 走看看