Node.js 使用节点http代理代理websocket连接

Node.js 使用节点http代理代理websocket连接,node.js,websocket,socket.io,node-http-proxy,Node.js,Websocket,Socket.io,Node Http Proxy,我有一个通过socket.io使用WebSocket的应用程序。对于我的应用程序,我希望使用一个单独的HTTP服务器来为我的应用程序提供静态内容和JavaScript。因此,我需要设置一个代理 我正在使用。作为起点,我让我的websockets应用程序在端口8081上运行。我使用以下代码将socket.io通信重新定向到此独立服务器,同时使用express提供静态内容: var http = require('http'), httpProxy = require('http-proxy

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

我正在使用。作为起点,我让我的websockets应用程序在端口8081上运行。我使用以下代码将socket.io通信重新定向到此独立服务器,同时使用express提供静态内容:

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

有人知道如何代理web套接字通信吗?
node http proxy
中的所有示例都假定您希望代理所有流量,而不是代理某些流量并为其他流量提供服务。

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

// 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

我无意中发现了你的问题,我发现它仍然没有得到回答。好吧,如果你还在寻找解决方案。。。 代码中的问题是,
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);

希望这会有所帮助。

我个人使用nginx作为http服务器和代理。它对于websocket代理非常有效(这就是我从apache切换过来的原因)。@dystroy感谢您的提示-尽管我希望有一个基于节点的解决方案。这是为了让开发人员可以有一个反映实时部署的本地设置。是的,我知道我可以使用一台服务器,但关键是在生产中,流式连接将来自不同的服务器!感谢您的输入:-)这工作非常好!我已经为浏览器同步和快速设置创建了一个要点: