Який найкращий спосіб розгорнути Node.js?
У мене VPS Dreamhost (саме так вони називають VM ), і мені вдалося встановити Node.js і налаштувати проксі. Це чудово працює, якщо я зберігаю SSH-з'єднання, яке я почав із вузла відкритим.
Який найкращий спосіб розгорнути Node.js?
У мене VPS Dreamhost (саме так вони називають VM ), і мені вдалося встановити Node.js і налаштувати проксі. Це чудово працює, якщо я зберігаю SSH-з'єднання, яке я почав із вузла відкритим.
Відповіді:
Відповідь 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
файл).
Failed to issue method call: Unit name ... is not valid.
?
/etc/systemd/system
можливо, вам доведеться запустити systemctl daemon-reload
(systemd зазвичай скаже вам, чи потрібно це). TBH це найкраще задати як окреме питання.
/etc/systemd/system
, ви можете просто використовувати systemctl enable /full/path/to/myapp.service
, що створює /etc/systemd/system
для вас символьне посилання .
node
викликається /var/www/myapp/app.js
сам по собі. У Unix, якщо ви зробите файл виконуваним, а перший рядок починається з #!/some/file
файлу, він буде інтерпретований цим двійковим файлом. Google "перекладач Unix", щоб знати більше.
Використовуйте назавжди . Він запускає програми Node.js в окремих процесах і перезапускає їх, якщо такі вмирають.
Використання:
forever start example.js
щоб розпочати процес.forever list
щоб побачити список усіх процесів, запущених назавждиforever stop example.js
зупинити процес або forever stop 0
зупинити процес з індексом 0 (як показано на forever list
).forever stop 0
сталася помилка, і речі просто так розпалися. Я намагався зробити це без кореня для власного користувача, щоб я міг легко очистити, як тільки знайду правильне рішення. Це може бути моєю проблемою. Я ще раз загляну в це.
Я писав про свій метод розгортання тут: Розгортання програм node.js
Коротко:
pm2 виконує трюки.
Особливості: моніторинг, перезавантаження гарячого коду, вбудований балансир навантаження, сценарій автоматичного запуску та процеси воскресіння / скидання.
Ви можете використовувати monit
, forever
, upstart
або , systemd
щоб почати свій сервер.
Ви можете використовувати Varnish або HAProxy замість Nginx (відомо, що Nginx не працює з веб-розетками).
В якості швидкого і брудного рішення , яке ви можете використовувати , nohup node your_app.js &
щоб запобігти додаток , що закінчуються на сервері, але forever
, monit
і інші пропоновані рішення краще.
Я створив сценарій 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
Я написав досить вичерпний посібник з розгортання Node.js, із прикладними файлами:
Ось довша стаття щодо вирішення цієї проблеми з systemd: http://savanne.be/articles/deploying-node-js-with-systemd/
Деякі речі, які слід пам’ятати:
Все це легко зробити за допомогою systemd.
Якщо у вас є кореневий доступ, вам краще встановити демон, щоб він працював у безпечному режимі та звучав у фоновому режимі. Про те, як це зробити для Debian і Ubuntu, ви можете прочитати в публікації блогу Запуск Node.js як сервіс на Ubuntu .
Назавжди зробить трюк.
@Kevin: Ви повинні мати змогу добре вбивати процеси. Я ще раз перевірив би документацію. Якщо ви зможете відтворити помилку, було б чудово розмістити її як проблему на GitHub.
Чудовий і докладний посібник з розгортання програм Node.js за допомогою Capistrano, Upstart і Nginx
Як сказав Box9, Forever є хорошим вибором коду виробництва. Але також можна продовжувати процес, навіть якщо SSH з'єднання закрите від клієнта.
Хоча це не обов'язково є гарною ідеєю для виробництва, це дуже зручно, коли в середині тривалих сеансів налагодження або слідкувати за консольним виведенням тривалих процесів, або коли це корисно для відключення вашого SSH-з'єднання, але підтримуйте термінал живим на сервері пізніше відновити зв'язок (наприклад, запустити додаток Node.js вдома та пізніше підключитися до консолі, щоб перевірити, як все відбувається).
Якщо припустити, що ваш сервер являє собою * nix вікно, ви можете використовувати команду екрана з оболонки, щоб зберегти процес, навіть якщо клієнтський SSH закритий. Ви можете завантажити / встановити екран з Інтернету, якщо він ще не встановлений (шукайте пакет для розповсюдження, якщо Linux, або використовуйте MacPorts якщо ОС X).
Він працює наступним чином:
Ви можете одночасно виконувати декілька сеансів на екрані, як це потрібно, і ви можете підключитися до будь-якого з них із будь-якого клієнта. Прочитайте документацію в Інтернеті для всіх варіантів.
Назавжди - це хороший варіант для забезпечення роботи програм (і це npm встановлюється як модуль, який приємно).
Але для більш серйозного «розгортання» - таких речей, як віддалене управління розгортанням, перезавантаженням, запуском команд тощо - я би використовував capistrano з розширенням вузла.
https://paastor.com - це відносно нова послуга, яка робить розгортання для вас, VPS або іншим сервером. Існує CLI для просування коду. Пастор має вільний рівень, принаймні, це робився під час публікації цього повідомлення.
У вашому випадку ви можете використовувати вискочка демон. Для повного рішення щодо розгортання я можу запропонувати capistrano . Два корисних посібника: Як налаштувати Node.js env та Як розгорнути через capistrano + upstart .
Спробуйте сервер вузла-розгортання . Це складний набір інструментів для розгортання програми на ваших приватних серверах. Він написаний на Node.js і використовує npm для встановлення.