我想保持一个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
NODE_ENV=production node /srv/www/[name of my app]/dist/app.js
只有一个过程!
3131 pts/1 Sl+ 0:04 node /srv/www/[name of my app]/dist/app.js
这个问题是由于某种原因,第二个进程没有正确的写入权限,似乎是正在进行工作的进程.当我不使用Upstart包括写入时,一切都很完美,但我需要Upstart / Monit来保持我的nodejs应用程序运行.
那么在这种情况下配置Monit / Upstart的最佳方法是什么呢?我想保持低权限(因此没有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就会持续存在,因此解决方案是使用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