CapRover代理Spring Boot HTTP/2应用时SSE出现协议错误求助
解决CapRover代理Spring Boot HTTP/2 SSE的超时错误问题
核心问题分析
你的问题根源有两点:
- CapRover强制使用HTTP/1.1代理:默认添加的
proxy_http_version 1.1指令,会让Nginx以HTTP/1.1协议向后端Spring Boot(HTTP/2)转发请求,破坏了HTTP/2对SSE的原生优化。 - 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来覆盖默认值。
额外排查步骤
- 确认后端Spring Boot内嵌Tomcat已开启HTTP/2:检查
application.properties或application.yml中是否配置了server.http2.enabled=true。 - 查看Nginx错误日志(路径通常为
/var/log/nginx/error.log),确认是否有连接断开的具体错误信息。 - 测试直接访问后端IP:端口的SSE端点,确认长时间运行无异常,排除后端自身问题。
内容的提问来源于stack exchange,提问作者Solonl
相关产品推荐
相关产品推荐

