我想保持一个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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。