Apache Node.js Socket.io

由于系統(tǒng)是WAMP窒盐,由外包過渡過來(lái)的。在Apache設(shè)置反向代理比較不友善钢拧;且自chrome4.7以后蟹漓,大部分socket請(qǐng)求必須基于SSL協(xié)議傳輸。


前提:給項(xiàng)目加個(gè)長(zhǎng)連接源内,做個(gè)進(jìn)度條葡粒。

困境:請(qǐng)求協(xié)議為HTTP, 如果加入SSL協(xié)議,這不僅增加一筆費(fèi)用膜钓;對(duì)舊項(xiàng)目并不友好嗽交,php項(xiàng)目全是基于http的,而已Apache設(shè)置SSL估計(jì)又是折磨人颂斜。

解決:使用Apache設(shè)置反向代理夫壁,解決瀏覽器無(wú)法連接websocket的問題;使用localhost之前請(qǐng)求來(lái)解決安全性問題沃疮。


本文內(nèi)容

  • 項(xiàng)目環(huán)境技術(shù)棧
  • 后端Socket服務(wù)設(shè)計(jì)
  • 試錯(cuò)過程
  • 提交方案
  • 運(yùn)行項(xiàng)目
  • 參考網(wǎng)站

1.項(xiàng)目環(huán)境技術(shù)棧

  • 構(gòu)架時(shí)盒让,后端代理前端壓縮包文件。
  • 長(zhǎng)連接使用socket.io忿磅。

2.后端Socket服務(wù)設(shè)計(jì)

后端對(duì)外不開放糯彬,不需要使用反向代理。內(nèi)容如下所示(不全):

const express = require('express');
const http = require('http');
const socketio = require('socket.io');

const app = express();
const server = http.Server(app);
const io = socketio(server);
//加載前端頁(yè)面
app.use(express.static(path.join(__dirname, 'build')));

io.on('connection', (sock) => {
  console.log('Client connected');

  sock.on('heartbeat', (payload) => {
    payload.nodeName = name;
    sock.emit('heartbeat', payload);
  });

  sock.on('disconnect', () => {
    console.log('Socket Disconnected');
  });
});

server.listen(+port, '0.0.0.0', (err) => {
  console.log(`Node [${name}] listens on http://127.0.0.1:${port}.`);
});

3.試錯(cuò)過程

由于之前沒做過撩扒,好尷尬了《中看了幾個(gè)小時(shí)socket.io文檔直接使用了搓谆,所以踩的坑會(huì)比較多。

  • 由于chrome4.7后豪墅,對(duì)安全策略進(jìn)行變化 泉手。先了解瀏覽器對(duì)websocket的長(zhǎng)連接的策略。

node代理
使用node http-proxy-middleware代理socket過程偶器,在本地(都是基本localhost)完美運(yùn)行斩萌。然后上傳運(yùn)行代理,并開放外網(wǎng)端口屏轰,運(yùn)行結(jié)果如下所示:

[HPM] Proxy created: /  ->  http://localhost:8787
[HPM] Subscribed to http-proxy events:  [ 'error', 'close' ]
[HPM] Proxy created: /  ->  http://localhost:8787
[HPM] Subscribed to http-proxy events:  [ 'error', 'close' ]
  • 顯示代理成功颊郎,在服務(wù)器測(cè)試socket連接正常。但使用外網(wǎng)訪問時(shí)霎苗,如下的錯(cuò)誤
Uncaught (in promise) DOMException: Only secure origins are allowed. http://goo.gl/lq4gCo
  • 分析過程:
  1. 在服務(wù)器端測(cè)試時(shí),可以通過是因?yàn)椋核鼈冎g是localhost請(qǐng)求姆吭,能過瀏覽器安全策略。
  2. 服務(wù)器外網(wǎng)地址跟localhost在服務(wù)器在有網(wǎng)卡代理唁盏,localhost與外網(wǎng)交互内狸,沒安全策略的检眯,它也相當(dāng)于一個(gè)本地請(qǐng)求。
  3. 當(dāng)在外網(wǎng)訪問網(wǎng)頁(yè)端時(shí)昆淡,網(wǎng)頁(yè)在"/"鏈接中锰瘸,地址是外網(wǎng)地址。外網(wǎng)與localhost將無(wú)法通過瀏覽器安全策略瘪撇。

使用Apache代理過程

  • 先實(shí)現(xiàn)一個(gè)小目標(biāo)获茬,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Http反向代理。
#不給別人get到你的代理
ProxyRequests off 
    <Location />
        ProxyPass http://127.0.0.1:30003/
        ProxyPassReverse /
    </Location>

  • 那么接下去代理佩谣,想下Apache代理比較全的帖子,我擦实蓬,完全沒有提到Socket茸俭,就加入個(gè)mod_proxy_connect,說(shuō)不定以后能使用SSL呢。
  • 那只有去官網(wǎng)找安皱,意淫術(shù)调鬓,socket的請(qǐng)求協(xié)議為WS,去httpd.conf搜下(找下)proxy-ws*酌伊,果然找到mod_proxy_wstunnel,就是這貨了腾窝。
  • 接下去的看,只能在2.4.5以上版本使用居砖。呸城豁,然后查下2.4.3才發(fā)行揩慕。直接用別管它署浩。
    Compatibility: |Available in httpd 2.4.5 and later
  • 在httpd.conf文件中未巫,加載這模塊
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

WAMP

  • 有時(shí),沒什么毛病蔗草,它就是不給你運(yùn)行咒彤。這個(gè)迷之原因,炸了沒咒精。別扯什么底層代理實(shí)現(xiàn)過程蔼紧。
  • 使用顏色分析過程,一般是:紅色->橙色->綠色狠轻。不行的話,紅色那狀態(tài)會(huì)比較快彬犯,然后停到橙色向楼。
  • 使用重復(fù)啟動(dòng)法查吊,重復(fù)重啟。當(dāng)紅色停留比較久時(shí)湖蜕,那就可能成功了逻卖。

4.提交方案

下面將使用Apache反向代理,使網(wǎng)頁(yè)端與API接口變成localhost間的請(qǐng)求昭抒,原理圖如下所示评也,網(wǎng)頁(yè)端服務(wù)跟API服務(wù)將在內(nèi)部服務(wù)器中:


1. 將網(wǎng)頁(yè)端服務(wù)使用反向代理出來(lái)

//httpd.conf
Listen 30003
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_http_module modules/mod_proxy_http.so

//httpd-vhosts.conf

<VirtualHost *:30003>
    RewriteEngine On
    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteRule /(.*) ws://127.0.0.1:3030/$1 [P,L]

    ProxyRequests off
    <Location />
        ProxyPass http://127.0.0.1:3030/
        ProxyPassReverse /
    </Location>
</VirtualHost>

2.前后端分離,前端使用socket.io-client,代碼如下所示:

import openSocket from 'socket.io-client';
const socket = openSocket(); //不用設(shè)置任意參數(shù)

 socket.on('heartbeat', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });

5.運(yùn)行項(xiàng)目

  • 訪問服務(wù)器端口30003地址灭返,其實(shí)是反向訪問localhost:3000盗迟。localhost地址之間socket長(zhǎng)連接無(wú)fuck。
  • 不安全是Http協(xié)議的長(zhǎng)連接熙含。



6.參考網(wǎng)站

如果socket請(qǐng)求跨源怎静,一定要有SSL設(shè)置邮弹?,不太清楚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚓聘,一起剝皮案震驚了整個(gè)濱河市腌乡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夜牡,老刑警劉巖与纽,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氯材,居然都是意外死亡渣锦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門氢哮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袋毙,“玉大人,你說(shuō)我怎么就攤上這事冗尤√牵” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵裂七,是天一觀的道長(zhǎng)皆看。 經(jīng)常有香客問我,道長(zhǎng)背零,這世上最難降的妖魔是什么腰吟? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上毛雇,老公的妹妹穿的比我還像新娘嫉称。我一直安慰自己,他們只是感情好灵疮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布织阅。 她就那樣靜靜地躺著,像睡著了一般震捣。 火紅的嫁衣襯著肌膚如雪荔棉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天蒿赢,我揣著相機(jī)與錄音润樱,去河邊找鬼。 笑死诉植,一個(gè)胖子當(dāng)著我的面吹牛祥国,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晾腔,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舌稀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了灼擂?” 一聲冷哼從身側(cè)響起壁查,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剔应,沒想到半個(gè)月后睡腿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峻贮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年席怪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤控。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挂捻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出船万,到底是詐尸還是另有隱情刻撒,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布耿导,位于F島的核電站声怔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舱呻。R本人自食惡果不足惜醋火,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胎撇,春花似錦介粘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雅采。三九已至爵憎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婚瓜,已是汗流浹背宝鼓。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巴刻,地道東北人愚铡。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胡陪,于是被迫代替她去往敵國(guó)和親沥寥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 轉(zhuǎn)自陳明乾的博客柠座,可能有一定更新邑雅。 轉(zhuǎn)原文聲明:原創(chuàng)作品,允許轉(zhuǎn)載妈经,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 淮野、...
    C86guli閱讀 1,446評(píng)論 0 5
  • php+mysql+apache+centos 編譯安裝 領(lǐng)導(dǎo)要求先保證php環(huán)境穩(wěn)定,然后再去考慮其他吹泡,例如性能...
    dnaEMx閱讀 2,199評(píng)論 1 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理骤星,服務(wù)發(fā)現(xiàn),斷路器爆哑,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 常用配置指令說(shuō)明 1. ServerRoot:服務(wù)器的基礎(chǔ)目錄洞难,一般來(lái)說(shuō)它將包含conf/和logs/子目錄,其它...
    小僧有禮了閱讀 4,501評(píng)論 0 5
  • http協(xié)議及Apache服務(wù) http協(xié)議 什么是http? http全稱為超文件傳輸協(xié)議(Hyper text...
    魏鎮(zhèn)坪閱讀 2,270評(píng)論 0 1