Я хочу поддерживать nodejs приложение в рабочем состоянии, таким образом, я следовал за этим: http://howtonode.org/deploying-node-upstart-monit и установленный Monit и Upstart, которые работали отлично в течение нескольких месяцев. Я просто добавил опцию к своему приложению, которое позволяет записи на диск и получает ошибки полномочий. Я пошел, ища все, потому что казалось, что ошибки полномочий не должны быть проблемой. Оказывается, что пользователь, которого я запускаю с Выскочки, не является на самом деле пользователем, который запускает приложение!
Когда я работаю:
sudo -u deploy NODE_ENV=production node /srv/www/[name of my app]/dist/app.js
Или через Monit/Upstart, или только через SSH, это создает 2 процесса. От ps ax
:
2869 ? Ss 0:00 sudo -u deploy node /srv/www/[name of my app]/dist/app.js
2878 ? Sl 0:01 node /srv/www/[name of my app]/dist/app.js
Когда я вхожу в систему как deploy
пользователь и просто выполненный:
NODE_ENV=production node /srv/www/[name of my app]/dist/app.js
Существует только 1 процесс!
3131 pts/1 Sl+ 0:04 node /srv/www/[name of my app]/dist/app.js
Эта проблема - то, что по некоторым причинам, второй процесс не имеет корректных полномочий записать и, кажется, тот, делающий работу. Все прекрасно, когда я не использую Выскочку включая записи, но мне нужен Upstart/Monit для поддерживания моего nodejs приложения в рабочем состоянии.
Что лучший способ состоит в том, чтобы настроить Monit/Upstart в этом случае, затем? Я хочу поддержать полномочия на низком уровне (следовательно deploy
пользователь, который не имеет sudo) и я хочу, чтобы приложение запустилось, когда это отказывает.
Это - мой Новомодный сценарий:
start on startup
stop on shutdown
script
export HOME="/home/deploy"
echo $$ > /var/run/[name of my app].pid
exec sudo -u deploy NODE_ENV=production node /srv/www/[name of my app]/dist/app.js >> /srv/www/log/[name of my app].sys.log 2>&1
end script
Что-то не так там?
В учебном руководстве говорится для использования sudo -u user ...
для выполнения его как пользователь, Вы хотите. Но это - вещь, это вызывает проблему.
Спасибо!
Paul
sudo сохраняется до тех пор, пока запущен процесс, поэтому решением будет использование setuid и setgid-стенз upstart. Проблема заключается в том, что строке, посылающей PID демона, нужны привилегии root. Вот обходной путь:
.[name].conf:
start on runlevel [2345]
stop on runlevel [016]
env HOME=/home/deploy
env NODE_ENV=production
setuid deploy
setgid deploy
exec node /srv/www/[name]/dist/app.js
[name]-pidfile.conf
start on started [name]
stop on stopped [name]
pre-start script
initctl status name | cut -d" " -f4 > /var/run/[name].pid
end script
post-stop exec rm -f /var/run/[name].pid