5

基于nginx的限流

 2 years ago
source link: https://wakzz.cn/2018/12/10/nginx/%E5%9F%BA%E4%BA%8Enginx%E7%9A%84%E9%99%90%E6%B5%81/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

limit_req

文档

nginx自带的ngx_http_limit_req_module是漏桶算法实现的请求限流模块。

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规则名称如果要切换限流对象keynginx -s reload软重启nginx并不会生效,需要将nginx进程彻底关闭nginx -s stop后重启才能生效!

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

limit_rate

limit_rate_after

nginx自带的limit_rate可以控制单个连接的宽带。

http {
...

server {
...
location /download {
# 用户下载达到10MB后,限速128KB/s
limit_rate_after 10m;
limit_rate 128k;
...
}
}
}
  • limit_rate_after:下载指定的文件大小之后开始限速
  • limit_rate:最高下载速度

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK