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是一起使用。

总结

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

相关推荐
iru13 小时前
nginx被报CVE-2025-1695漏洞,检查后反馈是误报
运维·nginx
么么...15 小时前
在 Ubuntu 上安装 Docker 并部署 MySQL 容器
linux·运维·经验分享·笔记·mysql·ubuntu·docker
翼龙云_cloud15 小时前
亚马逊云渠道商:Lightsail 如何制定备份与快照策略以平衡安全及成本?
运维·安全·云计算·aws
zhendianluli15 小时前
如何阅读理解用户手册里的函数文档, 以man 2 stat举例
linux·运维
打码人的日常分享15 小时前
企业数据资产管控和数据治理解决方案
大数据·运维·网络·人工智能·云计算
TG:@yunlaoda360 云老大17 小时前
华为云国际站代理商CSBS主要有什么作用呢?
运维·服务器·数据库·华为云
不知道累,只知道类17 小时前
[故障复盘] 生产环境 HTTP 连接池耗尽导致的“服务假死”分析
网络·网络协议·http
像名字一样难取的昵称18 小时前
Linux学习笔记:十八、Linux文件的压缩,解压缩一站式学习
linux·运维·笔记·学习·ubuntu·ssh
_kank_18 小时前
HTTP 头部详细说明
http
Trouvaille ~19 小时前
【Linux】库制作与原理(二):ELF格式与静态链接原理
linux·运维·c语言·操作系统·动静态库·静态链接·elf文件