Назад | Перейти на главную страницу

Node.js, Nginx и Varnish с WebSockets

Я занимаюсь проектированием серверной части нового веб-приложения Node.js, которое, как мне кажется, должно быть достаточно масштабируемым, но не чрезмерным. Во всех моих предыдущих развертываниях Node.js я использовал Nginx для обслуживания статических ресурсов, таких как JS / CSS и обратный прокси-сервер для Node (как я слышал, Nginx справляется с этим намного лучше / экспресс не готов к производству) .

Однако Nginx не поддерживает WebSockets. Я впервые широко использую Socket.IO и обнаружил много статей, подробно описывающих это ограничение. Большинство из них предлагают использовать Varnish для направления трафика WebSockets непосредственно на узел, минуя Nginx. Это моя текущая установка:

Лак : Порт 80 - маршрутизация HTTP-запросов к Nginx и WebSockets напрямую к узлу
Nginx : Порт 8080 - обслуживание статических активов, таких как CSS / JS
Node.js Express: порт 3000 - обслуживание приложения через HTTP + WebSockets

Однако теперь есть дополнительная сложность, заключающаяся в том, что Varnish не поддерживает HTTPS, для чего требуется Stunnel или какое-либо другое решение, а также еще не сбалансирована нагрузка (возможно, я буду использовать HAProxy или что-то еще). Сложность накапливается! Я бы хотел, чтобы все было проще, если это возможно.

Нужно ли реверсировать прокси-сервер Node.js с помощью Nginx, когда также присутствует Varnish? Так как даже если Express медленно обслуживает статические файлы, они теоретически должны кэшироваться Varnish. Или есть лучшие способы реализовать это?

Независимо от того, какое программное обеспечение вы будете использовать, вам все равно необходимо реализовать следующие функции:

  1. серверная часть веб-сокета
  2. серверная часть приложения
  3. статический бэкэнд
  4. обратный прокси
  5. кеш содержимого
  6. http-маршрутизатор
  7. балансировщик нагрузки
  8. https фильтр

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

По другому вопросу: обычно плохо объединять обратные прокси, поэтому вам лучше настроить varnish для использования nginx только в качестве статического бэкенда или использовать для этого node.js и настроить кеширование в varnish для достижения требуемой производительности.

Нужно ли реверсировать прокси-сервер Node.js с помощью Nginx, когда также присутствует Varnish?

Varnish может кэшировать ваши статические файлы из приложения node.js. Вам необходимо предоставить правильные заголовки http (управление кешем) из вашего приложения (для VCL по умолчанию). Или вы можете настроить свой VCL для кеширования статических файлов на основе URL-адреса или, например, типа контента.

Для поддержки SSL / TLS я использую Pound with Varnish (http://www.apsis.ch/pound).

Как было отмечено в комментариях, Varnish также может быть балансировщиком нагрузки.