• (007)Nginx的请求限制_配置语法与原理


      1、HTTP协议简介

      简单介绍一下HTTP协议的连接与请求:

      HTTP协议是建立在TCP协议基础之上。HTTP请求先要进行TCP的三次握手,称为TCP的连接。建立好TCP的连接才会进行HTTP请求与响应。也就是在连接的基础之上进行HTTP请求,现在可以在一次连接的基础上建立多次请求。通过发送FIN可ACK包保持连接状态,也就是长连接。HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。

      不同的HTTP协议版本具有不同的连接关系:HTTP1.0的TCP不能复用,HTTP1.1能顺序性TCP复用,HTTP2.0支持多路复用TCP复用。

      2、请求限制与语法  

      Nginx的请求限制包括两种:limit_conn_module(连接频率限制);limit_req_module(请求频率限制)

      连接频率限制语法:

      Syntax:limit_conn_zone key zone=name:size;
      Default:-
      Context:http

      Syntax:limit_conn zone number;
      Default:-
      Context:http,server,location

      请求频率限制语法:

      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

      3、演示

      新建页面:/opt/app/code/1.html

    <html>
    <head>
        <meta charset="utf-8">
        <title>imooc1</title>
    </head>
    <body style="background-color:red;">
    </body>
    </html>

      修改配置文件 /etc/nginx/conf.d/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;
    location / {
      root   /opt/app/code;
      index  index.html index.htm;
    }

      

      配置解析:对于同一个客户端IP地址过来的请求,限制为1秒发起一个。zone大小设置为1M。$remote_addr与$binary_remote_addr都表示客户端IP,$binary_remote_addr更节省空间。 

      重新加载配置文件

    nginx -s reload -c /etc/nginx/nginx.conf

      压测,总共发起40个请求,同时并发请求20个,每秒完成5983.55个请求

    ab -n 40 -c  20 http://192.168.7.151/1.html

      

      配置 limit_req zone=req_zone;  

      

      重新加载配置文件后,再次执行上面的压测语句:发现限制生效

      

      

      配置 limit_req zone=req_zone burst=3 nodelay; 或者 limit_req zone=req_zone burst=3; 客户端在超过了指定的速率后遗留的3个放到下一秒执行,对客户端起到访问限速的作用,延迟响应,只有3个是延迟的其他的nodelay,直接返回。

      

      重新加载配置文件后,再次执行上面的压测语句:发现限制生效。

      

      配置 limit_conn conn_zone 1;限制服务端同一时刻只允许一个IP的连接过来。

      

      重新加载配置文件后,再次执行上面的压测语句:发现限制生效。因为限制的是连接,一次连接可以进行多次请求。

       

      

      

  • 相关阅读:
    单机 Nexus 部署
    Docker 部署 3 节点 ES 集群
    Harbor 高可用部署
    Python 第四次实验
    es入门
    Golang的Test的用法
    spring elastic
    golang下载包的时候出现 dial tcp 142.251.43.17:443: i/o timeout时候解决
    Java加密并压缩文件
    feign调用添加header
  • 原文地址:https://www.cnblogs.com/javasl/p/12823504.html
Copyright © 2020-2023  润新知