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

总结

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

相关推荐
唯独失去了从容1 小时前
WebRTC服务器Coturn服务器的管理平台功能
运维·服务器·webrtc
roman_日积跬步-终至千里3 小时前
【K8s基础】K8s下的Helm和Operator:包管理器与运维程序化
运维·容器·kubernetes
PassLink_5 小时前
[Kaggle]:使用Kaggle服务器训练YOLOv5模型 (白嫖服务器)
运维·服务器·yolo
极小狐6 小时前
极狐GitLab 合并请求依赖如何解决?
运维·git·ssh·gitlab·github
程序猿(雷霆之王)6 小时前
Linux——进程间通信
linux·运维·服务器
java1234_小锋7 小时前
什么是WebSocket?NGINX如何支持WebSocket协议?
websocket·网络协议·nginx
Cloud_Air7548 小时前
从零开始使用SSH链接目标主机(包括Github添加SSH验证,主机连接远程机SSH验证)
运维·ssh
Hello.Reader9 小时前
基于 Nginx 的 WebSocket 反向代理实践
运维·websocket·nginx
游王子9 小时前
springboot3 声明式 HTTP 接口
网络·spring boot·网络协议·http
qq_273900239 小时前
CentOS系统防火墙服务介绍
linux·运维·centos