Узел 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.
Итак, у вас есть два варианта:
- Дождитесь, пока http-прокси перезапишет свои внутренние компоненты, чтобы справиться с streams2.
- Перейдите на узел v0.8.23 и http-proxy 0.10.1. (По крайней мере, пока #1 не произойдет.)
(Вы можете установить старые версии модулей npm, запустив npm install http-proxy@0.10.1
.)