我有一個應用程序通過socket.io使用websockets。對於我的應用程序,我想使用單獨的HTTP服務器爲我的應用程序提供靜態內容和JavaScript。因此,我需要設置一個代理。我正在使用node-http-proxy。作爲一個起點,我有我的WebSockets應用在端口8081上運行,我用下面的代碼重新定向socket.io通信這個獨立的服務器,而使用快遞服務的靜態內容:使用節點http代理代理websocket連接
var http = require('http'),
httpProxy = require('http-proxy'),
express = require('express');
// create a server
var app = express();
var proxy = httpProxy.createProxyServer({ ws: true });
// proxy HTTP GET/POST
app.get('/socket.io/*', function(req, res) {
console.log("proxying GET request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
app.post('/socket.io/*', function(req, res) {
console.log("proxying POST request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
// Proxy websockets
app.on('upgrade', function (req, socket, head) {
console.log("proxying upgrade request", req.url);
proxy.ws(req, socket, head);
});
// serve static content
app.use('/', express.static(__dirname + "/public"));
app.listen(8080);
的上面的應用程序工作得很好,但是,我可以看到,socket.io不再使用websockets,而是回退到XHR輪詢。
我可以確認,通過觀察從代理代碼日誌:
proxying GET request /socket.io/1/?t=1391781619101
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying POST request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=1391781629
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
有誰知道如何代理網絡套接字通信?來自node-http-proxy
的所有示例都假定您要代理所有流量,而不是代理某些流量併爲其他人提供服務。
我個人使用nginx作爲http服務器和代理服務器。它適用於websocket代理(這是我從apache切換的原因)。 –
@dystroy謝謝你的提示 - 儘管我希望有一個基於節點的解決方案。這樣開發人員就可以擁有反映實時部署的本地設置。 – ColinE