Skip to content

反向代理与 HTTPS

生产环境应使用 Caddy、Nginx、云负载均衡或 CDN 终止 TLS,再把请求转发到 Sub2API。代理必须正确处理 SSE、WebSocket、大请求体和长时间无数据的模型请求。

Caddy

Caddy 配置最简单,并可以自动申请 HTTPS 证书:

text
api.example.com {
    encode zstd gzip

    reverse_proxy 127.0.0.1:8080 {
        health_uri /health

        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
        header_up X-Forwarded-Host {host}

        transport http {
            keepalive 120s
            compression off
        }
    }
}

检查并重载:

bash
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

Nginx

session_id 等客户端头可能包含下划线。Nginx 默认丢弃这类头,因此必须在 http 块启用 underscores_in_headers

nginx
http {
    underscores_in_headers on;

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 80;
        server_name api.example.com;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        http2 on;
        server_name api.example.com;

        ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

        client_max_body_size 256m;

        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_http_version 1.1;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;

            proxy_buffering off;
            proxy_request_buffering off;
            proxy_cache off;

            proxy_connect_timeout 30s;
            proxy_send_timeout 3600s;
            proxy_read_timeout 3600s;
        }
    }
}

检查并重载:

bash
sudo nginx -t
sudo systemctl reload nginx

Cloudflare 或其他 CDN

使用 CDN 时检查:

  • 是否支持当前套餐所需的长连接时长。
  • 是否会缓存 /v1/*/v1beta/*/api/v1/*
  • 是否会改写 Authorizationsession_id、SSE 或 WebSocket 相关头。
  • 上传大小和响应超时是否低于 Sub2API 配置。
  • 应用是否只信任来自 CDN 或反向代理的真实 IP 头。

API 路径应明确禁用缓存。静态资源 /assets/* 可以长期缓存。

为什么不能启用响应缓冲

SSE 是边生成边发送的响应。如果代理先把内容缓存在内存或磁盘,再一次性返回,客户端会表现为长时间没有输出,甚至提前超时。

验证方式:

bash
curl -N https://api.example.com/v1/messages \
  -H 'content-type: application/json' \
  -H 'x-api-key: YOUR_SUB2API_KEY' \
  -d '{
    "model": "YOUR_MODEL",
    "stream": true,
    "max_tokens": 64,
    "messages": [{"role": "user", "content": "count from 1 to 5 slowly"}]
  }'

事件应该逐步到达,而不是请求结束后一次性出现。

只暴露必要端口

推荐防火墙规则:

  • 公网允许 80/tcp443/tcp
  • 8080/tcp 只允许本机或反向代理网段。
  • PostgreSQL 5432/tcp 和 Redis 6379/tcp 只允许应用网段。
  • SSH 只允许管理网段,并禁用密码登录。

本文档用于帮助你理解、部署和运维 Sub2API。使用前请确认上游服务条款与当地法律要求。