CentOS开启WSS协议

为什么要启用WSS?开发游戏,微信小程序,都需要WSS。
WSS能干什么?创建长连接,主动发送信息到连接上的客户端。

测试环境:Centos7.4,以wss.enozoom.com为例。

环境准备

  1. Nginx+PHP环境下,拥有SSL证书,使用workerman。

    Nginx+PHP+SSL证书环境,参考OneinStack快捷安装PHP7.2+Nginx+Mysql5.7,在环境搭建完成后,开设虚拟主机选择3. use Let's Encrypt to Create SSL Certificate and Key

  2. 下载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需要的组件
  3. 启用8081端口

    #打开配置文件
    vim /etc/sysconfig/iptables

    在合适处,添加一行-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT

    # 重启
    service iptables restart
  4. 在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

  1. 启用虚拟主机根目录下的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端口。

  2. 重启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

JOE