CentOS开启WSS协议
为什么要启用WSS?开发游戏,微信小程序,都需要WSS。
WSS能干什么?创建长连接,主动发送信息到连接上的客户端。
测试环境:Centos7.4,以wss.enozoom.com为例。
环境准备
-
Nginx+PHP环境下,拥有SSL证书,使用workerman。
Nginx+PHP+SSL证书环境,参考OneinStack快捷安装PHP7.2+Nginx+Mysql5.7,在环境搭建完成后,开设虚拟主机选择
3. use Let's Encrypt to Create SSL Certificate and Key
。 - 下载workerman.
workerman是php写的socket框架,嗯国产的。cd /home/wwwroot/wss.enozoom.com #进入虚拟主机根目录,也可以放在其他位置 wget https://www.workerman.net/download/workermanzip #下载 unzip workermanzip #解压 rm wokermanzip #删除压缩包 mv Workerman-master workerman #重命名文件夹 cd workerman #进入workerman框架 composer install #加载workerman需要的组件
-
启用8081端口
#打开配置文件 vim /etc/sysconfig/iptables
在合适处,添加一行
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
# 重启 service iptables restart
- 在workerman目录下,创建启动文件bootstrap.php:
use Workerman\Worker; require_once __DIR__.'/Autoloader.php';// 注意,如果不是在workerman目录下创建启动文件,需要调整。 $link = function(int $type=0) { return new Worker(sprintf('%s://0.0.0.0:8182',['http','websocket'][$type])); }; $link(1)->onMessage = function($connection,$data) { $connection->send('helloworld'); }; Worker::runAll();
修改nginx配置文件
找到配置文件wss.enozoom.com.conf:
尝试以下面的例子对比修改
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 127.0.0.1:8081;
}
server {
listen 443 ssl http2;
ssl_certificate /usr/local/nginx/conf/ssl/wss.enozoom.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wss.enozoom.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
server_name wss.enozoom.com;
access_log off;
location /
{
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
启动WSS
- 启用虚拟主机根目录下的workerman
php /data/wwwroot/wss.enozoom.com/workerman/bootstrap.php start -d # 这里是以守护模式开启,关闭远程仍会运行,如果关闭请执行 # php /data/wwwroot/wss.enozoom.com/workerman/bootstrap.php stop # 更多命令 # php bootstrap.php restart #重启 # php bootstrap.php reload #平滑重启 # php bootstrap.php status #查看状态
注意,如果无法启动,请检查php.ini配置是否禁用了“stream_socket_server”,从
disable_functions
中移除。
可以尝试访问http://wss.enozoom.com:8081(以你的域名为准),如果无法访问,请检查防火墙是否允许了8081端口;如果使用了阿里云,检查在阿里云网站后台查看该服务器本实例安全组
,在入站规则中是否添加了8081端口。 - 重启Nginx
service nginx restart
访问WSS
客户端(浏览器)端执行以下代码,必须声明HTML5:
// 这是官方例子
ws = new WebSocket("wss://wss.enozoom.com");
ws.onopen = function() {
console.log("连接成功");
ws.send('tom');
console.log("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
console.log("收到服务端的消息:" + e.data);
};
其他
socket事件响应,主要基于workerman的phpsocket.io,更多内容请参考:
http://doc3.workerman.net
https://github.com/walkor/phpsocket.io
http://www.workerman.net