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次的请求就会被限制。

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

相关推荐
用户0328472220701 天前
如何搭建本地yum源(上)
运维
ping某2 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
霜落长河3 天前
抛弃TCP改用UDP,HTTP3怎么了?
http
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造