我想保持 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
并运行时:
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 ...
才能以您想要的用户身份运行它。但这正是导致问题的原因。
谢谢!
保罗
答案1
只要进程正在运行,sudo 就会一直存在,因此解决方案是使用 upstart 的 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