Я использую модуль узла навсегда, чтобы сервер узла работал. Однако навсегда завершается при перезагрузке системы. Есть ли способ, которым я могу автоматически запустить сервер узла (с навсегда) при перезагрузке системы?
Я использую модуль узла навсегда, чтобы сервер узла работал. Однако навсегда завершается при перезагрузке системы. Есть ли способ, которым я могу автоматически запустить сервер узла (с навсегда) при перезагрузке системы?
Ответы:
Я бы предложил использовать crontab. Это просто в использовании.
Чтобы начать редактирование, выполните следующую замену «testuser» на нужного пользователя среды выполнения для процесса узла. Если вы выберете другого пользователя, кроме себя, вам придется запустить его с помощью sudo.
$ crontab -u testuser -e
Если вы никогда не делали этого раньше, он спросит вас, с каким редактором вы хотите редактировать. Мне нравится vim, но я рекомендую nano для простоты использования.
Однажды в редакторе добавьте следующую строку:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
Сохраните файл. Вы должны получить некоторые отзывы о том, что cron был установлен.
Для дальнейшего подтверждения установки cron выполните следующее (снова заменив «testuser» вашим целевым именем пользователя), чтобы вывести список текущих установленных cron:
$ 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 начинается с запуска cron deamon. Чтобы добавить, я никогда не сталкивался с ситуацией, которая предполагала бы, что мои cron, которые установлены в @reboot
, не работают при загрузке системы. То, как вы его выключаете, для этого не имеет значения.
/home
еще не смонтирован, поэтому он не будет работать, если ваш код живет в /home
.
@reboot varname=value ...
Вы можете использовать навсегда сервис для этого.
npm install -g forever-service
forever-service install test
Это обеспечит app.js в текущем каталоге как службу через вечность. Служба будет автоматически перезагружаться при каждом перезапуске системы. Также при остановке будет предпринята попытка изящной остановки. Этот скрипт также предоставляет скрипт logrotate.
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 unstartup
Если вы хотите, чтобы скрипт запуска выполнялся под другим пользователем, просто используйте -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
/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" )
Альтернативный метод crontab, вдохновленный этим ответом и этим сообщением в блоге.
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
Сохраните crontab.
Вы сделали это до конца, ваш приз - перезагрузка (для проверки) :)
Скопированный ответ от прикрепленного вопроса .
Вы можете использовать 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 были явно установлены или доступны для пользователя root, так как сценарии 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
Проблема с rc.local заключается в том, что доступ к командам осуществляется с правами root, что отличается от входа в систему как пользователя и использования sudo.
Я решил эту проблему, добавив скрипт .sh с командами запуска, которые я хочу, в etc / profile.d. Любой файл .sh в profile.d будет загружен автоматически, и любая команда будет обрабатываться так, как если бы вы использовали обычный sudo.
Единственным недостатком этого является то, что указанный пользователь должен войти в систему, чтобы все началось, что в моей ситуации всегда было так.
Я перепробовал множество приведенных выше ответов. Никто из них не работал для меня. Мое приложение установлено /home
как пользователь, а не как пользователь root. Это, вероятно, означает, что при запуске вышеупомянутых стартовых скриптов,/home
еще не смонтированы, поэтому приложение не запускается.
Затем я нашел эти инструкции от Digital Ocean:
Использование PM2, как объяснено, было очень простым и прекрасно работает: с тех пор на моих виртуальных серверах произошли два физических сбоя - время простоя составило всего около минуты.
полный пример 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
Вы должны помнить, что сервер, на котором работает ваше приложение, всегда должен быть включен.