Я хочу, чтобы приложение nodejs работало, поэтому я выполнил следующее: http://howtonode.org/deploying-node-upstart-monit и установил Monit и Upstart, которые уже пару месяцев отлично работают. Я только что добавил в свое приложение функцию, которая разрешает запись на диск, и получаю ошибки с разрешениями. Я искал все, потому что казалось, что ошибки разрешений не должны быть проблемой. Оказывается, пользователь, которого я начинаю с 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
user и просто запустите:
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, включая записи, но мне нужен Upstart / Monit, чтобы мое приложение nodejs работало.
Тогда как лучше всего настроить Monit / Upstart в этом случае? Я хочу сохранить низкие разрешения (отсюда и deploy
пользователь, у которого нет sudo), и я хочу, чтобы приложение запускалось при сбое.
Это мой сценарий Upstart:
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 ...
чтобы запустить его от имени пользователя, которого вы хотите. Но вот в чем проблема.
Спасибо!
Павел
sudo сохраняется, пока выполняется процесс, поэтому решение заключается в использовании разделов setuid и setgid выскочки. Проблема в том, что для строки, отправляющей PID демона, требуются привилегии root. Вот обходной путь:
[имя] .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
[имя] -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