基于nginx的限流

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:最高下载速度
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值