limit_req_zone 是 Nginx 中用于限制请求速率的功能,常用于防止 DDoS 攻击或流量过载。以下是如何配置和测试 limit_req_zone 的详细步骤:

  1. 配置 limit_req_zone
    在 Nginx 配置文件中(通常是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),添加限流配置。
    1. 定义限流区域
      在 http 块中定义一个限流区域:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {
# 定义限流区域,名为 "one",大小为 10MB,速率限制为每秒 1 个请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
listen 8090;
server_name localhost;

location / {
# 应用限流区域 "one"
limit_req zone=one burst=5 nodelay;
proxy_pass http://localhost:8080/;
}
}
}
  • limit_req_zone 参数:

    • $binary_remote_addr:基于客户端 IP 地址限流。
    • zone=one:10m:定义名为 one 的限流区域,大小为 10MB。
    • rate=1r/s:限制每秒 1 个请求。
  • limit_req 参数:

    • zone=one:应用限流区域 one。
    • burst=5:允许突发 5 个请求。
    • nodelay:不延迟处理突发请求。
    1. 重启 Nginx
      保存配置文件后,重启 Nginx 使配置生效:
1
2
sudo nginx -t  # 测试配置文件是否正确
sudo systemctl restart nginx # 重启 Nginx
  1. 观察结果

    • 如果限流生效,部分请求会返回 503 Service Temporarily Unavailable
    • 查看 Nginx 日志(通常位于 /var/log/nginx/access.log 或 /var/log/nginx/error.log),确认限流行为
  2. 高级配置

    1. 多级限流
      可以为不同路径设置不同的限流规则:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      location /api/ {
      limit_req zone=one burst=10 nodelay;
      proxy_pass http://backend;
      }

      location /static/ {
      limit_req zone=one burst=20;
      alias /var/www/static/;
      }
    2. 白名单
      对特定 IP 或网段不限流:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      geo $limit {
      default 1;
      192.168.1.0/24 0; # 192.168.1.0/24 网段不限流
      }

      map $limit $limit_key {
      0 "";
      1 $binary_remote_addr;
      }

      limit_req_zone $limit_key zone=one:10m rate=1r/s;
  3. 常见问题

    1. 限流不生效
      • 检查 Nginx 配置是否正确。
      • 确保 limit_req_zone 和 limit_req 配置在同一层级。
    2. 请求被误限流
      • 调整 burst 和 nodelay 参数。
      • 检查客户端 IP 是否正确。
    3. 性能问题
      • 使用 nodelay 减少延迟。
      • 优化后端服务性能。