我正在使用node的forever模块来保持我的节点服务器运行。但是,当系统重新启动时,Forever会终止。有没有什么办法可以在系统重启时自动启动节点服务器(永远)?
答案 0 :(得分:329)
我建议使用crontab。它很容易使用。
要开始编辑,请运行以下命令,将“testuser”替换为节点进程所需的运行时用户。如果您选择的不是其他用户,则必须使用sudo运行。
$ crontab -u testuser -e
如果您之前从未这样做过,它会询问您要编辑哪个编辑器。我喜欢vim,但会推荐nano以方便使用。
进入编辑器后,添加以下行:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
保存文件。您应该获得一些已安装cron的反馈。
要进一步确认安装cron,请执行以下操作(再次使用目标用户名替换“testuser”)以列出当前安装的crons:
$ crontab -u testuser -l
请注意,在我看来,在cron中执行二进制文件时应始终使用完整路径。
此外,如果您的永久脚本的路径不正确,请运行which forever
以获取完整路径。
鉴于forever
来电node
,您可能还想提供node
的完整路径:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
答案 1 :(得分:119)
您可以使用forever-service来执行此操作。
npm install -g forever-service
forever-service install test
这将永久地将当前目录中的app.js作为服务提供。每次重新启动系统时,该服务都将自动重新启动。此外,当停止时,它将尝试优雅停止。该脚本也提供了logrotate脚本。
Github网址:https://github.com/zapty/forever-service
注意:我是永远服务的作者。
答案 2 :(得分:24)
此案适用于Debian
将以下内容添加到/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}替换为您的用户名
{{app path}}替换为您的应用路径。例如,/var/www/test/app.js
答案 3 :(得分:17)
使用NPM全局安装PM2
npm install pm2 -g
使用pm2
启动脚本 pm2 start app.js
生成活动启动脚本
pm2 startup
注意:pm2启动用于在系统重新启动时启动PM2。 PM2一旦启动,重新启动系统停机前管理的所有进程。
如果您想要禁用自动启动,只需使用pm2 unstartup
如果您希望在其他用户下执行启动脚本,只需使用-u <username>
选项和--hp <user_home>:
答案 4 :(得分:10)
另一种受this回答和this博客帖子启发的crontab方法。
<强> 1。创建一个bash脚本文件(将bob更改为所需的用户)。
vi /home/bob/node_server_init.sh
<强> 2。将其复制并粘贴到刚刚创建的文件中。
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
请务必根据您的配置修改上述路径!
第3。确保可以执行bash脚本。
chmod 700 /home/bob/node_server_init.sh
<强> 4。将“bob”替换为节点的运行时用户。
crontab -u bob -e
<强> 5。复制并粘贴(将bob更改为所需用户)。
@reboot /bin/sh /home/bob/node_server_init.sh
保存crontab。
你已经完成了,你的奖金是重启(测试):)
答案 5 :(得分:9)
来自附件question的复制答案。
您可以使用PM2,它是具有内置负载均衡器的Node.js应用程序的生产流程管理器。
安装PM2
imshow(image,[min(min(mean)),max(max(mean))]);
启动应用程序
$ npm install pm2 -g
如果您使用快递,则可以启动您的应用
$ pm2 start app.js
列出所有正在运行的进程:
pm2 start ./bin/www --name="app"
它将列出所有进程。然后,您可以使用以下命令使用应用程序的ID或名称来停止/重新启动您的服务。
$ pm2 list
显示日志
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
答案 6 :(得分:7)
您需要在/etc/init.d文件夹中创建一个shell脚本。如果您从未这样做过,那有点复杂,但在init.d脚本上网上有大量信息。
以下是我为永久运行CoffeeScript网站而创建的脚本示例:
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
我必须确保为root用户显式设置或使用文件夹和PATH,因为init.d脚本以root身份运行。
答案 7 :(得分:6)
使用PM2
哪个是运行服务器生产服务器的最佳选择
以这种方式运行应用程序有什么好处?
如果应用程序崩溃,PM2将自动重启您的应用程序。
PM2将记录未处理的异常 - 在本例中,在/home/safeuser/.pm2/logs/app-err.log中的文件中。
使用一个命令,PM2可以确保在服务器重新启动时它管理的任何应用程序都会重新启动。基本上,您的节点应用程序将作为服务启动。
答案 8 :(得分:5)
永远不会让节点应用程序作为服务运行。正确的方法是创建/ etc / inittab条目(旧的Linux系统)或新手(更新的Linux系统)。
以下是一些关于如何将其设置为暴发户的文档: https://github.com/cvee/node-upstart
答案 9 :(得分:5)
crontab在CentOS x86 6.5上对我不起作用。 @reboot似乎无法正常工作。
最后我得到了这个解决方案。
编辑/etc/rc.local
sudo vi /etc/rc.local
在文件末尾添加此行。将USER_NAME和PATH_TO_PROJECT更改为您自己的。 NODE_ENV =生产意味着应用程序在生产模式下运行。如果需要运行多个node.js app,可以添加更多行。
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
不要将NODE_ENV设置在单独的行中,您的应用仍将以开发模式运行,因为永远不会获得NODE_ENV。
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
保存并退出vi(按ESC:w q返回)。您可以尝试重新启动服务器。服务器重新启动后,即使您没有通过ssh远程登录任何帐户,您的node.js应用程序也应自动运行。
您最好在shell中设置NODE_ENV环境。当您的帐户USER_NAME登录时,系统会自动设置NODE_ENV。
echo export NODE_ENV=production >> ~/.bash_profile
因此,您可以通过ssh运行诸如forever stop / start /PATH_TO_PROJECT/app.js之类的命令,而无需再次设置NODE_ENV。
答案 10 :(得分:3)
我写了一个完全符合这个要求的脚本:
https://github.com/chovy/node-startup
我没有永远尝试过,但你可以自定义它运行的命令,所以它应该是直截了当的:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
答案 11 :(得分:1)
我尝试了很多上述答案。他们都没有为我工作。我的应用安装在/home
和用户,而不是root用户。这可能意味着当上面提到的启动脚本运行时,/home
尚未安装,因此应用程序未启动。
然后我在Digital Ocean发现了这些说明:
按照说明使用PM2非常简单并且工作正常:我的虚拟服务器有两次物理崩溃 - 停机时间只有一分钟左右。
答案 12 :(得分:1)
rc.local的问题是命令以root身份访问,这与以用户身份登录并使用sudo不同。
我通过添加.sh脚本和我想要的启动命令etc / profile.d解决了这个问题。 profile.d中的任何.sh文件都将自动加载,任何命令都将被视为使用常规sudo。
唯一的缺点是指定的用户需要登录才能启动,在我的情况下总是这样。
答案 13 :(得分:0)
您可以在shell中使用以下命令永久启动您的节点
永远的app.js //我的节点脚本
您需要记住,应用程序运行的服务器应始终保持运行状态。
答案 14 :(得分:0)
完整的示例crontab(位于/ etc / crontab)..
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;