微信小程序 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 服务则不受影响。

原文地址:https://www.cnblogs.com/HintLee/p/9499435.html

时间: 2024-08-06 07:11:11

微信小程序 WebSocket 使用非 443 端口连接的相关文章

微信小程序websocket

微信小程序websocket 微信小程序带有websocket可以提供使用,但是官方文档写的东西很少,而且小程序后台能力弱这一点也是十分的坑爹,这就导致了socket长连接一切后台就会出现断开的情况,并且难受的是.这个时候你重新调用链接函数也会链接不上,可能直接影响到你的业务逻辑 解决方法就是手动关闭和开启链接,不要让链接在程序切后台的时候被关掉,代码如下↓ onHide监听程序进入后台的时候,手动关闭链接 onHide: function() { var that = this; consol

微信小程序-WebSocket应用

为何有 HTTP 协议还需要 WebSocket ? Http协议 有个缺陷:通信只能由客户端发起.举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果.HTTP 协议做不到服务器主动向客户端推送信息.(单向请求)注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦.我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息.最典型的场景就是聊天室.轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开).因此,工程

微信小程序webSocket生命周期

测试的环境:vivo z5  Android9.0   webSocket未实现团活 当小程序前后端之间建立webSocket后,我测试过以下4种情况. webSocket建立的小程序页面,亮屏且前后台之间无websocket交互.------  5分钟后,服务端主动断开websocket连接,小程序端触发wx.onSocketClose(),未触发wx.onSocketError(); webSocket建立的小程序页面,熄屏且前后台之间无websocket交互.------  5分钟后,服务

微信小程序监听WebSocket消息事件wx.onSocketMessage(CALLBACK)

微信小程序WebSocket消息wx.onSocketMessage(CALLBACK) wx.onSocketMessage(CALLBACK) ? 监听WebSocket接受到服务器的消息事件 CALLBACK返回参数: 参数 类型 说明 data String 服务器返回的消息 示例代码: wx.connectSocket({ url:"qkxue.net" }); wx.onSocketMessage(function(res){ console.log("收到服务器

微信小程序开发交流与推广

一.请加微信群: 请扫描下方的二维码加“微信小程序交流推广群”,由于微信群的限制,超过 100 人就不能扫码加群,大家可以先添加微信号:us9488 并备注“微信小程序”,然后拉你入群. 二.官方文档: 微信小程序介绍 微信小程序设计指南 微信小程序开发文档 微信小程序运营规范 微信小程序开发者社区 三.微信小程序解决方案: 微信小程序会话管理场景 微信小程序文件上传下载应用场景 微信小程序WebSocket长连接应用场景 微信小程序视频应用场景 四.代码: 会话管理场景 文件上传下载应用场景

微信小程序小应用资源汇总整理

微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp-gank - 微信小程序版Gank客户端 wechat-dribbble - 微信小程序-Dribbble wechatApp-demo - 微信小程序 DEMO weapp-ide-crack - 微信小应用资源破解 API - API 文档 weapp-quick - 微信小应用示例代码 wea

微信小程序(应用号)开发资源汇总整理 - 一直更新中

开源项目 wechat-weapp-gank - 微信小程序版Gank客户端 wechat-dribbble - 微信小程序-Dribbble wechatApp-demo - 微信小程序 DEMO weapp-ide-crack - 微信小应用资源破解 API - API 文档 weapp-quick - 微信小应用示例代码 weapp-gold - 掘金主页 微信小应用示例 weapp-douban - 豆瓣电影 微信小程序 wechat-app-zhihudaily - 微信小程序版的知乎

微信小程序怎么开发(小程序开发文档)

微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 2017年1月9日~2018年1月9日,小程序正式上线一周年.上线以来,小程序不断地释放新能力,迭代更新,一年来已发布近50多次新能力.小程序开启了互联网创业3.0时代,微信庞大的流量与平台能力,也在不断地赋能于小程序. 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果.这个小程序的首页将会显示欢迎语以及当前用户的微信头像,点击头像,可以在新开的页面中查看当前小程

微信小程序个人/企业开放服务类目一览表

之前写了个牙科小程序,结果服务类目没写对,审核没过,在网上搜了小程序官方的服务类目表,还有一些审核标准. 微信小程序个人开放服务类目表 服务类目 类目分类一 类目分类二 引导描述 出行与交通 代驾 / / 生活服务 家政.丽人.摄影/扩印.婚庆服务.环保回收/废物回收 / / 餐饮 点评与推荐.菜谱.餐厅排队 / / 旅游 出境WiFi.旅游攻略 / / 商业服务 会展服务.律师 / [律师]类目需上传<律师执业资格证>, 上传原件或复印件, 复印件务必加盖公司公章 文件格式为jpg.jpeg