workerman创建wss服务
问:
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服务相关推荐
- linux服务器创建wss服务 https+wss配置指南
创建wss服务 问: Workerman如何创建一个wss服务,使得客户端可以用过wss协来连接通讯,比如在微信小程序中连接服务端. 答: wss协议实际是websocket+SSL,就是在webso ...
- workerman GatewayWorker配置wss服务
GatewayWorker配置开启wss服务 代码 start_gataway.php <?php /*** This file is part of workerman.** Licensed ...
- php udp发送和接收_63、php利用原生socket创建udp服务
1.案例函数汇总 2.案例 通过socket创建udp服务,获取对端的ip和port信息.并进行打印 2.1.udp服务源码 /** * Copyright(C) Iamasb * @project ...
- wss协议 c 服务器,利用LIBWEBSOCKETS写WS、WSS服务端和客户端
libwebsockets是一款轻量级用来开发服务器和客户端的C库.按照官方(https://libwebsockets.org/)给出的介绍来看,它不仅支持ws,wss还同时支持http与https ...
- php websocket udp,swoole创建websocket服务并且支持https服务,同时监听tcp,udp端口
namespace serve\websocket; // use serve\websocket\task\Message as taskMessage; use serve\websocket\c ...
- nodejs模拟wss服务提示The subprotocol ‘[object Object]‘ is invalid.的问题分析
参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket/WebSocket 问题结论 先给问题结论,这是由于创建websocke ...
- 用.NET创建Windows服务
用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...
- 用C#创建Windows服务(Windows Services)
转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...
- 创建ssh 服务的镜像
$ sudo docker run -ti ubuntu:14.04 /bin/bash #首先,使用我们最熟悉的 「-ti」参数来创建一个容器. root@fc1936ea8ceb:/# sshd ...
最新文章
- 【delphi】Byte数组与String类型的转换
- 一行命令实现录屏,支持热键和鼠标操作,区域、帧率、格式任你选择
- vb获得mysql的值,VB.NET调用MySQL存储过程并获得返回值的方法
- phython在file同时写入两个_喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
- C语言笔记系列文章 索引目录表(持续更新中......)
- QT MSVC 中文报错
- boost::hana::second用法的测试程序
- 大道至简,大数据的小窍门
- dubbo接口统一异常处理的两种方式
- 为什么要网页模块化?
- 【FPGA+BP神经网络】基于FPGA的简易BP神经网络verilog设计
- vue中views新建文件夹的代码规范
- Hdu--3966(树链剖分,线段树 or 树状数组)
- 主流注意力机制介绍以及如何添加到YOLOV5
- 简单易懂的计算机网络相关名词的解释--集线器篇(持续更新)
- postman团队人数限制_您的团队需要最低在制品限制吗?
- python中的函数 - function
- 基于kintex UltraScale XCKU040的双路QSFP+光纤PCIe卡383 光纤PCIe卡
- vue中使用openlayers离线地图添加标点(二)
- Python 爬取陈都灵百度图片