limit_req
介绍
文档
nginx自带的ngx_http_limit_req_module是漏桶算法实现的请求限流模块。
示例配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| http { # 区域名称为limit_ip,大小为10m,同一个请求IP限流为每秒1次请求 limit_req_zone $binary_remote_addr zone=limit_ip:10m rate=1r/s; # 同一个后端URI限流为每秒10次请求 limit_req_zone $uri zone=limit_uri:10m rate=10r/s; # 设置拒绝请求或延迟处理请求的日志级别 limit_req_log_level error; # 设置拒绝请求的响应状态码 limit_req_status 503; ... server { ...
location / { limit_req zone=limit_ip burst=2 nodelay; limit_req zone=limit_uri burst=20 nodelay; root html; index index.html index.htm; } } }
|
说明
- 如果请求被限流,则直接返回相应的错误码(默认503)
- 如果没有配置桶容量burst,则桶容量为0,按照固定速率处理请求。超出固定速率处理的请求被限流
- 如果配置了桶容量burst>0以及延迟模式(没有配置nodelay)。如果桶满了则新的请求被限流;如果没有满,则请求会以固定平均速率被处理
- 如果配置了桶容量burst>0以及非延迟模式(配置nodelay),则不会按照固定速率处理请求,而是允许突发处理请求。如果桶满了,则请求被限流
注意
limit_req_zone key zone=name:size rate=rate [sync]
中的限流对象key
不建议修改,如果一定要修改限流对象key
,务必作废原来的规则使用新的规则名称name
。同一个name
规则名称如果要切换限流对象key
,nginx -s reload
软重启nginx并不会生效,需要将nginx进程彻底关闭nginx -s stop
后重启才能生效!
测试
6个请求由6个线程执行,即等价于同时向nginx发起6个请求。
1
| ab -n 6 -c 6 http://localhost/
|
limit_req zone=test
没有配置桶容量burst,则桶容量为0,按照固定速率处理请求:只有1个请求被处理,其余5个请求被拒绝。
1 2 3 4 5 6
| 127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
|
limit_req zone=test burst=2
配置桶容量burst为2以及延迟模式(没有配置nodelay),按照固定速率处理请求:第1个请求被处理,2个请求被放置到缓冲区阻塞并按1r/s的速率处理,其余3个请求被拒绝。
1 2 3 4 5 6
| 127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:17 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:18 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
|
limit_req zone=test burst=2 nodelay
配置桶容量burst为2以及非延迟模式(配置nodelay),不按照固定速率处理请求:第1个请求被处理,2个请求被放置到缓冲区后立即处理(不阻塞),其余3个请求被拒绝。
1 2 3 4 5 6
| 127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3" 127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
|
limit_rate
介绍
limit_rate
limit_rate_after
nginx自带的limit_rate可以控制单个连接的宽带。
示例配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| http { ... server { ... location /download { # 用户下载达到10MB后,限速128KB/s limit_rate_after 10m; limit_rate 128k; ... } } }
|
说明
- limit_rate_after:下载指定的文件大小之后开始限速
- limit_rate:最高下载速度