文章目录
前言
如何限制每个客户端每秒处理请求数
一、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是一起使用。
总结
后续会继续补充更多使用的案例。