2014-02-07 4 views
10

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

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

+1

Лично я использую nginx как http-сервер, так и прокси. Он отлично работает для проксирования через websocket (вот почему я переключился с apache). –

+1

@dystroy спасибо за подсказку - хотя я надеялся на решение на основе узлов. Это значит, что разработчики могут иметь локальную настройку, которая отражает текущее развертывание. – ColinE

ответ

15

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

Надеюсь, что помогает.

+1

это отлично работает! Я создал сущность для настройки синхронизации браузера и выражения: https://gist.github.com/timaschew/00ba49d3a39bc3dfbe8f – timaschew

1

Вам нужны оба сервера? Если вы не можете использовать один и тот же сервер для статических файлов и для прослушивания соединений патрубков:

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

Да, я знаю, что могу использовать один сервер, но все дело в том, что потоковое соединение будет производиться с другого сервера! Спасибо за ваш вклад :-) – ColinE