在Linux上用forever实现Node.js项目自启动
那么能否利用forever加启动脚本方式解决上述问题呢?答案当然是肯定的,只不过有点麻烦,而且forever官方缺少详细的配置文档。我在配置的时候也走了一些弯路,下面详细来说。
注:本文的实验环境是UbuntuServer12.04LTSx86_64,在CentOS上的配置更简单一些
最早,我想着试试在/etc/rc.local中增加一句foreverstartxxx看看,结果发现Ubuntu(其他系统一样)就不鸟我,主要矛盾就是mongodb使用这种方式就可以跑起来,forever就不行,无奈之下,还是从/etc/init.d的角度去考虑吧。
前提是要先把forever好,方法很简单,执行如下命令就好:
npminstallforever-g
安装完成后,用一个简单的Node程序测试一下:
foreverstarttest.js foreverstoptest.js foreverrestarttest.js
只要不提示error,就表明forever是可以用的,也就是说用forever来后台开启一个Node项目的基本条件已经具备,剩下的就是来编写一个启动脚本了。
脚本的基本内容如下,感谢原作者的辛勤劳动:
#!/bin/bash ###BEGININITINFO #Provides:xiyoulib #Required-Start:$all #Required-Stop:$all #Default-Start:2345 #Default-Stop:016 #Short-Description:Startdaemonatboottime #Description:Enableserviceprovidedbydaemon. ###ENDINITINFO #chkconfig:3458808 #description:ForeverforNode.js DEAMON=/node.js/XiyouLibNodeExpress/bin/www#这里需要填写你自己的Node项目的启动脚本文件 LOG=/node.js/log/log#可选,日志文件目录 PID=/node.js/pid#必填内容,用于记录forever的进程号 exportPATH=$PATH:/usr/local/bin#在这里指定一下Node的可执行程序安装目录,我的是/usr/local/bin exportNODE_PATH=$NODE_PATH:/usr/local/lib/node_modules#这里是Node类库的路径 #往下的内容就不用修改了 node=node forever=forever case"$1"in start) $foreverstart-l$LOG--pidFile$PID-a$DEAMON ;; stop) $foreverstop--pidFile$PID$DEAMON ;; stopall) $foreverstopall--pidFile$PID ;; restartall) $foreverrestartall--pidFile$PID ;; reload|restart) $foreverrestart-l$LOG--pidFile$PID-a$DEAMON ;; list) $foreverlist ;; *) echo"Usage:/etc.init.d/node{start|stop|restart|reload|stopall|restartall|list}" exit1 ;; esac
在这里提醒一下:最好为Node项目单独在根目录下建立一个目录,如/node.js,然后权限设为754,这样可以避免一些权限问题而造成的麻烦!
由于用的是UbuntuServer系统,上面还配置了MongoDB的启动服务,而且在其init.d的脚本中加入了以下的语句:
#Required-Start:$all #Required-Stop:$all
所以在以后自己添加的时候系统会提示错误,所以在Node项目的启动脚本里我加了前面一串的说明注释,以便UbuntuServer系统进行设置,如果在CentOS上,应该不会出现类似的问题,这点要特别注意!
即以下的说明信息:
###BEGININITINFO #Provides:xiyoulib #Required-Start:$all #Required-Stop:$all #Default-Start:2345 #Default-Stop:016 #Short-Description:Startdaemonatboottime #Description:Enableserviceprovidedbydaemon. ###ENDINITINFO
脚本编辑完成后使用chkconfig--list指令查看一下自己添加的服务是否生效,即3和5全部要为on才可以实现开机自启动。
如果3和5没有被置为on,那么请执行chkconfig--level35[你的服务名]on即可,UbuntuServer可能会报一些warning,但是只要能将所需设置的服务的3、5变为on,其他的错误可以忽略(我感觉这是系统自己的事)。
设置完成后即可实现Node项目在Linux上的自启动,可以shutdown-rnow试一下能否自启,启动好以后直接去访问一下你设定的端口号、虚拟目录神马的,如果出来想要的就大功告成了!
但是如果不对,就好好检查一些脚本,然后根据报错进行相关修改,毕竟我也是试出来的嘛!