宝塔面板的Apache通过反向代理配置wss服务,反向代理端口后的wss问题解决

问题场景:

Websocket就是在web端上的全双工通信,一旦链接成功就是持久性的链接,不需要像Http那样请求一次那一次信息,浪费资源。

本次场景是在我用websocket配合echart在web端画出底层机器采集到数据实时显示到web端,本来在本地以及配置好,也能完美运行了,但是上传到服务器后就出现问题了。

websocket = new WebSocket("ws://127.0.0.1:8080/xxx");
websocket.onerror = function(e){
				/* console.info("onerror=>", e) */
				 console.log(e);
			}

通过onerror  catch到readyState=3

通过查询到webSocket的readyState属性用来定义连接状态,该属性的值有下面几种:

0 :对应常量CONNECTING (numeric value 0),
正在建立连接连接,还没有完成。The connection has not yet been established.
1 :对应常量OPEN (numeric value 1),
连接成功建立,可以进行通信。The WebSocket connection is established and communication is possible.
2 :对应常量CLOSING (numeric value 2)
连接正在进行关闭握手,即将关闭。The connection is going through the closing handshake.
3 : 对应常量CLOSED (numeric value 3)
连接已经关闭或者根本没有建立。The connection has been closed or could not be opened.

 

那很明显我用上了SSL的Https的网址连接wss根本就没有建立。

这就是我找到的问题

 

问题分析:

然后因为云服务器的Apache的Https的端口默认是443的,如果又想运Apache又想运行一个Https的网站,明显不能同时用443端口,所以只能通过Apache的反向代理,把jar包的比如8080端口的反向代理到443端口,就能实现网站和Apache同时在机器上运行了。

那么因为我是通过 Apache 代理,将域名解析到指定端口来实现 Springboot 应用的上线,而 WebSocket 在握手的时候请求直接发送到 Apache。Apache 代理的时候没法将 WebSocket 握手请求传递给 Springboot 应用,结果就是握手失败,就是根本找不到连接了!

 

问题解决方法:

1, 进入宝塔面板, 网站 -> 设置,   *注: 网站绑定的域名必须是先支持https的

2,  查看反向代理的具体配置文件地址

 

3, 目录下只有一个文件, 将持久化连接配置, 按如下图加这两行代码。即可开启WSS

    ProxyPass /wss ws://www.xxx.com:port/
    ProxyPassReverse /wss ws://www.xxx.com:port/

 

最后!!!

如果你也是Apache反向代理后的,请在js那这样配置websocket的对象

websocket = new WebSocket("wss://网址:反向代理后的端口(比如8080,因为反向代理了,不可能是443的,注意这个,一定要加上反向代理后的端口)/xxx/xxxxxx");

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值