插件窝 干货文章 nginx限速之连接数限制的方法

nginx限速之连接数限制的方法

限制 limit 连接 zone 608    来源:    2025-04-21

Nginx 连接数限制方法详解

Nginx 提供了多种方式来限制客户端连接数,防止服务器过载或被恶意攻击。以下是几种主要的连接数限制方法:

1. limit_conn 模块限制单IP连接数

使用 ngx_http_limit_conn_module 模块可以限制单个IP地址的连接数。

http {
    # 定义共享内存区域和键值
    limit_conn_zone $binary_remote_addr zone=perip:10m;

    server {
        location / {
            # 限制每个IP同时只能有10个连接
            limit_conn perip 10;

            # 当超过限制时返回的状态码(默认503)
            limit_conn_status 429;

            # 可选:限制日志级别
            limit_conn_log_level warn;
        }
    }
}

2. limit_req 模块限制请求速率

虽然主要限制请求速率,但也可以间接控制连接数:

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

    server {
        location / {
            # 限制每个IP每秒10个请求
            limit_req zone=perip_req burst=20 nodelay;

            # 超过限制时返回的状态码
            limit_req_status 429;
        }
    }
}

3. 限制单个服务器的总连接数

http {
    # 限制worker进程的总连接数
    worker_connections 1024;

    # 限制单个server的总连接数
    server {
        listen 80;
        server_name example.com;

        # 限制该server的总连接数为1000
        max_connections 1000;
    }
}

4. 限制特定位置的并发连接数

http {
    limit_conn_zone $binary_remote_addr zone=download:10m;

    server {
        location /download/ {
            # 限制/download/路径下每个IP只能有1个连接
            limit_conn download 1;

            # 限制下载速度为50KB/s
            limit_rate 50k;
        }
    }
}

5. 综合应用示例

http {
    # 定义共享内存区域
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_req_zone $binary_remote_addr zone=perip_req:10m rate=5r/s;

    server {
        listen 80;
        server_name example.com;

        # 全局限制
        limit_conn perip 20;
        limit_req zone=perip_req burst=10 nodelay;

        location /api/ {
            # API接口更严格的限制
            limit_conn perip 5;
            limit_req zone=perip_req burst=5;
        }

        location /static/ {
            # 静态资源不限制连接数但限制带宽
            limit_rate_after 1m;
            limit_rate 100k;
        }
    }
}

注意事项

  1. limit_conn_zone 需要在 http 上下文中定义
  2. 共享内存大小(如10m)需要根据预期用户量调整
  3. 限制过严可能影响正常用户体验,需根据实际情况调整
  4. 可以结合日志分析调整限制参数
  5. 对于代理服务器,可能需要使用 $server_name$host 作为限制键

这些方法可以单独使用,也可以组合使用,根据实际业务需求和安全要求进行配置。