Nginx-http_limit_req_module模块

文章目录


前言

如何限制每个客户端每秒处理请求数


一、ngx_http_limit_req_module模块

生效阶段: NGX_HTTP_PREACCESS_PHASE

模块默认编译进nginx,通过--without-http_limit_req_module禁用。

生效范围:

  • 全部worker进程(基于共享内存)
  • 进入preaccess阶段前不生效

ngx_http_limit_req_module官方传送门

引用了leaky bucket算法

二、指令

1.limit_req_zone

使用示例:

bash 复制代码
Syntax:	limit_req_zone key zone=name:size rate=rate [sync];
Default:	---
Context:	http

定义共享内存(包括大小),以及key关键字和限制速率

rate 单位r/s或者r/m 每秒或者每分钟可以处理的请求数。

2.limit_req

使用示例:

bash 复制代码
Syntax:	limit_req zone=name [burst=number] [nodelay | delay=number];
Default:	---
Context:	http, server, location

限制并发连接数

burst 默认为0 (根据leaky bucket算法,相当于下面的盆承接流量)

nodelay, 对burst中的请求不再采用延时处理的做法,而是直接处理。

3.limit_req_log_level

使用示例:

bash 复制代码
Syntax:	limit_req_log_level info | notice | warn | error;
Default:	
limit_req_log_level error;
Context:	http, server, location
This directive appeared in version 0.8.18.

限制并发连接数

4.limit_req_status

使用示例:

bash 复制代码
Syntax:	limit_req_status code;
Default:	
limit_req_status 503;
Context:	http, server, location
This directive appeared in version 1.3.15.

限制并发连接数

实验

burst取默认0的情况

bash 复制代码
# 限速,每分钟两次请求
limit_req_zone $binary_remote_addr zone=req:10m rate=2r/m;

server {
        server_name limit_req.test.io;
        root html/;
        error_log  /var/log/nginx/myerror.log info;
        location / {
                limit_req_status 500;
                limit_req_log_level warn;
                limit_req zone=req;
        }
}

第一次请求成功,后面的请求返回了500。

error.log日志可以看到限速日志。

burst不取默认值

bash 复制代码
limit_req_zone $binary_remote_addr zone=req:10m rate=2r/m;

server {
	server_name limit_req.test.io;
        root html/;
	error_log  /var/log/nginx/myerror.log info;        
        location / {
		limit_req_status 500;
 		limit_req_log_level warn;
 		# limit_req zone=req;
		limit_req zone=req burst=5 nodelay;
	}

}

再次请求,可以看到,请求到5次,后开始限制,burst相当于一个桶,承接请求,如果桶在限速时间内满了,则会触发限制。

nodelay 这个配置,如果不配置,大家可以是一些,请求会被卡住,等待响应,而不是之间收到反馈,所以,burst和nodelay是一起使用。

总结

后续会继续补充更多使用的案例。

相关推荐
岁岁种桃花儿13 小时前
流量入口Nginx动态发现K8s Ingress Controller实操指南
nginx·架构·kubernetes
每次学一点13 小时前
【ZeroTier自研之路】自定义NetworkID
运维·服务器
xu_yule13 小时前
网络和Linux网络-15(IO多路转接)reactor编程-服务器
linux·运维·服务器·c++
礼拜天没时间.13 小时前
Docker基础操作——镜像与容器管理
linux·运维·服务器·docker·容器·centos
冗量13 小时前
Kubernetes (K8s) 基础知识、部署与运维指南
运维·容器·kubernetes
vx-bot55566613 小时前
企业微信接口在自动化运维与智能运维中的架构实践
运维·自动化·企业微信
阿常呓语13 小时前
ls 命令详解
linux·运维·服务器·ls
桌面运维家13 小时前
vDisk一键部署怎么应用?自动化脚本使用指南
运维·自动化
mqiqe13 小时前
springboot tomcat 嵌入式 解决Slow HTTP DOS问题解决
spring boot·http·tomcat
倔强的石头10613 小时前
【Linux指南】基础IO系列(一)Linux 文件本质揭秘 —— 从 “磁盘文件” 到 “一切皆文件”
linux·运维·服务器