Я використовую вічний модуль назавжди, щоб підтримувати сервер мого вузла. Однак назавжди припиняється, коли відбувається перезавантаження системи. Чи є спосіб я автоматично запустити сервер вузлів (з назавжди), коли система перезапуститься?
Я використовую вічний модуль назавжди, щоб підтримувати сервер мого вузла. Однак назавжди припиняється, коли відбувається перезавантаження системи. Чи є спосіб я автоматично запустити сервер вузлів (з назавжди), коли система перезапуститься?
Відповіді:
Я б запропонував використовувати кронтаб. Це простий у використанні.
Щоб почати редагування, виконайте наступне, замінивши "testuser" на потрібного користувача часу виконання для процесу вузла. Якщо ви вибрали іншого користувача, крім себе, вам доведеться запустити це з судо.
$ crontab -u testuser -e
Якщо ви ніколи цього не робили, він запитає, з яким редактором ви хочете редагувати. Мені подобається vim, але рекомендую нано для зручності використання.
Одного разу в редакторі додайте наступний рядок:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
Збережіть файл. Ви повинні отримати відгуки про те, що крон встановлений.
Для подальшого підтвердження встановлення крона виконайте наступне (знову замінивши "testuser" на ваше цільове ім'я користувача), щоб перелічити встановлені на даний момент крони:
$ crontab -u testuser -l
Зауважте, що на мою думку, ви завжди повинні використовувати повні шляхи під час виконання бінарних файлів у cron. Крім того, якщо шлях до вашого вічного сценарію невірний, запустіть, which forever
щоб отримати повний шлях.
Враховуючи ці forever
дзвінки node
, ви також можете надати повний шлях до node
:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
@reboot
крон запускається на запуску cron deamon. Додамо, я ніколи не стикався з ситуацією, яка б підказувала, що мій cron, який встановлений @reboot
, не працює при завантаженні системи. Те, як ви його відключили, для цього не має значення.
/home
це ще не встановлено, тому це не працюватиме, якщо ваш код живе /home
.
@reboot varname=value ...
Для цього ви можете використовувати сервіс навіки.
npm install -g forever-service
forever-service install test
Це надасть app.js у поточному каталозі як послугу через назавжди. Служба автоматично перезапускається кожного разу при перезапуску системи. Також при зупинці він спробує витончену зупинку. Цей сценарій також забезпечує логротатний сценарій.
URL-адреса Github: https://github.com/zapty/forever-service
ПРИМІТКА: Я автор вічної служби.
forever-service install test
, test
буде назва служби , але не ім'я файлу самої програми / вузла .js для запуску. За замовчуванням, передбачається , назва програми app.js
, але ви можете змінити його за допомогою --script
прапора, наступним чином : forever-service install test --script main.js
. (Неперевірено, тому, будь ласка, виправте мене, якщо якась синтаксична деталь неправильна.)
Встановіть PM2 у всьому світі, використовуючи NPM
npm install pm2 -g
Почніть свій сценарій з pm2
pm2 start app.js
генерувати активний сценарій запуску
pm2 startup
ПРИМІТКА. Запуск pm2 - це запуск PM2 при перезавантаженні системи. Після запуску PM2 перезапускає всі процеси, якими керувала до того, як система вийшла з ладу.
Якщо ви хочете відключити автоматичний запуск, просто використовуйте pm2 untartup
Якщо ви хочете, щоб сценарій запуску виконувався під іншим користувачем, просто скористайтеся -u <username>
опцією та--hp <user_home>:
Цей випадок дійсний для Debian.
Додайте до /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
замінює ваше ім'я користувача. {{app path}}
замінює ваш шлях до програми. Наприклад,/var/www/test/app.js
/etc/rc.local
, а не/etc/init.d/rc.local
app.js
щоб переконатися, що відносні файли завантажуються правильно - process.chdir('/your/path/to/your/app');
Node.js ref docs тут
/etc/rc.local
зробити для мене хитрість:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Альтернативний метод кронтабування, натхненний цією відповіддю та цією публікацією в блозі.
1. Створіть файл сценарію bash (змініть bob на потрібного користувача).
vi /home/bob/node_server_init.sh
2. Скопіюйте та вставте всередину файлу, який ви тільки що створили.
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
Переконайтесь, що ви редагували вищевказані контури відповідно до своєї конфігурації!
3. Переконайтесь, що сценарій bash може бути виконаний.
chmod 700 /home/bob/node_server_init.sh
4. Тестуйте сценарій bash.
sh /home/bob/node_server_init.sh
5. Замініть "bob" користувачем часу виконання для вузла.
crontab -u bob -e
6. Скопіюйте та вставте (змініть bob на потрібного користувача).
@reboot /bin/sh /home/bob/node_server_init.sh
Збережіть кронтаб.
Ви зробили це до кінця, ваш приз - це перезавантаження (для тестування) :)
Скопійовано відповідь із доданого питання .
Можна використовувати PM2 , це менеджер виробничих процесів для додатків Node.js із вбудованим балансиром навантаження.
Встановіть PM2
$ npm install pm2 -g
Запустіть програму
$ pm2 start app.js
Якщо ви використовуєте експрес, ви можете запустити додаток, як
pm2 start ./bin/www --name="app"
Список усіх запущених процесів:
$ pm2 list
У ньому буде перераховано весь процес. Потім ви можете зупинити / перезапустити службу, скориставшись ідентифікатором або іменем програми за допомогою наступної команди.
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
Для відображення журналів
$ pm2 logs ['all'|app_name|app_id]
$pm2 startup
Після цього з'явиться pm2 з проханням вручну запустити команду, скопіювати та запустити її. Тоді, $pm2 save
тепер ваш app.js переживе перезавантаження системи
Для цього потрібно створити скрипт оболонки в папці /etc/init.d. Це щось складне, якщо ви ніколи цього не робили, але в сценаріях init.d в Інтернеті є багато інформації.
Ось зразок сценарію, який я створив, щоб назавжди запустити сайт CoffeeScript:
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
Я повинен був переконатися, що папка та PATH були явно встановлені або доступні кореневому користувачеві, оскільки сценарії init.d запускаються як root.
Використовуйте PM2
Який найкращий варіант запустити сервер виробництва сервера
Які переваги запуску вашої програми таким чином?
PM2 автоматично перезапустить вашу програму, якщо вона вийде з ладу.
PM2 зберігатиме журнал ваших необроблених винятків - у цьому випадку у файлі за адресою /home/safeuser/.pm2/logs/app-err.log.
За допомогою однієї команди PM2 може забезпечити перезавантаження будь-яких додатків, якими він керує, коли сервер перезавантажується. В основному, ваш додаток для вузла запуститься як послуга.
Назавжди не створювалося, щоб програми вузлів працювали як служби. Правильний підхід полягає у створенні запису / etc / inittab (старі системи Linux) або на початку (новіші системи Linux).
Ось деяка документація про те, як налаштувати це як початковий процес: https://github.com/cvee/node-upstart
crontab
не працює для мене на CentOS x86 6.5. @reboot, здається, не працює.
Нарешті я отримав таке рішення:
Редагувати: /etc/rc.local
sudo vi /etc/rc.local
Додайте цей рядок до кінця файлу. Змінюйтесь USER_NAME
і PATH_TO_PROJECT
на власні. NODE_ENV=production
означає, що додаток працює у виробничому режимі. Ви можете додати більше рядків, якщо вам потрібно запустити більше однієї програми node.js.
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
Не встановлюйте NODE_ENV
окремий рядок, ваш додаток все одно буде працювати в режимі розробки, тому що назавжди не отримується NODE_ENV
.
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
Збережіть і вийдіть з vi (натисніть ESC : w q return
). Ви можете спробувати перезавантажити ваш сервер. Після перезавантаження вашого сервера додаток node.js повинен запускатися автоматично, навіть якщо ви віддалено не входите в будь-який обліковий запис через ssh.
Ви краще встановіть NODE_ENV
середовище в своїй оболонці. NODE_ENV
буде встановлено автоматично, коли ваш обліковий запис USER_NAME
увійде в систему.
echo export NODE_ENV=production >> ~/.bash_profile
Таким чином, ви можете запускати команди, як назавжди зупинити / запустити /PATH_TO_PROJECT/app.js
через ssh, не встановлюючи NODE_ENV
знову.
Я написав сценарій, який робить саме це:
https://github.com/chovy/node-startup
Я не намагався з цим назавжди, але ви можете налаштувати команду, яку вона виконує, тому вона повинна бути прямо вперед:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
Я перепробував багато вищезазначених відповідей. Жоден з них не працював на мене. Мій додаток встановлено в /home
і як користувач, а не як root. Це, ймовірно, означає, що коли вищезазначені сценарії запуску /home
ще не встановлені, тому додаток не запускається.
Потім я знайшов ці вказівки від Digital Ocean:
Використовувати PM2, як було пояснено, було дуже просто і прекрасно працює: з моїх віртуальних серверів було два фізичні збої з тих пір - простої були лише близько хвилини.
Проблема rc.local полягає в тому, що до команд звертається як до root, який відрізняється від входу в систему як користувача та використання sudo.
Я вирішив цю проблему, додавши .sh скрипт із командами запуску, які я хочу до etc / profile.d. Будь-який .sh файл у profile.d завантажується автоматично, і будь-яка команда буде розглядатися так, як якщо б ви використовували звичайний sudo.
Єдиним недоліком цього є те, що вказаний користувач повинен увійти в систему, щоб почати все, що в моїй ситуації було завжди.
повний приклад crontab (розташований за адресою / etc / crontab).
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;
Ви можете використовувати таку команду в оболонці, щоб назавжди запустити свій вузол:
forever app.js //my node script
Потрібно пам’ятати, що сервер, на якому працює ваша програма, завжди повинен тримати.