我正在使用节点的永远模块来保持我的节点服务器运行。但是,当系统重新启动时,Forever 会终止。有什么方法可以在系统重新启动时自动启动节点服务器(永远)?
16 回答
我建议使用 crontab。它很容易使用。
如何
要开始编辑,请运行以下命令,将“testuser”替换为节点进程所需的运行时用户。如果您选择自己以外的其他用户,则必须使用 sudo 运行它。
$ crontab -u testuser -e
如果您以前从未这样做过,它会询问您希望使用哪个编辑器进行编辑。我喜欢 vim,但会推荐 nano 以方便使用。
在编辑器中添加以下行:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
保存文件。您应该会收到一些关于 cron 已安装的反馈。
要进一步确认 cron 的安装,请执行以下命令(再次将“testuser”替换为您的目标用户名)以列出当前安装的 cron:
$ 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
延伸阅读
您可以使用 forever-service 来执行此操作。
npm install -g forever-service
forever-service install test
这将通过永远将当前目录中的 app.js 配置为服务。每次系统重启时服务都会自动重启。此外,当它停止时,它会尝试优雅地停止。此脚本也提供 logrotate 脚本。
Github 网址:https ://github.com/zapty/forever-service
注意:我是永远服务的作者。
使用 NPM 全局安装 PM2
npm install pm2 -g
用 pm2 开始你的脚本
pm2 start app.js
生成一个活动的启动脚本
pm2 startup
注意:pm2 启动是为了在系统重启时启动 PM2。PM2 一旦启动,就会重新启动它在系统关闭之前一直在管理的所有进程。
如果您想禁用自动启动,只需使用 pm2 unstartup
如果您希望启动脚本在另一个用户下执行,只需使用-u <username>
选项和--hp <user_home>:
这种情况对 Debian 有效。
将以下内容添加到/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
替换您的用户名。{{app path}}
替换您的应用程序路径。例如,/var/www/test/app.js
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. 测试 bash 脚本。
sh /home/bob/node_server_init.sh
5. 将“bob”替换为节点的运行时用户。
crontab -u bob -e
6. 复制并粘贴(将 bob 更改为所需的用户)。
@reboot /bin/sh /home/bob/node_server_init.sh
保存 crontab。
你已经完成了,你的奖品是重新启动(测试):)
从所附问题复制答案。
您可以使用PM2,它是带有内置负载均衡器的 Node.js 应用程序的生产流程管理器。
安装 PM2
$ npm install pm2 -g
启动应用程序
$ pm2 start app.js
如果您使用快递,那么您可以像这样启动您的应用程序
pm2 start ./bin/www --name="app"
列出所有正在运行的进程:
$ pm2 list
它将列出所有进程。然后,您可以使用以下命令使用应用程序的 ID 或名称来停止/重新启动服务。
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
显示日志
$ pm2 logs ['all'|app_name|app_id]
You need to create a shell script in the /etc/init.d folder for that. It's sort of complicated if you never have done it but there is plenty of information on the web on init.d scripts.
Here is a sample a script that I created to run a CoffeeScript site with forever:
#!/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
I had to make sure the folder and PATHs were explicitly set or available to the root user since init.d scripts are ran as root.
使用PM2
哪个是运行服务器生产服务器的最佳选择
以这种方式运行您的应用程序有什么好处?
如果 PM2 崩溃,它将自动重新启动您的应用程序。
PM2 将记录您未处理的异常 - 在这种情况下,在 /home/safeuser/.pm2/logs/app-err.log 的文件中。
通过一个命令,PM2 可以确保它管理的任何应用程序在服务器重新启动时重新启动。基本上,您的节点应用程序将作为服务启动。
crontab
在 CentOS x86 6.5 上对我不起作用。@reboot 似乎不起作用。
最后我得到了这个解决方案:
编辑: /etc/rc.local
sudo vi /etc/rc.local
将此行添加到文件末尾。改变USER_NAME
和PATH_TO_PROJECT
你自己的。NODE_ENV=production
表示应用程序在生产模式下运行。如果您需要运行多个 node.js 应用程序,您可以添加更多行。
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 return
)。您可以尝试重新启动服务器。服务器重新启动后,您的 node.js 应用程序应该会自动运行,即使您没有通过 ssh 远程登录任何帐户。
你最好NODE_ENV
在你的shell中设置环境。NODE_ENV
将在您的帐户USER_NAME
登录时自动设置。
echo export NODE_ENV=production >> ~/.bash_profile
/PATH_TO_PROJECT/app.js
因此,您可以通过 ssh运行诸如永远停止/启动之类的命令,而无需NODE_ENV
再次设置。
Forever 不是为了让节点应用程序作为服务运行。正确的方法是创建 /etc/inittab 条目(旧的 linux 系统)或 upstart(较新的 linux 系统)。
以下是有关如何将其设置为新贵的一些文档: https ://github.com/cvee/node-upstart
我写了一个脚本来做到这一点:
https://github.com/chovy/node-startup
我没有永远尝试过,但你可以自定义它运行的命令,所以它应该是直截了当的:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
rc.local 的问题在于命令是以 root 身份访问的,这与以用户身份登录并使用 sudo 不同。
我通过添加一个带有我想要 etc/profile.d 的启动命令的 .sh 脚本解决了这个问题。profile.d 中的任何 .sh 文件都将自动加载,并且任何命令都将被视为使用常规 sudo。
唯一的缺点是指定的用户需要登录才能开始,在我的情况下总是如此。
我尝试了很多上述答案。他们都没有为我工作。我的应用程序/home
以用户身份安装,而不是以 root 身份安装。这可能意味着当上面提到的启动脚本运行时,/home
还没有挂载,所以应用程序没有启动。
然后我找到了 Digital Ocean 的这些说明:
如前所述,使用 PM2 非常简单并且运行良好:我的虚拟服务器发生了两次物理崩溃,因为停机时间只有大约一分钟。
完整的示例 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;
I have found my own solution by using serve & npm as follows:
- Install serve package:
npm install -g serve
- Then have the command
serve -s /var/www/sitename
to execute on reboot.
This is what works for me on my VPS.
您可以在 shell 中使用以下命令来永久启动您的节点:
forever app.js //my node script
您需要记住,运行您的应用程序的服务器应始终保持打开状态。