2012-04-25 75 views
0

我的socket.io聊天可以通過網址http://example.com:8080/訪問。 Dreamhost不允許我們綁定80,所以我綁定它在8080.在Dreamhost上的Socket.io聊天:隱藏URL

我想擺脫URL中的端口號。所以,我使用了Dreamhost的代理服務器功能(http://wiki.dreamhost.com/Proxy_Server),這是Apache的mod_proxy。

我將端口號8080代理到URL http://example.com/socketchat。當我轉到該網址時,聊天不起作用。我得到這個錯誤:

「代理錯誤 代理服務器收到來自上游服務器的響應無效 代理服務器無法處理請求GET /插座/ 原因:錯誤從遠程服務器上讀取」

有沒有辦法擺脫與socket.io一起工作的URL中的端口號?如果沒有任何作用,當我向公衆發佈我的網站時,如果我在URL中留下端口號,會不會有安全風險?謝謝。

回答

0

Apache是​​否迅速成爲瓶頸取決於您如何正確使用它。這是一個非常成熟的網絡服務器,並在世界各地託管大量網站。無論如何,您的socket.io應用程序不一定必須與您的Web應用程序共享相同的端口。你可以使用socket.io監聽端口8081,並且在8080端口上有正常的http請求。然後你可以設置你的代理指向8080,就像你現在使用的那樣,然後讓你的socket.io連接轉到8081.

這種情況下的端口不應該是一個問題,因爲它不是用戶在URL中看到的東西,並且socket.io通信不必通過代理。如果你提供足夠的Apache請求來合法地成爲一個瓶頸,那麼無論如何你都應該能夠獲得更好的託管環境!

服務器

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(8081) 
    , fs = require('fs') 

app.listen(8080); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

注意,網絡服務器爲比socket.io連接一個單獨的端口上偵聽。這意味着您可以安全地使用mod_proxy將普通http請求從80到8080進行代理,並且socket.io可以直接在端口8081上直接進行通信,繞過代理。您的用戶無需輸入端口即可訪問該網站。

客戶

<script src="http://domain.com:8081/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://domain.com:8081'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 
+0

對不起,我對服務器端的東西和node.js/socket.io很陌生,在學習示例/演示時仍然在學習繩索,現在我可以訪問example.com :8080在我的瀏覽器中,我怎樣才能做到這一點,所以我可以去example.com/chat進行聊天?無需綁定端口80(因爲Dreamhost不允許),我嘗試使用mod_proxy(提供由Dreamhost)但這不起作用。是否有另一個代理工程與我可以使用的websockets?太感謝了。 – Legendre 2012-04-26 08:03:52

+0

你的服務器設置如何?你如何提供網絡文件?我建議讓節點應用程序創建一個監聽端口8080的http服務器,並使用mod_proxy將其映射到80。然後你有socket.io應用程序監聽8081,並且你只需要將你的javascript指向那個服務。我已經更新了我的答案,以包含我的意思。 – 2012-04-26 08:18:23

+0

我認爲我還太缺乏經驗,無法充分回答您的問題。 (可能不知道我在說什麼)但是,我通讀了您的建議,示例代碼和解釋,並且我認爲我理解了一般解決方案。我將學習更多教程,然後學習你的例子。謝謝你指點我正確的方向! :) – Legendre 2012-04-26 12:01:12

0

我的猜測是mod_proxy不能很好地處理websocket,這並不令人驚訝。也就是說,你真的不應該把node.js放在Apache之後,因爲這會損害node.js的許多目的。 Apache很快就會成爲你的瓶頸。

最後,不,在另一個端口上使用socket.io沒有安全風險 - 無論您在哪個端口上運行它,都會出現安全風險。如果其他防火牆阻止與端口80以外的端口連接(這是前所未聞的),那麼您可能會遇到其他防火牆的問題 - 但是這種防火牆在任何情況下都可能會出現websocket問題。

+0

我別無選擇,因爲Dreamhost的不允許我們綁定到80 我的意思要問的是:如果我給了鏈接到我的網站,作爲「HTTP: //例。com:8080 /「,在URL中有端口號,會不會有安全問題?人們會知道我正在使用端口8080,會不會有危險? 對不起,如果我不是很清楚,我是服務器的新手 – Legendre 2012-04-26 07:47:25

+0

對不起,如果我不清楚:沒有,暴露哪個端口你運行socket.io沒有安全風險 – 2012-04-26 09:46:05

+0

噢,好吧,我很抱歉,我不能打勾兩個答案,但我真的很感激你的意見。謝謝! – Legendre 2012-04-26 12:02:27