曹旭辉 发表于 2024-11-14 04:18:17

Nginx中实现流量控制(限制给定时间内HTTP哀求的数量)示例

场景

流量控制

流量限制 (rate-limiting),可以用来限制用户在给定时间内HTTP哀求的数量。
流量限制可以用作安全目的,好比可以减慢暴力暗码破解的速率,
更常见的环境是该功能被用来掩护上游应用服务器不被同时太多用户哀求所压垮。
流量限制设置两个紧张的指令,limit_req_zone和limit_req,
limit_req_zone 指令设置流量限制和内存区域的参数,但实际上并不限制哀求速率。
limit_req 指令启用流量限制,应用在特定的 location 或者 server 块。
limit_req_zone指令通常在HTTP块中界说,它必要以下三个参数。
Key:
界说应用限制的哀求特性。通过 Nginx 的内置变量$binary_remote_addr,可以获取到访问你的客户端IP地点,
即其作用就是生存客户端IP地点的二进制形式。
Zone:
界说用于存储每个IP地点状态以及被限制哀求URL访问频率的内存区域(也就是说它是用来存储我获取的这些IP地点)。
通过 zone=keyword 标识区域的名字(自界说),以及冒号反面跟区域巨细。
16000个IP地点的状态信息,约莫必要1MB。
Rate:
毗连哀求。速率不能超过每秒1个哀求。
注:
博客:
霸道流氓气质-CSDN博客
实现

示例,模仿两台服务器,一台作为后端服务器,一台作为署理服务器,这里在windows电脑上,使用两个nginx启动两个端口进行模仿。
在实际生产中,我们一般都会在署理服务器上做流量控制,由于我们客户端的哀求是都是要经过署理服务器的,
如果是在后端服务器做限流,那么当有多台后端服务器的时候,就意味着每台后端服务器都得做限流设置,会浪费很多时间。
编写一个简单的index.html,用于服务端返回的测试页面
<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
    <title>最简单的HTML页面</title>
</head>
<body>
    <h1>欢迎来到我的网页</h1>
    <p>这是一个简单的HTML页面示例。</p>
</body>
</html> 修改后端服务器的nginx的设置文件
    server {
        listen       800;
        server_name  127.0.0.1;

        location / {
            root   D:/test/;
   try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

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

    } 留意这里nginx在windows上,上面index.html在D盘下面的test目次下
修改署理服务器的设置 #界说流量限制,每秒处理一个哀求limit_req_zone在此,只用作界说和分配存储空间,并不做限流,限流必要limit_req 指令来启用

 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; 
 upstream test {
       server 127.0.0.1:800 weight=1 max_fails=1 fail_timeout=1;
 }

 server {
        listen       900;
        server_name  127.0.0.1-limit;

        location / {
   limit_req zone=mylimit;  #启用流量限制
   proxy_pass http://test;
   proxy_set_header Host $host:$server_port;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

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

​ 访问测试
https://i-blog.csdnimg.cn/direct/09810f49091c47b785b0cbccb8a49e14.gif
可以看到大于1秒1次的哀求就会被限制。
而且可以检察署理服务器的错误日记
https://i-blog.csdnimg.cn/direct/09dc3f0a852543f7a95330ed7e988b40.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Nginx中实现流量控制(限制给定时间内HTTP哀求的数量)示例