目录
大纲
WP建站和运维

Nginx限流策略

1. 主要限流模块

Nginx有两个核心限流模块:

  • ngx_http_limit_req_module – 限制请求速率
  • ngx_http_limit_conn_module – 限制连接数

2. 限制请求速率(limit_req)

基本配置

http {
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
    
    server {
        location / {
            limit_req zone=req_zone burst=20 nodelay;
            # 其他配置...
        }
    }
}

参数说明

  • $binary_remote_addr:以客户端IP作为限流依据
  • zone=req_zone:10m:创建10MB大小的共享内存区存储状态
  • rate=10r/s:允许每秒10个请求
  • burst=20:允许突发20个请求
  • nodelay:不延迟处理突发请求(立即处理但可能返回503)

3. 限制连接数(limit_conn)

http {
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
    
    server {
        location / {
            limit_conn conn_zone 5; # 每个IP最多5个连接
            # 其他配置...
        }
    }
}

4. 多级限流策略

http {
    # 全局限制(每个IP每秒10请求)
    limit_req_zone $binary_remote_addr zone=global:10m rate=10r/s;
    
    # 特定URL限制(登录接口更严格)
    limit_req_zone $binary_remote_addr zone=login:10m rate=2r/s;
    
    server {
        # 全局应用
        limit_req zone=global burst=20 nodelay;
        
        location /login {
            # 登录接口更严格限制
            limit_req zone=login burst=5;
        }
        
        location /api/ {
            # API接口单独限制
            limit_req zone=global burst=50;
        }
    }
}

5. 实际应用建议

  1. 分层限流​:全局+特定URL组合限流
  2. 合理设置burst值​:允许合理突发但不影响服务
  3. 监控调整​:根据日志不断优化限流阈值
  4. 结合日志分析​:$request_time$upstream_response_time识别异常

6. 性能考虑

  • 共享内存区大小(zone)应根据预期IP数量设置
  • 在高并发环境中,limit_conn可能比limit_req更消耗资源
  • 对于大型部署,考虑在前置负载均衡器上做限流

正确配置Nginx限流可以显著提高网站抗DDoS能力,同时保证正常用户的访问体验。