You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CapRover代理Spring Boot HTTP/2应用时SSE出现协议错误求助

解决CapRover代理Spring Boot HTTP/2 SSE的超时错误问题

核心问题分析

你的问题根源有两点:

  1. CapRover强制使用HTTP/1.1代理:默认添加的proxy_http_version 1.1指令,会让Nginx以HTTP/1.1协议向后端Spring Boot(HTTP/2)转发请求,破坏了HTTP/2对SSE的原生优化。
  2. HTTP/1.1下的长连接超时:SSE依赖持久长连接,Nginx默认的超时设置会在几分钟后主动断开连接,导致浏览器抛出NS_ERROR_NET_PARTIAL_TRANSFER或ERR_HTTP2_PROTOCOL_ERROR错误。

解决方案一:适配HTTP/1.1代理的SSE配置

无需修改CapRover核心逻辑,只需在应用的自定义Nginx配置中添加以下指令,覆盖默认的超时和连接规则:

location / {
    proxy_pass https://MY_IP_ADDRESS_COMES_HERE:7372;
    # 禁用Nginx默认的Connection头,保持长连接
    proxy_set_header Connection "";
    proxy_http_version 1.1;
    # 禁用缓存,防止SSE事件被拦截缓存
    proxy_cache_bypass $http_upgrade;
    proxy_no_cache 1;
    # 延长超时时间,避免Nginx主动断开SSE长连接
    proxy_connect_timeout 7d;
    proxy_send_timeout 7d;
    proxy_read_timeout 7d;
    # 传递必要的请求头,让后端正确识别请求来源
    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 Connection "":避免Nginx向后端发送Connection: close头,强制保持长连接。
  • 7天超时设置:确保SSE连接不会因Nginx超时被断开,可根据业务需求调整。
  • 禁用缓存:SSE事件是实时推送的,缓存会导致事件丢失或重复。

解决方案二:启用Nginx HTTP/2代理(保留后端HTTP/2特性)

如果需要保留后端Spring Boot的HTTP/2优化,需确保CapRover使用的Nginx版本≥1.15.8(支持HTTP/2代理),然后在自定义配置中覆盖proxy_http_version为2:

location / {
    proxy_pass https://MY_IP_ADDRESS_COMES_HERE:7372;
    # 强制使用HTTP/2协议向后端转发
    proxy_http_version 2;
    proxy_set_header Connection "";
    # 传递HTTP/2相关头信息
    proxy_set_header Upgrade $http_upgrade;
    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_connect_timeout 7d;
    proxy_send_timeout 7d;
    proxy_read_timeout 7d;
}

注意:CapRover默认会自动插入proxy_http_version 1.1,所以必须在自定义配置中明确指定proxy_http_version 2来覆盖默认值。


额外排查步骤

  1. 确认后端Spring Boot内嵌Tomcat已开启HTTP/2:检查application.properties或application.yml中是否配置了server.http2.enabled=true。
  2. 查看Nginx错误日志(路径通常为/var/log/nginx/error.log),确认是否有连接断开的具体错误信息。
  3. 测试直接访问后端IP:端口的SSE端点,确认长时间运行无异常,排除后端自身问题。

内容的提问来源于stack exchange,提问作者Solonl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:45:24