# ============================================================================= # Sub2API Caddy Reverse Proxy Configuration (宿主机部署) # ============================================================================= # 使用方法: # 1. 安装 Caddy: https://caddyserver.com/docs/install # 2. 修改下方 example.com 为你的域名 # 3. 确保域名 DNS 已指向服务器 # 4. 复制配置: sudo cp Caddyfile /etc/caddy/Caddyfile # 5. 重载配置: sudo systemctl reload caddy # # Caddy 会自动申请和续期 Let's Encrypt SSL 证书 # ============================================================================= # 全局配置 { # Let's Encrypt 邮箱通知 email admin@example.com # 服务器配置 servers { # 启用 HTTP/2 和 HTTP/3 protocols h1 h2 h3 # 超时配置 timeouts { read_body 30s read_header 10s write 300s idle 300s } } } # 修改为你的域名 example.com { # ========================================================================= # 静态资源长期缓存(高优先级,放在最前面) # 带 hash 的文件可以永久缓存,浏览器和 CDN 都会缓存 # ========================================================================= @static { path /assets/* path /logo.png path /favicon.ico } header @static { Cache-Control "public, max-age=31536000, immutable" # 移除可能干扰缓存的头 -Pragma -Expires } # ========================================================================= # TLS 安全配置 # ========================================================================= tls { # 仅使用 TLS 1.2 和 1.3 protocols tls1.2 tls1.3 # 优先使用的加密套件 ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 } # ========================================================================= # 反向代理配置 # ========================================================================= reverse_proxy localhost:8080 { # 健康检查 health_uri /health health_interval 30s health_timeout 10s health_status 200 # 负载均衡策略(单节点可忽略,多节点时有用) lb_policy round_robin lb_try_duration 5s lb_try_interval 250ms # 传递真实客户端信息 # 兼容 Cloudflare 和直连:后端应优先读取 CF-Connecting-IP,其次 X-Real-IP 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} # 保留 Cloudflare 原始头(如果存在) # 后端获取 IP 的优先级建议: CF-Connecting-IP → X-Real-IP → X-Forwarded-For header_up CF-Connecting-IP {http.request.header.CF-Connecting-IP} # 连接池优化 transport http { keepalive 120s keepalive_idle_conns 256 read_buffer 16KB write_buffer 16KB compression off } # SSE/流式传输优化:禁用响应缓冲,立即刷新数据给客户端 flush_interval -1 # 故障转移 fail_duration 30s max_fails 3 unhealthy_status 500 502 503 504 } # ========================================================================= # 压缩配置 # ========================================================================= encode { zstd gzip 6 minimum_length 256 match { # SSE 请求通常会带 Accept: text/event-stream,需排除压缩 not header Accept text/event-stream* # 排除已知 SSE 路径(即便 Accept 缺失) not path /v1/messages /v1/responses /responses /antigravity/v1/messages /v1beta/models/* /antigravity/v1beta/models/* header Content-Type text/* header Content-Type application/json* header Content-Type application/javascript* header Content-Type application/xml* header Content-Type application/rss+xml* header Content-Type image/svg+xml* } } # ========================================================================= # 速率限制 (需要 caddy-ratelimit 插件) # 如未安装插件,请注释掉此段 # ========================================================================= # rate_limit { # zone api { # key {remote_host} # events 100 # window 1m # } # } # ========================================================================= # 安全响应头 # ========================================================================= header { # 防止点击劫持 X-Frame-Options "SAMEORIGIN" # XSS 保护 X-XSS-Protection "1; mode=block" # 防止 MIME 类型嗅探 X-Content-Type-Options "nosniff" # 引用策略 Referrer-Policy "strict-origin-when-cross-origin" # HSTS - 强制 HTTPS (max-age=1年) Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # 内容安全策略 (根据需要调整) # Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https:;" # 权限策略 Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" # 跨域资源策略 Cross-Origin-Opener-Policy "same-origin" Cross-Origin-Embedder-Policy "require-corp" Cross-Origin-Resource-Policy "same-origin" # 移除敏感头 -Server -X-Powered-By } # ========================================================================= # 请求大小限制 (防止大文件攻击) # ========================================================================= request_body { max_size 100MB } # ========================================================================= # 日志配置 # ========================================================================= log { output file /var/log/caddy/sub2api.log { roll_size 50mb roll_keep 10 roll_keep_for 720h } format json level INFO } # ========================================================================= # 错误处理 # ========================================================================= handle_errors { respond "{err.status_code} {err.status_text}" } } # ============================================================================= # HTTP 重定向到 HTTPS (Caddy 默认自动处理,此处显式声明) # =============================================================================