Nginx典型静态流控配置(ngx_http_limit_req_module)

1、基于请求头字段进行连接数流控

配置示例:

    # 限流配置定义,其中键可以为文本、变量或者任意的组合,特别的,具有空键值的请求将不会被计入
    # $http_limit_header 标识基于请求头limit-header进行流控
    # zone=req_limit_for_header:10m 定义共享内存用于存储状态,rate=1r/s 限制每秒1个请求
    limit_req_zone $http_limit_header zone=req_limit_header:10m rate=1r/s;

    server {
        listen 8000;

        location / {
            # 应用限流,burst=5 允许5个突发请求排队,nodelay不延迟处理排队请求
            limit_req zone=req_limit_header burst=5 nodelay;
            root   html;
            index  index.html index.htm;
        }
    }

2、定制限流响应界面

    server {
        listen 8000;

        # 定义限流响应页面:采用429状态码
        # limit_req_status优先级高于location中return指令指定的响应码
        limit_req_status 429; # 使用429状态码(请求过多)
        error_page 429 /too_many_requests; 

        location / {
              # 应用限流
              # burst=5 允许5个突发请求排队
              # nodelay不延迟处理排队请求
              # delay=num用于指定阈值,超出该阈值的过多请求才会被延迟,默认为0即代表所有的过多请求都会被延迟
            limit_req zone=req_limit_header burst=5 nodelay;
            root   html;
            index  index.html index.htm;
        }

         # 自定义限流响应页面
        location = /too_many_requests {
            internal; # 只允许内部访问
            return 429 '<html><body>Too many request!</body></html>';
        }
    }

 3、应用多种流控策略

    # 限流配置定义
    # $http_limit_header 标识基于请求头limit-header进行流控
    # zone=req_limit_for_header:10m 定义共享内存用于存储状态,rate=1r/s 限制每秒1个请求
    limit_req_zone $http_limit_header zone=req_limit_header:10m rate=1r/s;
    # $binary_remote_addr 标识基于客户端地址进行流控
    # zone=req_per_clt:10m 定义共享内存用于存储状态,rate=1r/s 限制每秒1个请求
    limit_req_zone $binary_remote_addr zone=req_per_clt:10m rate=1r/s;

    server {
        listen 8000;

        # 定义限流响应页面:采用429状态码
        # limit_req_status优先级高于location中return指令指定的响应码
        limit_req_status 429; # 使用429状态码(请求过多)
        error_page 429 /too_many_requests; 

        location / {
            # 应用限流
            # burst=5 允许5个突发请求排队
            # nodelay不延迟处理排队请求
            # delay=num用于指定阈值,超出该阈值的过多请求才会被延迟,默认为0即代表所有的过多请求都会被延迟
            limit_req zone=req_limit_header burst=5 nodelay;
            limit_req zone=req_per_clt burst=5 nodelay;
            root   html;
            index  index.html index.htm;
        }

         # 自定义限流响应页面
        location = /too_many_requests {
            internal; # 只允许内部访问
            return 429 '<html><body>Too many request!</body></html>';
        }
    }

Tip

limit_req_log_level warn   设置因请求速率超出限制或延迟处理请求时所需的日志记录级别(error.log),对于延迟的请求级别比拒绝情况的低一个级别
limit_req_dry_run 启用dry run模式。在该模式下请求处理速率不受限制,但在共享内存区域,超出的请求数量仍会进行统计,error.log仍会记录错误日志
$limit_req_status  限制请求处理速率的结果:PASS(通过)、DELAY(延迟)、REJECT(拒绝)、DELAY_DRY_RUN(延迟预演)或 REJECT_DRY_RUN(拒绝预演),通常结合访问日志使用
posted @ 2025-10-09 23:25  静塘花开  阅读(4)  评论(0)    收藏  举报