Як запустити додаток Node.js як власний процес?


195

Який найкращий спосіб розгорнути Node.js?

У мене VPS Dreamhost (саме так вони називають VM ), і мені вдалося встановити Node.js і налаштувати проксі. Це чудово працює, якщо я зберігаю SSH-з'єднання, яке я почав із вузла відкритим.


6
Гм, мені здається дивним, що ви називаєте Forever як "розгортання node.js". Це не просто інструмент контролю / нагляду за процесом? Зазвичай веб-розгортання означає (принаймні те, що я зустрічаю у статтях) декілька взаємопов'язаних дій, які роблять доступним веб-додаток (цей інструмент процесу є його частиною). У будь-якому випадку, це все ще чудовий пост у StackOverflow, як я дізнався з відповідей усіх.
mikong

Це просто найпростіше розгортання node.js на Dreamhost. Мета полягала у тому, щоб просто отримати надійний запуск вузла як вихідного пункту для побудови.
поважаю TheCode

Як ви працювали з переадресацією домену до вузла порту?
грм

2
@grm Я використовую HTTP-Proxy github.com/nodejitsu/node-http-proxy
поважаю TheCode

Зараз ми використовуємо Elastic Beanstalk, і він працює досить непогано.
поважаю TheCode

Відповіді:


107

Відповідь 2016 року : майже кожен дистрибутив Linux постачається із системою systemd, а це означає, що навіки, monit, PM2 тощо, більше не потрібні - ваша ОС вже справляється з цими завданнями .

Створіть myapp.serviceфайл (очевидно, замінивши "myapp" на ім'я програми):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Зверніть увагу, якщо ви новачок у Unix: /var/www/myapp/app.js має бути #!/usr/bin/env nodeв першому рядку.

Скопіюйте службовий файл у /etc/systemd/system папку.

Розкажіть systemd про нову послугу с systemctl daemon-reload .

Почніть з цього systemctl start myapp .

Увімкніть його для запуску із завантаженням systemctl enable myapp .

Перегляньте журнали з journalctl -u myapp

Це взято з розділу Як ми розгортаємо програми вузлів на Linux, 2018, видання , яке також включає команди для створення AWS / DigitalOcean / Azure CloudConfig для створення серверів Linux / вузлів (включаючи .serviceфайл).


1
Будь-яка ідея, як боротися Failed to issue method call: Unit name ... is not valid.?
Жульєн Генесту

1
@JulienGenestoux назва "одиниця" така ж, як і ваша послуга. Це здається, що там є розбіжність. Після того як ви скопіювали файл, /etc/systemd/systemможливо, вам доведеться запустити systemctl daemon-reload(systemd зазвичай скаже вам, чи потрібно це). TBH це найкраще задати як окреме питання.
mikemaccana

3
Замість того, щоб копіювати сервісний файл у /etc/systemd/system, ви можете просто використовувати systemctl enable /full/path/to/myapp.service, що створює /etc/systemd/systemдля вас символьне посилання .
Арн

1
Як вона порівнюється з pm2? Чи може він замінити pm2 чи пропонує pm2 більше необхідних функцій?
Сергій Башаров

1
@VinodSrivastav nodeвикликається /var/www/myapp/app.jsсам по собі. У Unix, якщо ви зробите файл виконуваним, а перший рядок починається з #!/some/fileфайлу, він буде інтерпретований цим двійковим файлом. Google "перекладач Unix", щоб знати більше.
mikemaccana

101

Використовуйте назавжди . Він запускає програми Node.js в окремих процесах і перезапускає їх, якщо такі вмирають.

Використання:

  • forever start example.js щоб розпочати процес.
  • forever list щоб побачити список усіх процесів, запущених назавжди
  • forever stop example.jsзупинити процес або forever stop 0зупинити процес з індексом 0 (як показано на forever list).

Це близько. Це починається просто чудово, але не дозволяти мені зупинити що-небудь. Я зміг вийти та повернутися, а потім вбити процес вузла. Назавжди його не перезапустили. Тож я щось думаю про те, як це працює, не сумісний із DH.
шануйте Кодекс

@Kevin, ви не можете вбити процес вузла, тому що Forever сам працює на вузлі! До своєї відповіді я додав декілька інструкцій із використання, включаючи, як зупинити процес. Я використовую це на моєму VPS, і це працює як шарм.
Девід Тан

forever stop 0сталася помилка, і речі просто так розпалися. Я намагався зробити це без кореня для власного користувача, щоб я міг легко очистити, як тільки знайду правильне рішення. Це може бути моєю проблемою. Я ще раз загляну в це.
шануйте Кодекс

У мене було щось не так з npm, що спричиняло проблеми. При правильному встановленні npm та вузла вічно працює чудово. Що я в кінцевому підсумку робив, це додавання команд вічно старту до набору інструментів cronjob для запуску при перезапуску. Зараз я працюю над маленьким додатком для вузлів, який дозволить мені запускати та зупиняти назавжди програми.
поважаю TheCode

Існує альтернатива Forever, який використовує API рідного кластера вузла: github.com/superjoe30/naught
andrewrk

41

Я писав про свій метод розгортання тут: Розгортання програм node.js

Коротко:

  • Використовуйте гак після отримання
  • Джейк для інструменту збирання
  • Upstart як службова обгортка для вузла
  • Монітор контролювати та перезавантажувати програми, вони знижуються
  • nginx для маршрутизації запитів до різних програм на одному сервері

2
Якщо у мене на сервері завжди буде єдиний сайт Node, чи можу я безпечно викопати Nginx?
Др

3
Здається, посилання розірвано
verybadalloc

@Dor Я знаю, що це несвоєчасна відповідь, але я не став би. Крім речей, таких як завершення та кешування SSL, зворотний проксі-сервер nginx перед хостом дозволяє отримати більшу інфраструктурну гнучкість, ніж запуск вузла безпосередньо на порт 80. Це також означає, що вам не потрібно запускати вузол як root, що, на мою думку, є досить важкий аргумент на користь налаштування nginx.
Кріс Браун

16

pm2 виконує трюки.

Особливості: моніторинг, перезавантаження гарячого коду, вбудований балансир навантаження, сценарій автоматичного запуску та процеси воскресіння / скидання.


Чи сумісна вона з такими послугами, як Heroku?
FRD

@FRD Не думаю, що це працює з heroku, переглянь цю статтю
nickleefly

9

Ви можете використовувати monit, forever, upstartабо , systemdщоб почати свій сервер.

Ви можете використовувати Varnish або HAProxy замість Nginx (відомо, що Nginx не працює з веб-розетками).

В якості швидкого і брудного рішення , яке ви можете використовувати , nohup node your_app.js &щоб запобігти додаток , що закінчуються на сервері, але forever, monitі інші пропоновані рішення краще.


2
Користувач "Сергій Яроцький" спробував відредагувати ваше повідомлення, сказавши, що Nginx зараз підтримує WebSockets (починаючи з версії 1.3). Я відхилив редагування, оскільки вважаю, що він повинен бути розміщений як коментар. (Інакше у вас буде два суперечливі пропозиції в тому самому дописі, що є заплутаним.)
Назад

7

Я створив сценарій Upstart, який зараз використовується для моїх додатків:

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

Налаштуйте всі до #########, створіть файл у /etc/init/your-service.conf і вставте його туди.

Тоді ви можете:

start your-service
stop your-service
restart your-service
status your-service

Дякую, саме те, що мені було потрібно.
Nilson Morais

6

Я написав досить вичерпний посібник з розгортання Node.js, із прикладними файлами:

Підручник: Як розгорнути програми Node.js з прикладами

Він охоплює такі речі, як http-proxy, SSL та Socket.IO .


Це виглядає чудово. Я використовую heroku для розробки та початкового запуску, але в кінцевому підсумку потрібно буде масштабувати минуле heroku та розгорнути безпосередньо на EC2. Я з цим пограю, коли матиму час.
шануйте Кодекс

5

Ось довша стаття щодо вирішення цієї проблеми з systemd: http://savanne.be/articles/deploying-node-js-with-systemd/

Деякі речі, які слід пам’ятати:

  • Хто почне моніторинг вашого процесу? Назавжди чудовий інструмент, але йому потрібен інструмент моніторингу, щоб продовжувати працювати. Це трохи нерозумно, чому б просто не використовувати свою систему init?
  • Чи можете ви адекватно контролювати свої процеси?
  • У вас працює кілька програм? Якщо так, чи є у вас положення, які не дозволять комусь із них збити інших щодо використання ресурсів?
  • Чи буде потрібна послуга весь час? Якщо ні, врахуйте активацію сокета (див. Статтю).

Все це легко зробити за допомогою systemd.


5

Якщо у вас є кореневий доступ, вам краще встановити демон, щоб він працював у безпечному режимі та звучав у фоновому режимі. Про те, як це зробити для Debian і Ubuntu, ви можете прочитати в публікації блогу Запуск Node.js як сервіс на Ubuntu .


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

3

Назавжди зробить трюк.

@Kevin: Ви повинні мати змогу добре вбивати процеси. Я ще раз перевірив би документацію. Якщо ви зможете відтворити помилку, було б чудово розмістити її як проблему на GitHub.


Хто такий Кевін? ОП?
Пітер Мортенсен


2

Як сказав Box9, Forever є хорошим вибором коду виробництва. Але також можна продовжувати процес, навіть якщо SSH з'єднання закрите від клієнта.

Хоча це не обов'язково є гарною ідеєю для виробництва, це дуже зручно, коли в середині тривалих сеансів налагодження або слідкувати за консольним виведенням тривалих процесів, або коли це корисно для відключення вашого SSH-з'єднання, але підтримуйте термінал живим на сервері пізніше відновити зв'язок (наприклад, запустити додаток Node.js вдома та пізніше підключитися до консолі, щоб перевірити, як все відбувається).

Якщо припустити, що ваш сервер являє собою * nix вікно, ви можете використовувати команду екрана з оболонки, щоб зберегти процес, навіть якщо клієнтський SSH закритий. Ви можете завантажити / встановити екран з Інтернету, якщо він ще не встановлений (шукайте пакет для розповсюдження, якщо Linux, або використовуйте MacPorts якщо ОС X).

Він працює наступним чином:

  1. Коли ви вперше відкриєте з’єднання SSH, введіть "екран" - це розпочне ваш сеанс на екрані.
  2. Почніть працювати як звичайно (тобто запустіть свою програму Node.js)
  3. Закінчивши, закрийте свій термінал. Ваші серверні процеси продовжуватимуться працювати.
  4. Щоб знову підключитися до консолі, поверніться назад до сервера, увійдіть та введіть 'screen -r', щоб знову підключитися. Ваш старий контекст консолі з'явиться готовим до вас, щоб відновити його використання.
  5. Щоб вийти з екрана під час підключення до сервера, введіть 'exit' у консольному рядку - це перенесе вас на звичайну оболонку.

Ви можете одночасно виконувати декілька сеансів на екрані, як це потрібно, і ви можете підключитися до будь-якого з них із будь-якого клієнта. Прочитайте документацію в Інтернеті для всіх варіантів.


Гарну інформацію мати. Я погоджуюся, що це не буде працювати для виробництва, але може бути дуже корисним при налагодженні на віддаленому сервері.
поважаю TheCode

чому б просто не використовувати nohup-вузол myapp.js & 2> /var/log/myapp.log 1> / dev / null
markus_p

Я вважаю це av корисним youtube.com/watch?v=P4mT5Tbx_KE пояснюючи nohupтаforever
Vinod Srivastav

1

Назавжди - це хороший варіант для забезпечення роботи програм (і це npm встановлюється як модуль, який приємно).

Але для більш серйозного «розгортання» - таких речей, як віддалене управління розгортанням, перезавантаженням, запуском команд тощо - я би використовував capistrano з розширенням вузла.

https://github.com/loopj/capistrano-node-deploy


1

https://paastor.com - це відносно нова послуга, яка робить розгортання для вас, VPS або іншим сервером. Існує CLI для просування коду. Пастор має вільний рівень, принаймні, це робився під час публікації цього повідомлення.



1

Спробуйте сервер вузла-розгортання . Це складний набір інструментів для розгортання програми на ваших приватних серверах. Він написаний на Node.js і використовує npm для встановлення.

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