0.前言
因工作需要,本人需求在linux服务器上部署nodejs程序并设置开机自启动,翻阅了很多网络文章,有很多写shell脚本放入启动文件夹,用pm2来间接实现等多种方式的,不过要么经实践发现可行性不高,要么很麻烦,目标是希望用一种较为简洁的方法实现开机启动,后来发现可以将程序配置为系统服务,不但可以实现开机自启动,还能较为简单控制程序启停,也能较为简单地查看控制台输出,故在实践后总结分享,一方面是作为个人记录,另一方面也可以让后来者少踩坑。
本文不再赘述如何在linux系统中安装node并配置为全局可使用,也不再赘述如何创建一个示例nodejs程序。
1.确定程序路径等必要信息
创建系统服务文件需要明确启动程序的指令,以及运行程序的用户,所以需要准备如下信息:执行程序的用户名和用户组,执行程序的指令。
可以用以下指令获取当前用户的用户名和用户组:
//get username in linux
$ id -un
//get usergroup in linux
$ id -gn
如果node已经配置为全局可使用,执行程序的指令为node + 程序入口的js文件绝对路径;如果没有,执行程序的指令为node的安装绝对路径 + 程序入口的js文件绝对路径。本文中,假设node已经配置为全局可使用。
2.创建service文件
创建一个名称为xxxx.service的文件,其中xxxx为程序的标识名字,请确保言简意赅且唯一,以后将作为系统服务的标识符使用。文件内容如下:
[Unit]
Description=sample_server
[Service]
ExecStart=node /home/aoi/program/sample_server/server.js
Restart=always
User=aoi
Group=aoi
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/aoi/program/sample_server
[Install]
WantedBy=multi-user.target
其中Description为程序的简单描述;ExecStart为程序的执行指令,如上一章节所述;Restart为程序如何重启,always表示如果进程退出总是重启;User和Group为用户名和用户组,如上一章节所述;Environment为环境变量;WorkingDirectory为工作目录的绝对路径;WantedBy字段指定,设为开机启动时,该服务所在的Target是multi-user.target。
创建完service文件之后,将文件放置于指定的系统服务文件夹中:
$ sudo cp sample_server.service /etc/systemd/system
3.常见的相关使用指令
程序启动停止相关指令:
// 设置开机自启动
$ sudo systemctl enable sample_server
// 取消开机自启动
$ sudo systemctl disable sample_server
// 启动程序
$ sudo systemctl start sample_server
// 停止程序
$ sudo systemctl stop sample_server
// 重启程序
$ sudo systemctl restart sample_server
查看日志相关指令:
// 查看程序运行的日志
$ journalctl -u sample_server
// 滚动查看程序运行的实时输出
$ journalctl -u sample_server -f
4.结束语
参考内容:
Deploying Node.js with systemd · Ruben Vermeersch (rubenv) (rocketeer.be)