Узел http прокси с прокси-таблицей и веб-сокетами

Я пытаюсь заставить веб-сокеты также работать с node-http-proxy, Разница в том, что я использую прокси-таблицу:

var options = {
router: {
    'a.websterten.com': '127.0.0.1:150',
    'b.websterten.com' : '127.0.0.1:151',
}
};

var server = httpProxy.createServer(options);

Я старался:

server.on('upgrade', function (req, socket, head) {
    server.proxy.proxyWebSocketRequest(req, socket, head);
});

Но это не похоже на работу. Быстрая проверка, чтобы увидеть, работает ли websockets, показывает, что я получаю Unexpected response code: 400 из Chrome (работает нормально, если я иду прямо)

Также делаю пару проверок server.on('upgrade',.. не срабатывает при запросе веб-сокета

Как я могу заставить мой прокси-сервер правильно маршрутизировать веб-сокеты?

Я также попробовал это на узле 0.8.23, а также на узле 0.10.x (более поздние версии узла имеют проблему утечки памяти, но она также не будет работать на 0.8.23)

1 ответ

Когда вы используете httpProxy.createServer()нет необходимости обращаться с upgrade событие, потому что http-прокси обрабатывает его автоматически. Таким образом, ваш server.on('upgrade', ...) никогда не срабатывает, потому что http-proxy уже обрабатывает его внутренне.

Единственный раз, когда вам нужно сделать server.on('upgrade') когда вы передаете функции промежуточного программного обеспечения httpProxy.createServer или если вы вручную создали сервер с http.createServer(),

Другими словами, веб-сокеты должны "просто работать" через прокси в вашей конфигурации.


Однако поддержка WebSocket в http-proxy в настоящее время не работает на узле v0.10.x из-за streams2 (API потоков в ядре узла были полностью переписаны в 0.10). Кроме того, последняя версия http-proxy (0.10.2) не работает в узле v0.8 из-за неудачного исправления проблемы streams2.

Итак, у вас есть два варианта:

  1. Дождитесь, пока http-прокси перезапишет свои внутренние компоненты, чтобы справиться с streams2.
  2. Перейдите на узел v0.8.23 и http-proxy 0.10.1. (По крайней мере, пока #1 не произойдет.)

(Вы можете установить старые версии модулей npm, запустив npm install http-proxy@0.10.1.)

Другие вопросы по тегам