在国产云环境(阿里云、华为云、腾讯云等)中适配 Claude API 时,你遇到的“HTTP/2 与 SSE 穿透问题”,本质是云上标准网关组件对流式长连接的支持不够“原生”,常见现象是:

· 流式响应被缓冲,客户端等很久才一次性收到所有数据
· 连接被 WAF / SLB 意外断开
· HTTP/2 协商失败,直接回退到 HTTP/1.1 甚至报错

下面以自建反向代理网关为核心,给出可直接落地的方案。这也是目前大规模调用 Claude 时最可控的做法。

---

一、问题拆解:为什么会有“穿透”问题

现象 根因
SSE 流不实时,聚合成一大块返回 代理或云负载均衡开启了响应缓冲
连接在 60s 左右断掉 SLB/网关默认空闲超时较短,且未发送 keepalive
HTTP/2 请求失败,返回 502 前端云产品(如 CDN、全站加速)未正确透传 HTTP/2 ALPN,或后端代理只支持 HTTP/1.1
安全设备拦截 text/event-stream 部分国产 WAF 不认识 SSE 内容类型,当作异常流量阻断

Claude API 的流式响应(stream: true)正是基于 SSE,并要求连接保持长时存活。要解决这些问题,自建一层 Nginx/Envoy/APISIX 代理,放在云负载均衡之后,负责协议适配和缓冲剥离,是最有效的手段。

---

二、核心方案:Nginx 作为 SSE 和 HTTP/2 适配层

1. 整体架构

```
客户端
  │ HTTPS (HTTP/2)
  ▼
国产云 SLB/CLB(TCP 模式,不解析 HTTP)
  │ TCP 转发 :443
  ▼
Nginx 反向代理(处理 TLS, HTTP/2, SSE)
  │ HTTP/1.1(到上游,最稳妥)
  ▼
api.anthropic.com (Claude API)
```

关键思路:

· SLB 使用四层 TCP 转发,不解析 HTTP,避免其干扰 HTTP/2 和 SSE。
· Nginx 终结 TLS,对外暴露 HTTP/2,对内用 HTTP/1.1 + 长连接 访问 Claude API。
· 彻底关闭响应缓冲,强制 chunked 透传。

2. Nginx 关键配置

```nginx
upstream claude_backend {
    server api.anthropic.com:443;
    keepalive 32;  # 保持长连接池
}

server {
    listen 443 ssl http2;
    server_name your-proxy-domain.com;

    ssl_certificate     /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    # 安全策略,确保支持 HTTP/2 ALPN
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    location /v1/messages {
        # 必须设置为 HTTP/1.1 以支持 chunked 和 keepalive
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host api.anthropic.com;

        # ----- 核心:SSE 不缓冲 -----
        proxy_buffering off;           # 关闭代理缓冲
        proxy_cache off;               # 关闭缓存
        chunked_transfer_encoding on;  # 强制分块传输
        gzip off;                      # 对 SSE 必须关闭 gzip

        # 超时与长连接
        proxy_read_timeout 600s;       # Claude 可能长时间不发送数据
        proxy_send_timeout 600s;
        proxy_connect_timeout 30s;

        # 透传鉴权头(避免云平台剥离)
        proxy_set_header x-api-key $http_x_api_key;
        proxy_set_header anthropic-version $http_anthropic_version;
        proxy_set_header Content-Type application/json;

        # 增加 SSE 响应头提示(可选)
        add_header X-Accel-Buffering no;  # 防止其他中间件缓冲

        # 后端 HTTPS
        proxy_pass https://claude_backend;
        proxy_ssl_server_name on;      # SNI
        proxy_ssl_protocols TLSv1.2 TLSv1.3;
    }
}
```

为什么用 HTTP/1.1 到上游?
Claude API 目前完全兼容 HTTP/1.1 的分块传输,而且 Nginx 到后端的 HTTP/2 支持较为复杂(需用 grpc_pass 或特殊模块),不建议在此场景使用。客户端 HTTP/2 的请求会在 Nginx 侧被解帧,转为 HTTP/1.1 发送给 Claude,透明且稳定。

3. 解决 HTTP/2 穿透的额外要点

· 前置 SLB 必须四层转发:在阿里云 CLB 上选择 “TCP” 监听,而非 HTTP/HTTPS 监听。这样负载均衡只做包转发,不会破坏 TLS 和 HTTP/2 特性。
· 域名与证书:Nginx 自己持有域名的 SSL 证书,SLB 上无需绑定证书。如果不想在代理服务器存放证书,也可在 SLB 做 SSL 卸载,但仍建议 SLB 使用 TCP+SSL 透传模式(四层),将原始流量传给 Nginx。
· 避免 WAF 阻断:如果云 WAF 必须经过,需要在 WAF 白名单中放通 text/event-stream 响应类型,并关闭“响应缓冲”或“流式检查”选项(国产 WAF 通常叫“防慢速攻击”或“缓冲池”)。更推荐把代理服务器的 IP 加入 WAF 白名单,绕过 HTTP 检查。

---

三、进一步简化:使用云原生网关(APISIX / Higress)

如果你不想维护 Nginx,也可以在国产云上部署基于 Envoy 的云原生网关,例如 阿里云 MSE 云原生网关 或 APISIX,它们对流式处理和 HTTP/2 有原生支持:

· 配置路由时,将上游类型设为“服务发现”,并启用 proxy_buffering: false,设置超时时间为 600s。
· 对于阿里云 MSE,需要在路由的高级选项中添加注解 nginx.ingress.kubernetes.io/proxy-buffering: "off"。
· 如果使用腾讯云 API 网关,需要开启“透传响应”并关闭“响应压缩”。

但请注意,部分云产品的“API 网关”专为短请求设计,SSE 支持有限,务必查看文档确认是否支持流式响应无超时。

---

四、国产云环境特别排查项

1. 安全组 & NAT
   Nginx 代理服务器需能出方向访问 api.anthropic.com:443(海外地址),确保云服务器有公网出口,或通过 NAT 网关转发。
2. DNS 解析
   部分信创环境可能屏蔽境外域名,可在 Nginx 中使用 IP 直连 Claude 的 IP 池(Anthropic 提供的 api.anthropic.com 对应一组固定 IP),配置 upstream 时写死 IP,减少 DNS 依赖。
3. 日志监控
   在 Nginx 中开启 error_log 级别 info,查看是否有 upstream prematurely closed connection 等错误,便于定位云环境超时问题。
4. 压测验证
   用 curl 模拟流式请求测试代理:
   ```bash
   curl -N -X POST https://your-proxy.com/v1/messages \
        -H "x-api-key: $API_KEY" \
        -H "anthropic-version: 2023-06-01" \
        -H "Content-Type: application/json" \
        -d '{"model":"claude-sonnet-4-20250514","max_tokens":1024,"stream":true,"messages":[{"role":"user","content":"Hello"}]}'
   ```
   正常应看到数据逐块返回,无长时间停顿。

---

五、小结

在国产云中适配 Claude 并解决 HTTP/2 与 SSE 的穿透问题,核心是“绕开”不友好的云中间件,自建一个能关闭缓冲、拉长超时、正确终结 HTTP/2 的代理层。Nginx 方案成本最低、最可控,只要把握住 TCP 四层转发 + Nginx 做 SSL/HTTP2 终止 + 到上游 HTTP/1.1 + 禁用缓冲 这几个要点,SSE 流就能丝滑穿透。

如果你们的业务已经跑在 Kubernetes 上,可以考虑用 EnvoyFilter 或 Higress 配置,本质上也是同样的参数调整。

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐