我的WebSocket
协议原理回头补上
需要用到的文件:
服务端文件:server.php
客户端文件:client.php本次实验环境:
阿里云ECS(Windows)、宝塔、Apache + PHP
第1步:准备工作
server.php
文件是用纯PHP
语言写的创建WebSocket
服务的文件,因此服务端必须已安装好PHP
环境,Windows
系统还需要设置PHP
环境变量以便在服务目录里使用PHP
命令行操作。websocket
自身就是一项服务,因此不必把服务文件放在网站项目目录下,甚至不需要安装Apache
等服务,只要在php.exe
的作用范围内即可(我这里需要用站点所以搭建了Apache
)。
服务端文件用于创建websocket服务用以及响应客服端请求。
注意server.php文件最下面:
$ws = new WebSocket("0.0.0.0", "9000");
服务地址写四个0,服务端口随便写,端口不要与其他服务冲突。
这行代码用于命令行运行该PHP文件的时候创建websocket服务。
第2步:服务器端挂起服务程序
服务器端进入server.php所在目录下,按住Shift + 鼠标右键
选则“在此处打开命令窗”运行:
php -f server.php
即可挂起ws服务。
第3步:配置HTTPS+WSS
这个过程也是我消耗时间最长的过程,网上大都是用的都Nginx服务器,它和Apache有一定的区别。以下是Apache服务器的正确解决办法。
WSS和HTTPS一样都是在原协议基础上增加了ssl加密,原始端口使用的都是80端口,加密后使用的都是443端口。因此这里有两个问题需要解决:
第一个问题,ssl是对域名进行验证的,因此必须得用域名请求服务。一般域名提供商都会提供免费一年的ssl证书服务(从第一次申请ssl域名证书开始算),具体怎么获取ssl证书参照域名提供商的说明。
如果你已经为你的站点配置过了HTTPS的域名证书,那么实现wss不需要再进行独立配置。
如果没有配置过,宝塔管理平台上可以快捷设置ssl证书,只需要把下载的证书填写进去就可以了。
手动添加ssl证书到站点也不是很复杂,网上随便搜索就能搜到(这不是问题的难点)。
第二个问题,HTTPS使用443端口通信,WSS也需要使用443端口通信,因此会出现冲突。我们需要做的就是用Apache的反向代理将wss请求转向服务端运行的9000端口的ws服务。
具体操作如下:
宝塔的:网站->(指定站点)设置->配置文件加上:
<VirtualHost *:443> ...#PROXY-STARTRewriteEngine onProxyRequests offProxyPass /ws ws://127.0.0.1:9000/ProxyPassReverse /ws s://127.0.0.1:9000/#ProxyPass / https://127.0.0.1/#ProxyPassReverse / https://127.0.0.1/#PROXY-END...</VirtualHost>
注意:上面代码中的数字后面有斜线“/”,加和不加是有区别的
以上是就是配置Apache反向代理,将所有“URL/”
请求都指向本地HTTPS
将所有“URL/wx”
请求都指向本地ws://127.0.0.1:9000/
特别注意要进行下面操作:
修改Apache安装路径下的httpd.conf文件,确保以下条目前面的“#”已经去掉
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_connect_module modules/mod_proxy_connect.soLoadModule proxy_express_module modules/mod_proxy_express.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_http2_module modules/mod_proxy_http2.soLoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.soLoadModule rewrite_module modules/mod_rewrite.soLoadModule ssl_module modules/mod_ssl.so
第4步:配置client.html
第三步里面我们把所有“URL/wx”
请求都指向本地ws://127.0.0.1:9000/
所以在client里面我们要设置请求协议为wss
,请求地址是域名后面加上了“/ws”
var ws = new WebSocket("wss://www.doywb.com/ws");
这并不需要在站点里面设置ws这个模块,但是如果通过HTTPS访问https://www.doywb.com/ws
就会报错,需要注意。