nginx中限制http请求速率设置

ngx_http_limit_req_module

ngx_http_limit_req_module模块按照定义的key值限制请求处理速率,特别是对来自单个IP请求的速率限制。

limit_req_zone指令

  1. 按key设置一块共享内存存储状态信息、超限请求数量;key可以包含文本、变量、文本和变量的组合。如果请求中的key为空不会计算到请求数量中。

  2. limit_req_zone指令只能设置在http块中。

  3. 语法:limit_req_zone key zone=name:size rate=rate [sync];

  4. 例: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指令

  1. limit_req指令用于限制请求速率。

  2. limit_req会设置一块内存区域用于实现/管理速率限制,可以给这块内存设置区域名、空间大小、速率、瞬间最大请求量。

  3. 如果请求速率超过设置,nginx会按设置的速率平滑处理请求(将一些请求延迟处理以达到设置速率)。

  4. 超过瞬间最大请求量以前的请求会被延迟处理,而超过瞬间最大请求量的请求不会被处理,直接返回错误状态码为503,可以用limit_req_status指令自定义错误状态码。

  5. 瞬间最大请求量默认值为0。

  6. 语法:limit_req zone=name [burst=number] [nodelay | delay=number];

    • zone=name设置区域名。

    • burst=number设置瞬间最大请求量。

    • nodelay表示不延迟处理请求。

    • 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,如下图:

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值