基本配置

ubuntu服务器
服务端nodejs
nginx
https://blog.freessl.cn/ 证书管理

基本说明

在准备好域名、服务器之后,为了逻辑层面的区分,启动nodejs时,启动了三个进程,将socket.io的连接层分离了出来,监听4000端口。然后通过nginx做代理进行端口转发,上图:
屏幕快照 2019-06-26 上午8.02.49.png

屏幕快照 2019-06-26 上午8.03.32.png

屏幕快照 2019-06-26 上午8.03.50.png

屏幕快照 2019-06-26 上午8.07.35.png

随后,我写了一个html页面,用了socket.io的客户端,来和服务端进行通信:

屏幕快照 2019-06-26 上午8.11.39.png

此时,打开浏览器的结果,应该是socket连接上,保持心跳,然后就可以发送消息,做聊天室应用了。

问题显现

打开网站后,实际情况是:

屏幕快照 2019-06-26 上午8.13.36.png
满屏的报错,看着就让人头疼。此时再看服务器的日志:
屏幕快照 2019-06-26 上午8.15.36.png

问题探究

日志显示,毫无疑问socket是已经连接成功了,但是为什么客户端就在一直报错呢?而且导致发不了消息。这个时候我并没有怀疑是https证书导致的socket连接问题,毕竟,能打开https://www.xxxx.top这个域名,就表示证书在使用https上是没什么问题的。
百思不得其解后,我去请教了冯老师,首先他看了下nginx配置、代码、日志,也没发现问题。但是这个时候他让我更改nginx配置,先不用https,直接用http,于是我改了下nginx的配置如下:
屏幕快照 2019-06-26 上午8.21.52.png

然后重新刷新了页面,这时候神奇的事情发生了,页面居然什么报错都没有:
屏幕快照 2019-06-26 上午8.30.45.png
屏幕快照 2019-06-26 上午8.31.16.png
这就证明了,用http进行socket连接是没问题的,用https就有问题,两者之间的差距就在于https用了证书,再仔细检查https的证书,发现我此时用的证书是pem文件,而不是crt,于是决定试下,重新更换证书,换成crt的证书,再将nginx改回原来的配置:
屏幕快照 2019-06-26 上午8.35.14.png

再次刷新页面,神奇的事情发生了:
屏幕快照 2019-06-26 上午8.36.56.png
屏幕快照 2019-06-26 上午8.37.25.png

最后,为什么https的证书会影响socketio的连接,这个问题在各种搜索后还没得到答案,暂且先放下,以后如果碰到相关的资料时就会明白怎么回事。

事后反思

这里更重要的是‘碰到问题->发现问题根源->解决问题’的整个过程,事后自我反思下,发现自己在碰到问题时,没有在无法解决问题的基础上做各种尝试,在越是不可能出问题的地方,越是有可能出问题。

谨记经验教训,避免以后再犯!