使用节点http-proxy来代理websocket连接

我有一个应用程序通过socket.io使用websockets。 对于我的应用程序,我想使用单独的HTTP服务器为我的应用程序提供静态内容和JavaScript。 因此,我需要设置一个代理。

我正在使用node-http-proxy 。 作为一个起点,我有我的websockets应用程序运行在端口8081.我正在使用以下代码重新socket.io通信到这个独立的服务器,而使用快递服务的静态内容:

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 

有谁知道如何代理networking套接字通信? 所有来自node-http-proxy的例子都假设你想代理所有的stream量,而不是代理一些服务其他stream量。

刚碰到你的问题,我看到它还没有回答。 那么,如果你仍然在寻找解决scheme…在你的代码中的问题是, app.listen(8080)只是语法糖

 require('http').createServer(app).listen(8080) 

app本身只是一个处理函数,而不是httpServer的一个实例(我个人认为这个特性应该从Express中删除以避免混淆)。 因此,你的app.on('upgrade')实际上从来没有使用过。 你应该写

 var server = require('http').createServer(app); server.on('upgrade', function (req, socket, head) { proxy.ws(req, socket, head); }); server.listen(8080); 

希望,这有帮助。

你需要两台服务器吗? 如果没有,你可以使用相同的服务器的静态文件,并侦听套接字连接:

 // make the http server var express = require('express'), app = express(), server = require('http').createServer(app), io; // serve static content server.use('/', express.static(__dirname + '/public')); server.listen(8080); // listen for socket connections io = require('socket.io').listen(server); // socket stuff here