分享学习心得,记录学习笔记
文章:44   访问:119489
今天是:
2020年02月19日 星期三
  >   文章列表   >   文章详情

我的WebSocket

协议原理回头补上

需要用到的文件:

服务端文件:server.php
客户端文件:client.php

本次实验环境:
阿里云ECS(Windows)、宝塔、Apache + PHP

第1步:准备工作

  1. server.php文件是用纯PHP语言写的创建WebSocket服务的文件,因此服务端必须已安装好PHP环境,Windows系统还需要设置PHP环境变量以便在服务目录里使用PHP命令行操作。
  2. 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就会报错,需要注意。

用户头像
逍遥君


2019-05-18 16:52:38
# 3
用户头像
浮叶蓝空


2019-05-16 17:52:35
# 2
用户头像
浮叶蓝空

哇,真详细

2019-05-07 20:07:40
# 1

友情链接 doywb

2018-2019 Copyright© 米灵尔 小熊 豫ICP备15007436号-1

豫公网安备 41152302000146号