# ============================================================
# Nginx 连接数限制配置示例
# ============================================================
#
# 功能说明:
# - 限制单 IP 并发连接数
# - 防止连接耗尽攻击
# - 保护后端服务
#
# Lolly 对应配置:
# server:
#   max_conns_per_ip: 100   # 单 IP 最大连接数
#   security:
#     rate_limit:
#       conn_limit: 50      # 连接数限制
# ============================================================

http {
    # 连接限制区域定义
    # Lolly 对应: security.rate_limit.conn_limit
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    # 基于服务器的连接限制
    limit_conn_zone $server_name zone=server_conn:10m;

    server {
        listen 80;
        server_name connlimit.example.com;

        # 单 IP 最大连接数
        # Lolly 对应: max_conns_per_ip: 50
        limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
        limit_conn conn_limit 50;

        # 限制时返回的状态码
        limit_conn_status 503;

        # 全局连接限制（服务器级别）
        # limit_conn server_conn 1000;

        location /download {
            #下载接口更严格的连接限制
            limit_conn conn_limit 10;

            proxy_pass http://backend:8080;
        }

        # WebSocket 连接限制（需要单独处理）
        location /ws {
            # WebSocket 长连接，允许更多
            limit_conn conn_limit 20;

            proxy_pass http://websocket:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        # 连接限制错误页面
        error_page 503 = @conn_limit_error;
        location @conn_limit_error {
            default_type application/json;
            return 503 '{"error": "Connection limit exceeded"}';
        }
    }
}

# 连接限制说明:
#
# 1. 工作原理:
#    - 统计每个 IP 的活跃连接数
#    - 超过限制时拒绝新连接
#    - 连接关闭后计数减少
#
# 2. 与速率限制区别:
#    - 速率限制: 控制请求频率
#    - 连接限制: 控制并发连接数
#    - 两者互补使用
#
# 3. 适用场景:
#    - 大文件下载（限制并发下载）
#    - WebSocket 连接（限制长连接）
#    - 防止连接耗尽攻击
#
# 4. 配置建议:
#    - 普通请求: 50-100 连接/IP
#    - 下载接口: 5-10 连接/IP
#    - WebSocket: 10-20 连接/IP
#
# 5. Lolly 配置:
#    - max_conns_per_ip: 全局连接限制
#    - security.rate_limit.conn_limit: 安全模块连接限制