微信小程序 WebSocket 使用非 443 端口連接

前言

  • 微信小程序支持使用 WebSocket 連接到服務(wù)器齐蔽,準(zhǔn)確地說(shuō)是帶 SSL 的 WebSocket杠巡,而微信小程序中不允許使用帶端口的 wss 連接,只能使用 443 端口埃撵。想使用其他端口就需要在服務(wù)器做一層代理尸诽,本文以 Ubuntu 16.04 服務(wù)器為例,使用 nginx 做 Web Server 盯另。本文參考了 如何在微信小程序的websocket上使用mqtt協(xié)議 性含,在此感謝原作者。

步驟

  1. 安裝 nginx 及配置的過(guò)程不再贅述鸳惯,nginx 需要處理微信小程序 WebSocket 不支持 Sec-WebSocket-Protocol 頭的問(wèn)題商蕴,默認(rèn) nginx 不帶這個(gè)功能,需要加上補(bǔ)丁
    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
  1. 編譯完成后將系統(tǒng)的 /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
  1. nginx 配置開(kāi)啟 443 端口及證書(shū)辅鲸,可在騰訊云獲取免費(fèi)的 TrustAsia SSL 證書(shū) 格郁,/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;
  1. 用 Node.js 寫(xiě)了一個(gè)簡(jiǎn)易的 WebSocket 服務(wù)端,運(yùn)行在 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('開(kāi)始監(jiān)聽(tīng)Websocket端口:' + WS_PORT);

WebSocketServer.on('connection', function(wsConnect, req) {
  ws_clients.push(wsConnect);
  console.log('Websocket客戶端已連接:' + serial_number);
  console.log('Websocket客戶端數(shù)量:' + 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客戶端已斷開(kāi)');
    console.log('Websocket客戶端數(shù)量:' + ws_clients.length);
  });

  wsConnect.on('error', function(code, message) {
    ws_clients.splice(ws_clients.indexOf(wsConnect), 1);
    console.log('Websocket客戶端已斷開(kāi)');
    console.log('Websocket客戶端數(shù)量:' + ws_clients.length);
  });
});
  1. 在 /etc/nginx/sites-available/default 中添加一項(xiàng) location例书,將來(lái)自 443 端口 /wss 的 Websocket 連接代理至 8080 端口锣尉。即在小程序的 wx.connectSocket 的 url 中填 wss://服務(wù)器域名/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";
}
  1. 不出問(wèn)題的話决采,小程序 WebSocket 即可連接到服務(wù)器的非 443 端口自沧,而原有的 Web 服務(wù)則不受影響。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末树瞭,一起剝皮案震驚了整個(gè)濱河市拇厢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晒喷,老刑警劉巖孝偎,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凉敲,居然都是意外死亡邪媳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)荡陷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雨效,“玉大人,你說(shuō)我怎么就攤上這事废赞』展辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵唉地,是天一觀的道長(zhǎng)据悔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)耘沼,這世上最難降的妖魔是什么极颓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮群嗤,結(jié)果婚禮上菠隆,老公的妹妹穿的比我還像新娘。我一直安慰自己狂秘,他們只是感情好骇径,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著者春,像睡著了一般破衔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钱烟,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天晰筛,我揣著相機(jī)與錄音嫡丙,去河邊找鬼。 笑死读第,一個(gè)胖子當(dāng)著我的面吹牛曙博,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卦方,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼羊瘩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泰佳!你這毒婦竟也來(lái)了盼砍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逝她,失蹤者是張志新(化名)和其女友劉穎浇坐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黔宛,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近刘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臀晃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉渴。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徽惋,靈堂內(nèi)的尸體忽然破棺而出案淋,到底是詐尸還是另有隱情,我是刑警寧澤险绘,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布踢京,位于F島的核電站,受9級(jí)特大地震影響宦棺,放射性物質(zhì)發(fā)生泄漏瓣距。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一代咸、第九天 我趴在偏房一處隱蔽的房頂上張望蹈丸。 院中可真熱鬧,春花似錦呐芥、人聲如沸白华。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧腥。三九已至,卻和暖如春潮太,著一層夾襖步出監(jiān)牢的瞬間管搪,已是汗流浹背虾攻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留更鲁,地道東北人霎箍。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像澡为,于是被迫代替她去往敵國(guó)和親漂坏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容