nginx正向和反向代理服务器中限制http请求速率设置
|
admin
2025年6月28日 22:23
本文热度 36
|
ngx_http_limit_req_module
ngx_http_limit_req_module模块按照定义的key值限制请求处理速率,特别是对来自单个IP请求的速率限制。
limit_req_zone指令
- 按key设置一块共享内存存储状态信息、超限请求数量;key可以包含文本、变量、文本和变量的组合。如果请求中的key为空不会计算到请求数量中。
- limit_req_zone指令只能设置在http块中。
- 语法:
limit_req_zone key zone=name:size rate=rate [sync];
- 例:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
。
$binary_remote_addr
将客户端IP设置为key(按客户端IP限制速率)。zone=one:10m
表示区域命名为one,10m内存空间;如果10m空间用完,按最近最少使用原则移除状态数据,如果空间仍然不够就拒绝处理新请求(返回503)。rate=3r/s
表示速率为每秒3个请求,单位r/s
表示每秒请求数,如果要设置的速率小于1r/s
,可以使用r/m
单位,表示每分钟请求数。sync
用于集群节点间的共享内存数据同步,这里不介绍。
limit_req指令
- limit_req会设置一块内存区域用于实现/管理速率限制,可以给这块内存设置区域名、空间大小、速率、瞬间最大请求量。
- 如果请求速率超过设置,nginx会按设置的速率平滑处理请求(将一些请求延迟处理以达到设置速率)。
- 超过瞬间最大请求量以前的请求会被延迟处理,而超过瞬间最大请求量的请求不会被处理,直接返回错误状态码为503,可以用limit_req_status指令自定义错误状态码。
- 语法:
limit_req zone=name [burst=number] [nodelay | delay=number];
。
delay=number
表示延迟处理的请求数量,默认值为0,即所有超过速率限制的请求都会被延迟。
7. 只有当前配置块(级别)没有设置limit_req指令时,才会从上一个配置块继承配置。 8. limit_req指令可以设置多个,如以下配置:限制同个客户端IP的请求速率,同时也限制虚拟主机的请求速率。server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
limit_req_statu指令
设置拒绝处理的状态码,默认值为503 语法:limit_req_status code;
可配置块:http, server, location
limit_req_log_level指令
1. 设置拒绝处理和延迟处理的日志级别,延迟处理级别比拒绝处理级别低一级,如imit_req_log_level notice
表示拒绝处理为notice级,延迟处理低一级为info。
2. 语法 :limit_req_log_level info | notice | warn | error;
默认日志级别:error 可配置块:http, server, location
测试
测试1. 限制同一IP每秒3个请求,nginx配置:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location / {
# 限制速率
limit_req zone=one;
root html;
index index.html index.htm;
}
}
1秒钟内启动10个请求,因为速率限制为3r/s,3个请求正常响应,7个请求返回503:
测试2. 限制同一IP每秒1个请求,瞬间最大请求量为5:# 方便查看limit_req限制效果
log_format main '$time_local,$request,$status,limit_req_status=$limit_req_status';
access_log /usr/local/nginx/logs/access.log main;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location /download/ {
alias /var/www/images/;
limit_req zone=one burst=5 nodelay;
}
}
本机同时启动15个请求ab -n 15 -c 15 http://127.0.0.1/download/1.jpg
,因为本机发起的请求能够第一时间到达nginx服务,客户端jmeter测试可能因网络原因有延迟。速率为1r/s,允许瞬间最大请求5(burst)无延迟处理,15个请求中6个处理成功,9个错误返回503,如下图:
阅读原文:原文链接
该文章在 2025/7/1 23:45:05 编辑过