У меня есть приложение, которое использует websockets через socket.io. Для моего приложения я хотел бы использовать отдельный HTTP-сервер для обслуживания статического контента и JavaScript для моего приложения. Поэтому мне нужно установить прокси-сервер.
Я использую node-http-proxy. В качестве отправной точки у меня есть приложение для веб-приложений, работающее на порту 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
предполагают, что вы хотите проксировать весь трафик, а не проксировать некоторых и обслуживать других.