nginx 请求限制和访问控制

Posted crazymagic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx 请求限制和访问控制相关的知识,希望对你有一定的参考价值。

请求限制

限制主要有两种类型:

  • 连接频率限制: limit_conn_module
  • 请求频率限制: limit_req_module

HTTP协议的连接与请求

技术图片

 

HTTP协议是基于TCP的,如果要完成一次HTTP请求的时候,首先进行TCP的三次握手。当建立连接的时候就可以进行请求和响应。

技术图片

可以得到结论:
HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求(可以有多个)

对于 limit_conn_module模块

该ngix_http_limit_conn_module模块用于限制每个定义的密钥的连接数量,特别是来自单个IP地址的连接数量。

并非所有连接都被计算在内 只有在服务器处理请求并且已经读取了整个请求头时才计算连接。

对于连接限制的配置:

  • Syntax: limit_conn_zone key zone=name:size;
  • Default: —
  • Context: http
  • Syntax: limit_conn zone number;
  • Default: — Context: http, server, location

 

对于第一部分可以理解在内存中开辟一个区域对于指定的nginx变量(key,例如:binary_remote_addr)进行限制。name表示申请的空间的名字,size表示申请空间的大小。

对于第二部分zone就是第一部分设置的名字name,number表示进行并发的限制。例如设置为1,表示一个时间段只能有一个。

对于ngx_http_limit_req_module模块:

用于限制每一个定义的密钥的请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。限制是使用“泄漏桶”方法完成的

对于请求限制的配置:

  • Syntax: limit_req_zone key zone=name:size rate=rate;
  • Default: —
  • Context: http
  • Syntax: limit_req zone=name [burst=number] [nodelay];
  • Default: —
  • Context: http, server, location

对于第一部分配置和连接配置相似,rate表示速率,以秒s为单位(rate=1r/s)
对于第二部分zone就是第一部分设置的名字name,[]内为可配置选项。

实例:
首先编写配置文件 default.conf

    limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
    limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server 
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;


    location / 
        root /opt/app/code;
        #limit_conn conn_zone 1;
        #limit_req zone=req_zone burst=3 nodelay;
        #limit_req zone=req_zone burst=3;
        #limit_req zone=req_zone;
        index  index.html index.htm;
    

  

技术图片

 

 

我们看到上面为定义zone,第二行是请求定义,表示对远程请求进行每秒一次的请求限制。这里的binary_remote_addr和remote_addr代表的含义是一样的(远程主机的IP)只是使用binary_remote_addr存储一个IP会比remote_addr省10个字节。burst 参数往后延迟3个请求 nodelay 立即返回

保存重新加载

使用 ab 进行压力测试

ab -n 40 -c 20 http://192.168.1.112/

技术图片

可以看到40 个都连接成功

 

请求限制打开,1s同一个客户端只允许连接一次

 技术图片

再次进行测试

ab -n 40 -c 20 http://192.168.1.112/

可以发现只成功了一次

技术图片

 

访问控制

 

以上是关于nginx 请求限制和访问控制的主要内容,如果未能解决你的问题,请参考以下文章

Nginx限制并发连接数

nginx访问控制:如何通过map来控制http_x_forwarded_for访问限制

nginx lua redis 访问频率限制(转)

Nginx 限制访问速率

nginx 限制并发访问及请求频率

Nginx模块之http.md