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>
對不起,我對服務器端的東西和node.js/socket.io很陌生,在學習示例/演示時仍然在學習繩索,現在我可以訪問example.com :8080在我的瀏覽器中,我怎樣才能做到這一點,所以我可以去example.com/chat進行聊天?無需綁定端口80(因爲Dreamhost不允許),我嘗試使用mod_proxy(提供由Dreamhost)但這不起作用。是否有另一個代理工程與我可以使用的websockets?太感謝了。 – Legendre 2012-04-26 08:03:52
你的服務器設置如何?你如何提供網絡文件?我建議讓節點應用程序創建一個監聽端口8080的http服務器,並使用mod_proxy將其映射到80。然後你有socket.io應用程序監聽8081,並且你只需要將你的javascript指向那個服務。我已經更新了我的答案,以包含我的意思。 – 2012-04-26 08:18:23
我認爲我還太缺乏經驗,無法充分回答您的問題。 (可能不知道我在說什麼)但是,我通讀了您的建議,示例代碼和解釋,並且我認爲我理解了一般解決方案。我將學習更多教程,然後學習你的例子。謝謝你指點我正確的方向! :) – Legendre 2012-04-26 12:01:12