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

Grails生产环境WebSocket连接秒断问题排查求助

Grails生产环境WebSocket连接1秒断开的排查方向

本地开发环境中Grails后端WebSocket服务启动5分钟后可正常运行,但在Cloudflare(证书终止)、Nginx、Tomcat 8.5组成的生产环境中,连接建立后1秒就断开,Chrome与Firefox均出现该问题,且关闭Cloudflare代理、不使用HTTPS-WSS后问题依旧。结合提供的配置,可从以下方向排查:

  • 修正Nginx路径匹配规则
    当前Nginx配置的location /stomp/带末尾斜杠,但前端请求的是/stomp(无末尾斜杠),可能导致请求无法匹配到正确的location规则,进而转发失败。建议将location改为location /stomp(去掉末尾斜杠),或者使用正则匹配location ~ ^/stomp,确保所有以/stomp开头的请求都能被正确转发。

  • 验证Tomcat的WebSocket连接器配置
    Tomcat 8.5默认支持WebSocket,但BIO连接器对WebSocket的支持有限,需确认server.xml中使用的是NIO或APR连接器(如<Connector protocol="org.apache.coyote.http11.Http11NioProtocol")。同时查看Tomcat的catalina.out日志,确认是否有WebSocket连接建立后的异常断开日志(如会话强制关闭的报错)。

  • 检查Grails WebSocket插件与版本兼容性
    当前使用的grails-spring-websocket:2.5.0.RC1是候选版本,可能存在未修复的bug。建议尝试更换为稳定版(如2.4.x系列),同时确认Grails框架版本与该插件的兼容性。另外,Java配置中重复注册了GrailsSimpAnnotationMethodMessageHandler和GrailsWebSocketAnnotationMethodMessageHandler,可尝试移除重复的Bean定义,避免冲突。

  • 添加WebSocket心跳配置
    连接断开可能是因为无数据传输时被中间件或服务器主动关闭。在WebSocketConfig的configureMessageBroker方法中添加心跳配置:

    messageBrokerRegistry.setHeartbeatValue(new long[]{10000, 10000})
    

    该配置会让服务器每10秒发送一次心跳包,维持连接活性。同时确保前端Stomp客户端也开启了心跳监听(webstomp默认支持,无需额外配置,但可检查客户端是否正确处理心跳)。

  • 绕过Nginx直接测试Tomcat连接
    暂时跳过Nginx,直接通过Tomcat的IP+端口访问WebSocket服务(如http://tomcat-ip:port/stomp),观察连接是否正常。如果直接连接正常,说明问题出在Nginx配置;如果仍断开,则聚焦Tomcat或应用本身的问题。

  • 排查服务器端异常日志
    重点查看Grails应用日志和Tomcat的错误日志,当连接断开时,是否有SessionClosedException、消息处理异常等报错信息,这些日志能直接定位连接断开的具体原因(如消息解析错误、权限问题等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:48:25