Розгортання виробничого сервера Node.js [закрито]


75

Я написав додаток Node.js, я хочу запустити його на одній з наших виробничих машин. Це здається досить поширеним запитом, але я не можу знайти адекватного рішення. Чи немає встановлених рішень для розгортання виробничих програм Node.js?

Додаток простий (<100 LOC), але повинен бути дуже ефективним, надійним і міг працювати безперервно роками без перезапуску. Він буде запускатися на великому сайті, з десятками підключень / секунду. (додаток не використовується як веб-сервер, він має лише JSON API)

Ось підходи, які я розглядав, але я все ще не впевнений у цьому:

Використання фреймворку (наприклад, Express)

Оскільки додаток повинен бути високопродуктивним і настільки простим, я хочу уникати додавання роздуття у вигляді фреймворку.

Запуск сервера з nohup

Основна проблема тут полягає в обробці винятків, ми (очевидно) не хочемо, щоб весь сервер вийшов із ладу через виняток. З того, що я розумію, обгортання всієї програми вtry {} catch {} цикл не допоможе, оскільки інтерпретатор Javascript залишається в непередбачуваному стані після виключення. Це правильно?

Використовуючи щось на зразок назавжди

Я встановив Forever на нашій машині FreeBSD, і це було дуже глючно. Це призвело до появи нескінченних процесів, які не можна було вбити назавжди. Довелося бігатиkill -9 щоб повернути свою машину, і я не надто впевнений у тому, що запускаю виробничу програму на Forever. Також здається, що Upstart (подібний інструмент, але більш загальний) не працюватиме на FreeBSD.

Розміщені рішення (наприклад, Heroku, Rackspace, Amazon EC2 тощо)

Це, мабуть, найпростіше рішення, але ми вже маємо серйозне обладнання для решти наших веб-серверів. З фінансових міркувань це не має сенсу.

Напевно, має бути якесь усталене рішення цього? Мені чогось не вистачає?


upstart - це заміна sysvinit на freebsd.
chovy

3
Для натовпу 2014 року, який читає цей SO. Foreverне слід скидати з рахунків, оскільки він провалився у цьому випадку протягом двох років та численних комітів тому. Я мав успіх у запуску цього за останні кілька місяців.
Їжте у Джоса

7
Для натовпу 2015 року, який читає цю ВО. Просто використовуйте PM2 замість Forever.
Нікола

Відповіді:


41
  • Ви дійсно повинні використовувати фреймворк (я рекомендую щось на зразок Express, оскільки він був перевірений боями), якщо ви не хочете мати справу з сесіями, файлами cookie, проміжним програмним забезпеченням тощо. Експрес справді легкий.
  • Запуск сервера з nohup: ви не повинні цього робити, просто запустіть його за допомогою звичайної команди "node". Також Express обертає маршрути у спробну лову, так що ваш сервер не буде аварійно працювати в маршруті. Однак, якщо на вашому сервері є серйозна проблема, ви не повинні боятися перезапустити його (крім того, якщо у вас є 2-3 принаймні процеси, загине лише один, тож залишиться принаймні 1-2, і користувач виграє '' не відчуваю річ).
  • Для моніторингу я особисто вважаю за краще щось більше на рівні ОС, наприклад Upstart та Monit .
  • Рішення для хостингу: оскільки у вас вже є свої серйозні апаратні речі, не потрібно вкладати гроші в щось інше. Просто використовуйте балансування навантаження (можливо, nginx або node-http-proxy) для проксі-сервера.

15

Див. Хостинг вузлових програм .

Цей підручник допоможе вам налаштувати сервер, на якому можна розміщувати програми node.js для серверних додатків JavaScript. Зараз параметри хостингу node.js зводяться до запущених процесів демона вузла, які розмовляють з веб-сервером. Більшість веб-серверів можуть проксі-з'єднання з іншим портом, тому ви зможете використовувати Apache або nginx для цього.


2
Посилання порушено.
Хорхе Гіл

6

Спробуйте використовувати pm2 - це простий та інтуїтивно зрозумілий CLI, який можна встановити через NPM. Просто запустіть свою програму з PM2, і ваша програма готова обробляти тонну трафіку

Офіційне посилання PM2

Як налаштувати додаток node js для виробництва за допомогою pm2


5

Я маю тут три запитання.

Запитання 0: "Чи слід використовувати фреймворк для мого вузлового додатка?"

Питання 1: "Як запустити сервери вузлів на виробничих машинах?"

Запитання 2: "Як я розгортаю вузлові програми у виробництві".

Щодо першого питання , мені дуже подобається кластер (хоча остання версія Node має щось подібне до того, що вбудовано, тому ви можете перевірити це). Я мав гарний успіх у чомусь на кшталт Monit / Upstart, щоб відстежувати події на рівні ОС та переконатися, що ваші сервери працюють належним чином. (Це моніторинг N кластерів серверів Ruby Thin, але те саме).

Залежно від трафіку вам може знадобитися запустити кластер на декількох машинах, а потім поставити балансир навантаження перед цим. Це залежить від вашого трафіку, скільки часу триває запит / як довго ви блокуєте цикл подій і скільки процесорів / екземплярів вузлів ви запускаєте на машині.

Фреймворк дає вам кращу обробку помилок і виявляє помилки, які виходили б із звичайних програм node.js. Якщо ви робите це без фреймворку, обов’язково прочитайте про обробку помилок у node.js.

Для Питання 2 , я не думаю, що спільнота вузлів ще має хороший стандарт розгортання. Ви можете спробувати скористатися інструментом Capistrano від Ruby (і ось запис у блозі, який розповідає про розгортання кластера з Capinstrano ).

Погана річ у Capistrano полягає в тому, що він робить деякі припущення, які можуть бути неправдивими (тобто: що ви розгортаєте проект Rails), тому ви можете в кінцевому підсумку багато боротися з фреймворком.

Моє рішення для розгортання goto загалом - це рішення Python інструмент Fabric , який надає вам інструменти розгортання та дозволяє робити те, що вам потрібно зробити.

Інший варіант розгортання - це "хмара" з такими речами, як Nodester : нехай вони подбають про це.


2

Ви можете отримати кращі відповіді на більш ServerFault, але є опис досвіду одного користувача тут з допомогою supervisord. Вам потрібно буде використовувати якийсь спостерігач за процесами, щоб підтримувати nodeпроцес у житті, і ще однією поширеною рекомендацією є, як- nodeнебудь, зробити зворотне проксі-з'єднання з процесом. Я, мабуть, проголосував би за nginx(таким чином, ви можете nginxвпоратися з реєстрацією, аутентифікацією або будь-якими іншими функціями HTTP вищого рівня, які вам потрібні, на відміну від того, щоб їх якось перекласти у вузол), але вищезазначена стаття згадує haproxyв коментарях тут і там, які може бути більш легким. Ваш вибір зворотного проксі, ймовірно, багато в чому залежатиме від того, чи потрібна вам підтримка WebSocket чи ні.

Я не впевнений, що ще існує "стандартний" робочий процес для вузла; це не настільки зріло, як щось на зразок Rails, що має безліч способів підтримувати роботу веб-додатка.


0

Хлопці з Cloudkick написали чудове рішення для цього. Це називається Cast, http://cast-project.org/ .

Встановіть трансляцію на своєму сервері та на робочій станції. Ви запускаєте агент передачі на сервері і маєте знак робочої станції за допомогою екземпляра серверів. Потім ви можете створювати "пакети", завантажувати їх на сервер, створювати / модернізувати / знищувати з них, а також запускати / зупиняти свої екземпляри. Cast автоматично перезапустить ваші служби, коли вони вийдуть з ладу. Ви також можете віддалено обробляти stdout / strerr, а також отримати список запущених екземплярів та PID # і керувати своїми екземплярами / серверами зі своєї робочої станції (SSHing не потрібен). Документи трохи застаріли, але результати варті трохи додаткової роботи. Всі взаємодії / команди здійснюються через HTTPS та RESTful API.

До цього я робив усі оновлення вручну за допомогою SCP / SSH. Ми superviseвсе тримаємо. Ми не озирнулись.


1
Це мертве, Джиме! Зараз на веб-сайті повно сміття, і Google не знаходить нічого цікавого для "node.js cast"
Сергій

Так, це відмова. Ми підтримуємо внутрішню банкоматну версію. Ретпо
Райан Олдс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.