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;
        }
    }

​

访问测试

可以看到大于1秒1次的请求就会被限制。

并且可以查看代理服务器的错误日志

相关推荐
闲云一鹤1 天前
nginx 快速入门教程 - 写给前端的你
前端·nginx·前端工程化
碳基沙盒1 天前
OpenClaw 多 Agent 配置实战指南
运维
不可能的是1 天前
前端 SSE 流式请求三种实现方案全解析
前端·http
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
何中应4 天前
Nginx转发请求错误
前端·后端·nginx
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅5 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒5 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
芝士雪豹只抽瑞克五5 天前
Nginx 高性能Web服务器笔记
服务器·nginx