插件窝 干货文章 Nginx反向代理中在访问控制和流量控制上的应用

Nginx反向代理中在访问控制和流量控制上的应用

http proxy backend Nginx 908    来源:    2025-04-20

Nginx反向代理中的访问控制与流量控制应用

访问控制应用

1. 基于IP的访问控制

location / {
    # 允许特定IP或IP段
    allow 192.168.1.0/24;
    allow 10.0.0.1;

    # 拒绝其他所有
    deny all;

    proxy_pass http://backend;
}

2. 基于认证的访问控制

location /admin {
    auth_basic "Admin Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://backend;
}

3. 基于HTTP方法的访问控制

location /api {
    limit_except GET POST {
        deny all;
    }

    proxy_pass http://backend;
}

4. 基于Referer的访问控制

location /downloads {
    valid_referers none blocked example.com *.example.com;

    if ($invalid_referer) {
        return 403;
    }

    proxy_pass http://backend;
}

流量控制应用

1. 连接数限制

http {
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;

    server {
        limit_conn perip 10;  # 每个IP最多10个连接
        limit_conn perserver 100; # 整个服务器最多100个连接
    }
}

2. 请求速率限制

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        location /api {
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://backend;
        }
    }
}

3. 带宽限制

location /download {
    proxy_pass http://backend;
    proxy_buffering on;
    proxy_buffers 16 8k;
    proxy_buffer_size 8k;
    limit_rate 500k;  # 限制下载速度为500KB/s
}

4. 基于地理位置的流量控制

http {
    geo $limited_country {
        default 0;
        CN 1;
        US 1;
        # 其他允许的国家
    }

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

    limit_req_zone $limit_key zone=country:10m rate=5r/s;

    server {
        location / {
            limit_req zone=country burst=10;
            proxy_pass http://backend;
        }
    }
}

高级应用场景

1. 动态限流

location /api {
    # 根据URI不同部分设置不同限流策略
    if ($request_uri ~* "^/api/v1/search") {
        set $limit_rate 100k;
    }

    if ($request_uri ~* "^/api/v1/download") {
        set $limit_rate 500k;
    }

    proxy_pass http://backend;
}

2. 熔断机制

http {
    upstream backend {
        server backend1.example.com max_fails=3 fail_timeout=30s;
        server backend2.example.com;
    }

    server {
        location / {
            # 当后端错误率超过20%时返回503
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
            proxy_next_upstream_tries 3;
            proxy_next_upstream_timeout 10s;

            proxy_pass http://backend;
        }
    }
}

3. 基于时间的访问控制

map $time_iso8601 $is_business_hours {
    default 0;
    "~T0[89]:|~T1[0-7]:" 1; # 08:00-17:59
}

server {
    location / {
        if ($is_business_hours = 0) {
            return 503;
        }

        proxy_pass http://backend;
    }
}

最佳实践建议

  1. 分层限流:结合全局、用户级别和API级别的限流策略
  2. 监控与调整:定期检查限流日志并根据实际情况调整阈值
  3. 优雅降级:当触发限流时返回429状态码而非直接拒绝
  4. 白名单机制:为重要客户或内部系统设置免限流白名单
  5. 日志记录:详细记录被拒绝的请求以便分析和审计

通过合理配置Nginx的这些功能,可以有效地保护后端服务不被过载,同时确保关键业务流量的优先级。