版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sz85850597/article/details/84956030
limit_req
介绍
nginx自带的ngx_http_limit_req_module是漏桶算法实现的请求限流模块。
示例配置
http {
# 区域名称为test,大小为10m,平均处理的请求频率不能超过每秒一次
limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
# 设置拒绝请求或延迟处理请求的日志级别
limit_conn_log_level error;
# 设置拒绝请求的响应状态码
limit_conn_status 503;
...
server {
...
location / {
limit_req zone=test burst=2 nodelay;
root html;
index index.html index.htm;
}
}
}
说明
- 如果请求被限流,则直接返回相应的错误码(默认503)
- 如果没有配置桶容量burst,则桶容量为0,按照固定速率处理请求。超出固定速率处理的请求被限流
- 如果配置了桶容量burst>0以及延迟模式(没有配置nodelay)。如果桶满了则新的请求被限流;如果没有满,则请求会以固定平均速率被处理
- 如果配置了桶容量burst>0以及非延迟模式(配置nodelay),则不会按照固定速率处理请求,而是允许突发处理请求。如果桶满了,则请求被限流
测试
6个请求由6个线程执行,即等价于同时向nginx发起6个请求。
ab -n 6 -c 6 http://localhost/
limit_req zone=test
没有配置桶容量burst,则桶容量为0,按照固定速率处理请求:只有1个请求被处理,其余5个请求被拒绝。
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个请求被拒绝。
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个请求被拒绝。
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
介绍
nginx自带的limit_rate可以控制单个连接的宽带。
示例配置
http {
...
server {
...
location /download {
# 用户下载达到10MB后,限速128KB/s
limit_rate_after 10m;
limit_rate 128k;
...
}
}
}
说明
- limit_rate_after:下载指定的文件大小之后开始限速
- limit_rate:最高下载速度