背景
项目上前后端分离架构,采用WebSocket来实现告警推送功能,以保证实时性。在沙箱环境一直没有问题,到了生产环境,WS一直连不上。前端浏览器控制台有如下错误:
Incompatibile SockJS! Main site uses: "1.1.4", the iframe: "1.0.0"...
排查步骤
陆续排查了3天时间,能遇到的问题基本都遇到了一遍。网络、nginx、nacos等方面都发现了问题,现总结如下:
针对异常:Handshake failed due to invalid Upgrade header: null,需要在nginx中增加配置:
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# For WebSocket upgrade header
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
这块需要强调的一件事,我们在启停Nginx请严格规范化操作,建议使用固定的用户。我们就发现由于我们启停nginx非常不规范,导致master的启动用户和worker的启动用户不一致。在进行reload操作的时候新增配置未生效。
针对前端异常:Incompatibile SockJS! Main site uses: "1.1.4", the iframe: "1.0.0",需要在服务端代码中:
@Override
public void registerStompEndpoints( StompEndpointRegistry registry )
{
registry.addEndpoint( "/device/alarm" )
.setAllowedOrigins( "*" )
.withSockJS( )
.setClientLibraryUrl( "../lib/sockjs-client/dist/sockjs.min.js" ); // Added
}
一般来说修改这两点,基本上就没多大问题了。我们排查过程中,遇到了个比较恶心的问题。由于我们虚拟机是分网段的,有管理IP和业务IPz之分,生产环境业务间都是需要通过业务IP进行访问的。管理IP和业务IP不互通。我们发现出问题的机器,业务IP和其它服务的业务IP不同。导致以上的问题一直出现。这个还是在nacos上发现的,打开nacos发现启动的微服务未成功注册,服务列表页面看不到任何的服务页面。
总结
经过这件事,明显的体会到很多开源中间件(kafka、zk、ch)都建议使用主机名通信是多么的明智,我们只需要将主机名进行统一的管理即可。对于核心中间件还是需要使用单独的用户进行启停的,权限限制得大一些,别图方便每个用户都可以启停服务。需要养成一个好的习惯。








网友评论