在国产云环境阿里云、华为云、腾讯云等中适配 Claude API 时你遇到的“HTTP/2 与 SSE 穿透问题”本质是云上标准网关组件对流式长连接的支持不够“原生”常见现象是· 流式响应被缓冲客户端等很久才一次性收到所有数据· 连接被 WAF / SLB 意外断开· HTTP/2 协商失败直接回退到 HTTP/1.1 甚至报错下面以自建反向代理网关为核心给出可直接落地的方案。这也是目前大规模调用 Claude 时最可控的做法。---一、问题拆解为什么会有“穿透”问题现象 根因SSE 流不实时聚合成一大块返回 代理或云负载均衡开启了响应缓冲连接在 60s 左右断掉 SLB/网关默认空闲超时较短且未发送 keepaliveHTTP/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/CLBTCP 模式不解析 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 关键配置nginxupstream 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 ALPNssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers off;location /v1/messages {# 必须设置为 HTTP/1.1 以支持 chunked 和 keepaliveproxy_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; # 防止其他中间件缓冲# 后端 HTTPSproxy_pass https://claude_backend;proxy_ssl_server_name on; # SNIproxy_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 使用 TCPSSL 透传模式四层将原始流量传给 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. 安全组 NATNginx 代理服务器需能出方向访问 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 模拟流式请求测试代理bashcurl -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 配置本质上也是同样的参数调整。
你遇到的“HTTP/2 与 SSE 穿透问题
发布时间:2026/7/5 5:31:23
在国产云环境阿里云、华为云、腾讯云等中适配 Claude API 时你遇到的“HTTP/2 与 SSE 穿透问题”本质是云上标准网关组件对流式长连接的支持不够“原生”常见现象是· 流式响应被缓冲客户端等很久才一次性收到所有数据· 连接被 WAF / SLB 意外断开· HTTP/2 协商失败直接回退到 HTTP/1.1 甚至报错下面以自建反向代理网关为核心给出可直接落地的方案。这也是目前大规模调用 Claude 时最可控的做法。---一、问题拆解为什么会有“穿透”问题现象 根因SSE 流不实时聚合成一大块返回 代理或云负载均衡开启了响应缓冲连接在 60s 左右断掉 SLB/网关默认空闲超时较短且未发送 keepaliveHTTP/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/CLBTCP 模式不解析 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 关键配置nginxupstream 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 ALPNssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers off;location /v1/messages {# 必须设置为 HTTP/1.1 以支持 chunked 和 keepaliveproxy_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; # 防止其他中间件缓冲# 后端 HTTPSproxy_pass https://claude_backend;proxy_ssl_server_name on; # SNIproxy_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 使用 TCPSSL 透传模式四层将原始流量传给 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. 安全组 NATNginx 代理服务器需能出方向访问 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 模拟流式请求测试代理bashcurl -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 配置本质上也是同样的参数调整。