微信小程序 WebSocket 使用非 443 端口连接
前言
微信小程序支持使用 WebSocket 连接到服务器,准确地说是带 SSL 的 WebSocket,而微信小程序中不允许使用带端口的 wss 连接,只能使用 443 端口。想使用其他端口就需要在服务器做一层代理,本文以 Ubuntu 16.04 服务器为例,使用 nginx 做 Web Server 。本文参考了 如何在微信小程序的websocket上使用mqtt协议 ,在此感谢原作者。
步骤
安装 nginx 及配置的过程不再赘述,nginx 需要处理微信小程序 WebSocket 不支持 Sec-WebSocket-Protocol 头的问题,默认 nginx 不带这个功能,需要加上补丁 headers-more-nginx-module 后重新编译。Ubuntu 16.04 的 nginx 版本为 1.10.3 。
wget https://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
git clone https://github.com/openresty/headers-more-nginx-module.git
cp -r headers-more-nginx-module nginx-1.10.3
cd nginx-1.10.3
./configure --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --add-module=./headers-more-nginx-module
make
编译完成后将系统的 /usr/sbin/nginx 替换为 objs 目录中的 nginx 。
sudo service nginx stop
sudo cp /usr/sbin/nginx /usr/sbin/nginx.bak
sudo cp ./objs/nginx /usr/sbin
sudo service nginx start
nginx 配置开启 443 端口及证书,可在腾讯云获取免费的 TrustAsia SSL 证书 ,/etc/nginx/sites-available/default 部分配置如下
listen 80 default_server;
#listen [::]:80 default_server;
# SSL configuration
#
listen 443 ssl;
# listen [::]:443 ssl default_server;
ssl_certificate /etc/nginx/ssl/xxxxxxxx.crt;
ssl_certificate_key /etc/nginx/ssl/xxxxxxxx.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_protocols TLSV1.1 TLSV1.2 SSLv2 SSLv3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
用 Node.js 写了一个简易的 WebSocket 服务端,运行在 8080 端口。
var WebSocket = require('ws');
var WS_PORT = 8080;
var ws_clients = [];
var WebSocketServer = new WebSocket.Server({ host: '127.0.0.1', port: WS_PORT });
console.log('开始监听Websocket端口:' + WS_PORT);
WebSocketServer.on('connection', function(wsConnect, req) {
ws_clients.push(wsConnect);
console.log('Websocket客户端已连接:' + serial_number);
console.log('Websocket客户端数量:' + ws_clients.length);
wsConnect.on('message', function (message) {
console.log('接收到消息:');
console.log(message);
});
wsConnect.on('close', function(code, message) {
ws_clients.splice(ws_clients.indexOf(wsConnect), 1);
console.log('Websocket客户端已断开');
console.log('Websocket客户端数量:' + ws_clients.length);
});
wsConnect.on('error', function(code, message) {
ws_clients.splice(ws_clients.indexOf(wsConnect), 1);
console.log('Websocket客户端已断开');
console.log('Websocket客户端数量:' + ws_clients.length);
});
});
在 /etc/nginx/sites-available/default 中添加一项 location,将来自 443 端口 /wss 的 Websocket 连接代理至 8080 端口。即在小程序的 wx.connectSocket 的 url 中填 wss://服务器域名/wss 。
location /wss {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_read_timeout 86400;
proxy_set_header Host xxx.xxx.xxx;
proxy_set_header Sec-WebSocket-Protocol wss;
more_clear_headers Sec-WebSocket-Protocol;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
不出问题的话,小程序 WebSocket 即可连接到服务器的非 443 端口,而原有的 Web 服务则不受影响。
微信小程序 WebSocket 使用非 443 端口连接的更多相关文章
- 微信小程序websocket
微信小程序websocket 微信小程序带有websocket可以提供使用,但是官方文档写的东西很少,而且小程序后台能力弱这一点也是十分的坑爹,这就导致了socket长连接一切后台就会出现断开的情况, ...
- 微信小程序-WebSocket
wx.connectSocket(OBJECT) 创建一个 WebSocket 连接:一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该 ...
- 微信小程序-WebSocket应用
为何有 HTTP 协议还需要 WebSocket ? Http协议 有个缺陷:通信只能由客户端发起.举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果.HTTP 协议做不 ...
- 快速上手微信小程序webSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSocket API也被W3 ...
- 微信小程序WebSocket报错:Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was ...
- 微信小程序开发学习资料
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 微信小程序踩坑集合
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...
- 微信小程序(应用号)资源汇总整理
微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...
- 微信小程序(应用号)开发资源汇总整理 - 一直更新中
开源项目 wechat-weapp-gank - 微信小程序版Gank客户端 wechat-dribbble - 微信小程序-Dribbble wechatApp-demo - 微信小程序 DEMO ...
随机推荐
- Struts1使用技巧
转自:https://blog.csdn.net/chjttony/article/details/6099101 1.Struts1是Apache推出的java web开发领域一个比较早,同时也是使 ...
- python操作excel的读写
1.下载xlrd和xlwt pip install xlwd pip install xlrd pip install xlutils 2.读写操作(已存在的excel) #-*- coding:ut ...
- actionbar中添加searchview并监听期伸缩/打开的方法
首先在xml中设置actionviewclass <item android:id="@+id/m1" android:title="setting" a ...
- 【总结整理】WebGIS基础
1.万维网:www是world wide web的简称是在超文本基础上形成的信息网 2.互联网:即广域局域网及单机按照一定的通讯协议组成的国际计算机网络 3.WebGIS:网络地理信息系统,指基于In ...
- jquery获取元素在文档中的位置信息以及滚动条位置(转)
jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886 原文链接 原创 201 ...
- C++面向对象类的实例题目四
题目描述: 以面向对象的概念设计一个类,此类包含3个私有数据:unlead.lead(无铅汽油和有铅汽油)以及total(当天总收入,无铅汽油的价格是17元/升,有铅汽油的加个是16元/升),请以构造 ...
- 关于c#里的集合的,结构体,枚举的定义,解释与应用
那么先写一下 集合 . 集合和数组很相似,数组里的类型是必须同一类型,固定长度.然而集合里的可以是不同类型,不固定长度的.所以集合运用的灵活度要更高一些. 要使用集合,必须先引用命名空间:using ...
- 项目一:第八天 1、前台系统导入 实现客户注册 发验证码,邮件 springdata-redis存储数据 3、实现客户登陆
1 前台系统客户注册功能 页面:signup.html 1.1 验证手机号是否注册(邮箱同样) 1. 使用Jquery-validate插件进行相关校验,使用校验规则 <input type=& ...
- CH 4302 Interval GCD
辗转相减法的扩展 $gcd(x, y, z) = gcd(x, y - x, z - y)$ 当有n个数时也成立 所以构造$a_{i}$的差分数组$b_{i} = a_{i} - a_{i - 1}$ ...
- 监控linux系统的简易脚本
我先把脚本粘贴在这吧,方便大家观看,其中也是借鉴了不少其他大神的东西,这个脚本主要是用来监控服务器.用户.日志,还得创建备份,等等等等.最近学的shell比较多,就用这个来练练手了,比较简单,大家凑合 ...