Php-разработчики попросили помочь с решением проблемы автозапуска nodejs приложения после загрузки ОС и его автоматического "поднятия" если оно упадет. С nodejs я на "вы", поэтому начал искать в интернете готовые решения.
Возможные частично удовлетворяющие решения: запуск в кроне после перезагрузки, написание init-скрипта, forever-service (вроде как может поднимать упавшие приложения nodejs, но в свою очередь ему самому как-то надо стартовать). Правильным выглядит использование systemd (там и автозагрузка, и поднятие упавшего приложения), но на сервере стоит 7 wheezy. Можно, конечно, его поставить, но поломать рабочий сайт не совсем хотелось.
Из простого и не затратного по времени показалась установка и использование monit.
Исходные данные:
cat /etc/debian_version 7.9 uname -r 3.16.0-0.bpo.4-amd64
Веб-разработчики описали каким образом стартуют приложение:
su user #под этим пользователем запускается приложение cd /home/user/taxi/ forever start app.js forever stopall
Приложение открывает tcp-port 3030.
Ставим и настраиваем софт:
apt-get install monit # tail /etc/monit/monitrc
check process nodejs matching /home/user/taxi/app.js #Проверяем что есть такой процесс start program = "/usr/local/bin/forever --pidFile /home/user/.forever/pids/js.pid -a \ -l /home/user/.forever/log.log -o /home/user/.forever/log.log -e /home/user/.forever/log.log \ --workingDir /home/user/taxi --sourceDir /home/user/taxi start app.js" as uid user and gid website #Команда для запуска приложения под пользователем user stop program = "/usr/local/bin/forever stopall" as uid website and gid website if failed host 127.0.0.1 port 3030 type tcp #Проверка того, что приложение запустилось и принимает соединения по порту 3030 then restart
Проверяется запущен ли процесс app.js, если нет - то приложение nodejs запускается. В случае если приложение перестало слушать tcp-порт 3030, то тогда делаем его stop-start.
Если не прописать все эти флаги, то forever не сможет найти рабочую директорию, в которой необходимо запускать приложение, будет пытаться записать логи и pid в /root/.forever (где ему не хватит прав).