问:

Workerman如何创建一个wss服务,使得客户端可以用过wss协来连接通讯,比如在微信小程序中连接服务端。

答:

wss协议实际是websocket+SSL,就是在websocket协议上加入SSL层,类似https(http+SSL)。
所以只需要在websocket协议的基础上开启SSL即可支持wss协议。

方法一 ,直接用Workerman开启SSL

准备工作:

1、Workerman版本不小于3.3.7

2、PHP安装了openssl扩展

3、已经申请了证书(pem/crt文件及key文件)放在磁盘任意目录

代码:

<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;// 证书最好是申请的证书
$context = array(// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php'ssl' => array(// 请使用绝对路径'local_cert'                 => '磁盘路径/server.pem', // 也可以是crt文件'local_pk'                   => '磁盘路径/server.key','verify_peer'                => false,// 'allow_self_signed' => true, //如果是自签名证书需要开启此选项)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$worker = new Worker('websocket://0.0.0.0:443', $context);
// 设置transport开启ssl,websocket+ssl即wss
$worker->transport = 'ssl';
$worker->onMessage = function($con, $msg) {$con->send('ok');
};Worker::runAll();

通过以上的代码,Workerman就监听了wss协议,客户端就可以通过wss协议来连接workerman实现安全即时通讯了。

测试

打开chrome浏览器,按F12打开调试控制台,在Console一栏输入(或者把下面代码放入到html页面用js运行)

// 证书是会检查域名的,请使用域名连接
ws = new WebSocket("wss://域名");
ws.onopen = function() {alert("连接成功");ws.send('tom');alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {alert("收到服务端的消息:" + e.data);
};

注意:

1、如果无法启动,则一般是443端口被占用,请改成其它端口,注意改成其它端口后客户端连接时需要带上端口号,客户端连接时地址类似wss://domain.com:xxx ,xxx为端口号。如果必须使用443端口请使用方法二代理的方式实现wss。

2、wss端口只能通过wss协议访问,ws无法访问wss端口。

3、证书一般是与域名绑定的,所以测试的时候客户端请使用域名连接,不要使用ip去连。

4、如果出现无法访问的情况,请检查服务器防火墙。

5、此方法要求PHP版本>=5.6,因为微信小程序要求tls1.2,而PHP5.6以下版本不支持tls1.2。

方法二、利用nginx/apache代理wss

除了用Workerman自身的SSL,也可以利用nginx/apache作为wss代理转发给workerman(注意此方法workerman部分千万不要设置ssl,否则将无法连接)。

通讯原理及流程是:

1、客户端发起wss连接连到nginx/apache

2、nginx/apache将wss协议的数据转换成ws协议数据并转发到Workerman的websocket协议端口

3、Workerman收到数据后做业务逻辑处理

4、Workerman给客户端发送消息时,则是相反的过程,数据经过nginx/apache转换成wss协议然后发给客户端

nginx配置参考

前提条件及准备工作:

1、已经安装nginx,版本不低于1.3

2、假设Workerman监听的是8282端口(websocket协议)

3、已经申请了证书(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下

4、打算利用nginx开启443端口对外提供wss代理服务(端口可以根据需要修改)

5、nginx一般作为网站服务器运行着其它服务,为了不影响原来的站点使用,这里使用地址 域名/wss 作为wss的代理入口。也就是客户端连接地址为 wss://域名/wss

nginx配置类似如下

server {listen 443;ssl on;ssl_certificate /etc/ssl/server.pem;ssl_certificate_key /etc/ssl/server.key;ssl_session_timeout 5m;ssl_session_cache shared:SSL:50m;ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;location /wss{proxy_pass http://127.0.0.1:8282;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header X-Real-IP $remote_addr;}# location / {} 站点的其它配置...
}

测试

// 证书是会检查域名的,请使用域名连接
ws = new WebSocket("wss://域名/wss");ws.onopen = function() {alert("连接成功");ws.send('tom');alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {alert("收到服务端的消息:" + e.data);
};

利用apache代理wss

也可以利用apache作为wss代理转发给workerman(注意如使用apache代理SSL,则workerman部分千万不要设置ssl,否则将无法连接)。

准备工作:

1、GatewayWorker 监听 8282 端口(websocket协议)

2、已经申请了ssl证书, 放在了/server/httpd/cert/ 下

3、利用apache转发443端口至指定端口8282

4、httpd-ssl.conf 已加载

5、openssl 已安装

启用 proxy_wstunnel_module 模块

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

配置SSL及代理

#extra/httpd-ssl.conf
DocumentRoot "/网站/目录"
ServerName 域名# Proxy Config
SSLProxyEngine onProxyRequests Off
ProxyPass /wss ws://127.0.0.1:8282/wss
ProxyPassReverse /wss ws://127.0.0.1:8282/wss# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 证书公钥配置
SSLCertificateFile /server/httpd/cert/your.pem
# 证书私钥配置
SSLCertificateKeyFile /server/httpd/cert/your.key
# 证书链配置,
SSLCertificateChainFile /server/httpd/cert/chain.pem

测试

// 证书是会检查域名的,请使用域名连接
ws = new WebSocket("wss://域名/wss");ws.onopen = function() {alert("连接成功");ws.send('tom');alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {alert("收到服务端的消息:" + e.data);
};

workerman创建wss服务相关推荐

  1. linux服务器创建wss服务 https+wss配置指南

    创建wss服务 问: Workerman如何创建一个wss服务,使得客户端可以用过wss协来连接通讯,比如在微信小程序中连接服务端. 答: wss协议实际是websocket+SSL,就是在webso ...

  2. workerman GatewayWorker配置wss服务

    GatewayWorker配置开启wss服务 代码 start_gataway.php <?php /*** This file is part of workerman.** Licensed ...

  3. php udp发送和接收_63、php利用原生socket创建udp服务

    1.案例函数汇总 2.案例 通过socket创建udp服务,获取对端的ip和port信息.并进行打印 2.1.udp服务源码 /** * Copyright(C) Iamasb * @project ...

  4. wss协议 c 服务器,利用LIBWEBSOCKETS写WS、WSS服务端和客户端

    libwebsockets是一款轻量级用来开发服务器和客户端的C库.按照官方(https://libwebsockets.org/)给出的介绍来看,它不仅支持ws,wss还同时支持http与https ...

  5. php websocket udp,swoole创建websocket服务并且支持https服务,同时监听tcp,udp端口

    namespace serve\websocket; // use serve\websocket\task\Message as taskMessage; use serve\websocket\c ...

  6. nodejs模拟wss服务提示The subprotocol ‘[object Object]‘ is invalid.的问题分析

    参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket/WebSocket 问题结论 先给问题结论,这是由于创建websocke ...

  7. 用.NET创建Windows服务

    用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...

  8. 用C#创建Windows服务(Windows Services)

    转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...

  9. 创建ssh 服务的镜像

    $ sudo docker run -ti ubuntu:14.04 /bin/bash #首先,使用我们最熟悉的 「-ti」参数来创建一个容器. root@fc1936ea8ceb:/# sshd ...

最新文章

  1. 【delphi】Byte数组与String类型的转换
  2. 一行命令实现录屏,支持热键和鼠标操作,区域、帧率、格式任你选择
  3. vb获得mysql的值,VB.NET调用MySQL存储过程并获得返回值的方法
  4. phython在file同时写入两个_喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
  5. C语言笔记系列文章 索引目录表(持续更新中......)
  6. QT MSVC 中文报错
  7. boost::hana::second用法的测试程序
  8. 大道至简,大数据的小窍门
  9. dubbo接口统一异常处理的两种方式
  10. 为什么要网页模块化?
  11. 【FPGA+BP神经网络】基于FPGA的简易BP神经网络verilog设计
  12. vue中views新建文件夹的代码规范
  13. Hdu--3966(树链剖分,线段树 or 树状数组)
  14. 主流注意力机制介绍以及如何添加到YOLOV5
  15. 简单易懂的计算机网络相关名词的解释--集线器篇(持续更新)
  16. postman团队人数限制_您的团队需要最低在制品限制吗?
  17. python中的函数 - function
  18. 基于kintex UltraScale XCKU040的双路QSFP+光纤PCIe卡383 光纤PCIe卡
  19. vue中使用openlayers离线地图添加标点(二)
  20. Python 爬取陈都灵百度图片

热门文章

  1. 转:感想东莞,想想东莞为外来工做了什么?
  2. CSS RGB颜色设置
  3. 学习笔记——深蓝学院点云系列公开课05:3D物体检测的发展与未来
  4. 通过贝叶斯非参数模型探索在物流风险评估中的大数据
  5. 2022-2028全球卧式滚齿机行业调研及趋势分析报告
  6. 【割点 dfs】UVALive - 7456 Least Crucial Node
  7. Python 手机端自动推送功能(利用极光推送API)
  8. 地图制图领域使用计算机优点在于哪些方面,电子地图制图的运用与发展
  9. 现在还有人看武侠小说吗?
  10. Wifi源码学习(Android5.1)之wifi开关