Использование HTTP-прокси узла для подключения websocket прокси-сервера



У меня есть приложение, которое использует websockets через socket.io для моего приложения я хотел бы использовать отдельный HTTP-сервер для обслуживания статического контента и JavaScript для моего приложения. Поэтому мне нужно поставить прокси на место.



Я используюnode-http-proxy . В качестве отправной точки у меня есть приложение 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


Кто-нибудь знает, как проксировать связь через веб-сокеты? Все примеры из node-http-proxy предполагают, что вы хотите проксировать весь трафик, а не проксировать одни и обслуживать другие.

536   2  

2 ответов:

Просто наткнулся на ваш вопрос, и я вижу, что на него до сих пор нет ответа. Ну, на тот случай, если вы все еще ищете решение... Проблема в вашем коде заключается в том, что 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

Comments

    Ничего не найдено.