反向代理与 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 caddyNginx
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 nginxCloudflare 或其他 CDN
使用 CDN 时检查:
- 是否支持当前套餐所需的长连接时长。
- 是否会缓存
/v1/*、/v1beta/*或/api/v1/*。 - 是否会改写
Authorization、session_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/tcp和443/tcp。 8080/tcp只允许本机或反向代理网段。- PostgreSQL
5432/tcp和 Redis6379/tcp只允许应用网段。 - SSH 只允许管理网段,并禁用密码登录。