Как развернуть Node.js в облаке для высокой доступности с использованием многоядерных, обратных прокси и SSL - программирование
Подтвердить что ты не робот

Как развернуть Node.js в облаке для высокой доступности с использованием многоядерных, обратных прокси и SSL

Я разместил это на ServerFault, но сообщество Node.js кажется крошечным, поэтому я надеюсь, что это принесет больше внимания.

У меня есть приложение Node.js(0.4.9), и я изучаю, как его лучше всего развертывать и поддерживать. Я хочу запустить его в облаке (EC2 или RackSpace) с высокой доступностью. Приложение должно работать на HTTPS. Я буду беспокоиться о переходе на Восток/Запад/ЕС позже.

Я много читал о keep-alive (Upstart, Forever), многоядерных утилит (Fugue, multi- node, Cluster) и балансировщиках прокси/нагрузки (node -http-proxy, nginx, Varnish и Pound). Тем не менее, я не уверен, как объединить различные утилиты, доступные мне.

У меня есть эта настройка и вам нужно убрать некоторые вопросы и получить обратную связь.

  • Cluster - наиболее активно разработанная и, по-видимому, популярная многоядерная утилита для Node.js, поэтому используйте ее для запуска 1 node "кластера" на сервер приложений на непривилегированном порту (скажем, 3000). Q1: Следует ли использовать Forever, чтобы сохранить кластер в живых или просто лишний?
  • Используйте 1 nginx для каждого сервера приложений, работающего на порту 80, просто перейдите на node на порт 3000. Q2:. node -http -proxy будет более подходящим для этой задачи, даже если он не быстро загружает статические файлы gzip или сервера?
  • Минимальные 2x серверы, как описано выше, с независимым сервером, выступающим в качестве балансировщика нагрузки в этих коробках. Используйте Pound, прослушивая 443, чтобы завершить HTTPS и передать HTTP в Larnish, который будет циклически распределять баланс нагрузки по IP-адресам серверов выше. Q3: Следует ли использовать nginx для обоих? Q4: Если вместо этого следует учитывать балансировку нагрузки AWS или RackSpace (последняя не завершает HTTPS)

Общие вопросы:

  • Вы видите необходимость (2) выше?
  • Где лучше всего прекратить HTTPS?
  • Если в будущем нужны WebSockets, какие подстановки nginx вы бы сделали?

Мне бы очень хотелось услышать, как люди настраивают текущую производственную среду и какую комбинацию инструментов они предпочитают. Очень ценится.

4b9b3361

Ответ 1

Прошло несколько месяцев с тех пор, как я задал этот вопрос и не очень много ответов. И у Samyak Bhuta, и у nponeccop были хорошие предложения, но я хотел обсудить ответы, которые я нашел на свои вопросы.

Вот что я решил на данный момент для производственной системы, но дальнейшие улучшения всегда делаются. Я надеюсь, что это поможет кому-либо в подобном сценарии.

  • Используйте Cluster для создания множества дочерних процессов, которые вы хотите обрабатывать входящими запросами на многоядерных виртуальных или физических машинах. Это связывается с одним портом и упрощает обслуживание. Мое правило - n - 1 Работники кластера. Вам не нужно Forever на этом, так как Cluster возрождает рабочие процессы, которые умирают. Чтобы иметь отказоустойчивость даже на родительском уровне кластера, убедитесь, что вы используете Upstart script (или эквивалент) для демонстрации приложения Node.js и используйте Monit (или эквивалент) для просмотра PID родителя кластера и респауна если он умрет. Вы можете попробовать использовать функцию респауна Upstart, но я предпочитаю, чтобы Monit наблюдал за вещами, поэтому вместо того, чтобы разделить обязанности, я считаю, что лучше всего позволить Monit обрабатывать респаун.

  • Используйте 1 nginx для каждого сервера приложений, работающего на порту 80, просто перейдите к вашему кластеру на любом порту, к которому вы привязались (1). node -http-proxy можно использовать, но nginx более зрелый, более функциональный и более быстрый при обслуживании статических файлов. Запустите nginx lean (не записывайте, не загружайте крошечные файлы), чтобы свести к минимуму накладные расходы.

  • Как минимум, как минимум, 2-х серверов, как описано выше, и если в AWS используется ELB, который завершает HTTPS/SSL на порту 443 и связывается с HTTP-портом 80 с Node.js серверов приложений. ELB просты и, если хотите, облегчают автомасштабирование. Вы можете запускать несколько nginx либо для совместного использования IP-адресов, либо с помощью циклического масштабирования, настроенных вашим DNS-провайдером, но сейчас я нашел этот избыток. В этот момент вы удалите экземпляр nginx на каждом сервере приложений.

Мне не нужны WebSockets, поэтому nginx по-прежнему подходит, и я снова рассмотрю эту проблему, когда на изображение появятся WebSockets.

Обратная связь приветствуется.

Ответ 2

Вы не должны беспокоиться о том, чтобы быстро обслуживать статические файлы. Если ваш груз мал - node статические файловые серверы будут делать. Если ваш груз большой - лучше использовать CDN (Akamai, Limelight, CoralCDN).

Вместо вечности вы можете использовать monit.

Вместо nginx вы можете использовать HAProxy. Известно, что он хорошо работает с websockets. Рассмотрим также прокси-флэш-сокеты, так как они являются хорошим обходным решением до тех пор, пока поддержка websocket не будет повсеместной (см. Socket.io).

HAProxy поддерживает некоторую поддержку балансировки нагрузки HTTPS, но не прерывания. Вы можете попытаться использовать stunnel для завершения HTTPS, но я думаю, что это слишком медленно.

Балансировка на круговой нагрузке (или другая статистическая) работает на практике довольно хорошо, поэтому в большинстве случаев нет необходимости знать о загрузке других серверов.

Рассмотрим также использование ZeroMQ или RabbitMQ для связи между узлами.

Ответ 3

Это отличная тема! Спасибо всем, кто предоставил полезную информацию.

Я занимался теми же проблемами, что и последние несколько месяцев, создавая инфраструктуру для нашего запуска.

Как упоминалось ранее, нам нужна среда Node с поддержкой нескольких ячеек + веб-сокеты + vhosts

В итоге мы создали гибрид между собственным кластерным модулем и http-proxy и назвали его Drone - конечно, он раскрыл исходный код:

https://github.com/makesites/drone

Мы также выпустили его как AMI с Monit и Nginx

https://aws.amazon.com/amis/drone-server

Я нашел эту тему, исследуя, как добавить поддержку SSL Drone - tnx для рекомендации ELB, но я бы не стал полагаться на проприетарное решение для чего-то столь важного.

Вместо этого я расширил прокси-сервер по умолчанию для обработки всех запросов SSL. Конфигурация минимальна, в то время как запросы SSL преобразуются в простой http - но я предполагаю, что предпочтительнее, когда вы передаете трафик между портами...

Не стесняйтесь заглядывать в него и дайте мне знать, соответствует ли оно вашим потребностям. Приветствуется вся обратная связь.

Ответ 4

Я видел балансировщик нагрузки AWS для загрузки баланса и завершения + http- node -proxy для обратного прокси-сервера, если вы хотите запускать несколько сервисов за поле + cluster.js для поддержки муликора и перехода на уровень процесса, выполняющего очень хорошо.

forever.js на cluster.js может быть хорошим вариантом для крайней осторожности, которую вы хотите принять с точки зрения отказа, но это вряд ли нужно.