CentOS Nginx 的请求限制

duguxiaobiao | | 访问(66)

  请求限制可以通过两种方式来配置,分别是 连接频率限制和请求频率限制

  HTTP协议的连接与请求

  HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。

  首先我们要知道什么是HTTP请求和连接,浏览器和服务端首先通过三次握手完成连接,然后发起请求,传输请求参数,服务端接受请求,返回数据到客户端浏览器,这就是 请求和连接。

  现在我们来分别看下 连接频率限制和 请求频率限制是怎么实现。

  1、连接频率限制

  配置语法:limit_conn_zone key zone=name:size;

  理解:我们要限制连接数,那么需要根据一个凭证来限制,比如我们的身份证,假设我限制这一个路口只有xx地区的身份证的不能通过,所以 我们将 key 作为我们的限制依据,例如可以是 ip地址, zone=name 这个是 为这个限制规则设置一个名字,方便下面的语法来调用。 size:是为这个限制开辟多少空间来存储这些 key 信息。

  默认配置:没有配置

  配置路径:http下

  匹配配置语法:limt_conn name number;

  理解:通过上面的语法配置了一个规则,这里通过这个语法来匹配该规则,name是上面定义的连接频率限制规则的name,number是限制连接的个数。

  默认配置:没有配置

  配置路径:http, server, location下

  2、请求频率限制

  配置语法:limit_req_zone key zone=name:size rate;

  理解:语法和上面的类似,不同的是在末尾添加了一个 rate速率,例如 1r/s,1秒内限制仅通过一个,

  默认配置:没有配置

  配置路径:http下

  匹配配置语法:limt_req zone=name 【burst】【nodelay】;

  理解:通过上面的语法配置了一个规则,这里通过这个语法来匹配该规则,name是上面定义的请求限制规则的name,burst和nodelay用中括号包围,表明是 超过本次限制的可以允许多少个请求在下一个频率执行,其余的直接pass

  默认配置:没有配置

  配置路径:http, server, location下

  3、配置介绍

http {
    ...
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    
    limit_conn_zone $binary_remote_addr zone=my_conn_zone:10m;# 连接频率限制
    limit_req_zone $binary_remote_addr zone=my_req_zone:10m rate=1r/s;# 同一个Ip一秒内只能请求一次
    
    server {
        listen       80 default_server; 
        listen       [::]:80 default_server;
        server_name  www.oldtom.cc;
        root         /root/workspace/; 

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            limit_conn my_conn_zone 1;# 每次只能有1个TCP连接,但是一个TCP连接会有多个HTTP请求
          # limit_req zone=my_req_zone;# 限制访问频次
          # limit_req zone=my_req_zone burst=3;
          # limit_req zone=my_req_zone burst=3 nodelay;
          index index.html;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}