Nginx的请求频率限制模块主要通过ngx_http_limit_req_module实现,用于限制客户端请求的频率,防止恶意请求或DDoS攻击。

模块配置指令

  1. limit_req_zone
    定义共享内存区域,用于存储请求频率的状态。

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    • $binary_remote_addr:基于客户端IP地址进行限制。

    • zone=one:10m:定义名为one的共享内存区域,大小为10MB。

    • rate=1r/s:限制请求速率为每秒1个请求。

  2. limit_req
    在特定位置或服务器块中应用请求频率限制。

    location /api/ {
        limit_req zone=one burst=5 nodelay;
    }
    • zone=one:引用limit_req_zone定义的共享内存区域。

    • burst=5:允许突发5个请求。

    • nodelay:立即处理突发请求,不延迟。

  3. limit_req_status
    定义当请求被拒绝时返回的HTTP状态码,默认是503。

    limit_req_status 429;
  4. limit_req_log_level
    定义记录请求被拒绝时的日志级别,默认是error

    limit_req_log_level warn;

案例

假设需要限制客户端每秒最多请求1次,允许突发5个请求,并立即处理突发请求。

  1. http块中定义共享内存区域:

    http {
        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    }
  2. location块中应用限制:

    server {
        location /api/ {
            limit_req zone=one burst=5 nodelay;
            proxy_pass http://backend;
        }
    }
  3. 配置日志级别和状态码(可选):

    http {
        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
        limit_req_status 429;
        limit_req_log_level warn;
    }

解释

  • 客户端每秒最多请求1次,超过限制的请求会被延迟或拒绝。

  • burst=5允许突发5个请求,nodelay表示立即处理突发请求。

  • 如果请求被拒绝,返回429状态码,并记录警告日志。

通过以上配置,可以有效防止恶意请求或DDoS攻击。

本篇文章内容来源于:Nginx请求频率限制模块详细说明以及案例