springboot项目中集成了websocket之后,本地测试正常,但是部署到服务器之后,容易遇到的几个问题。
本文指的服务器环境 为Linux+Nginx 其他环境可能不适用
问题一、pom文件的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<scope>provided</scope>
</dependency>
如果打包方式是War,项目会由外部Tomcat管理,此时这个依赖是不需要的,因为Tomcat7以及7以上的版本对websocket是直接支持的。因此可以将作用域设置为provided,Tomcat 8以下的版本似乎会与此依赖冲突,8以及8以上不冲突(未严格测试过)。
问题二、ServerEndpointExporter@Bean
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
问题二与问题一的原因类似,在本地测试的时候,项目是Spring管理,因此需要ServerEndpointExporter这个bean,但通过War部署会将项目交给外部Tomcat管理,ServerEndpoint是需要Tomcat直接管理才能生效,ServerEndpointExporter @Bean的存在会导致管理权交接失败,项目无法启动。
所以部署之前,需要将bean ServerEndpointExporter注释掉,或者通过@Profile()设置为测试环境生效。
问题三、连接报404或者400
WebSocket connection to ‘ws://xxx:8080/xxx’ failed: Error during WebSocket handshake: Unexpected response code: 404
此问题是Nginx未开启websocket穿透支持导致。
需要在Nginx的配置文件中加入
location / {
// 加入这三行
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
//
}
如果是在宝塔面板环境,则在此站点的配置文件中加入。
重启Nginx便可。