把Nodejs做成CentOS系统服务并开机启动

CentOS的Daemon机制

systemd守护一个进程的前提条件是它知道它要守护的进程的PID。Linux进程通讯有一个不成文的规则,一个进程告诉另外一进程自己的PID的一个方法是把自己的进程的PID这个数值以文本流写入文件。只写PID,其它的什么都不用写,大家约定俗成,把这样的文件的扩展名约定为pid,文件名没有要求,部署维护的人知道它是什么意思就行。PID文件一般保存到/run目录下。当进程启动的时候要判断这个PID文件是否存在,如果存在就把它删除。如果删除失败进告诉用户此进程无法被守护进程托管。当进程退出的时候要删除此PID文件。

启动Nodejs网站

下面一个示例,Nodejs代替Apache,随Linux系统开机启动,只托管一个网站。新建一个index.htm文件,源代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Daemon Demo</title>
</head>
<body>
<h1 align="center">
    Daemon Demo
</h1>
</body>
</html>

这里引用Koa快速搭建一个静态网站,引用的组件是:Koa和Koa-Serve-Statis。网站只需要一个主程序app.js,它的源代码如下:

var  Koa = require('koa') ;
var serveStatic=require('koa-serve-static');
var fs=require('fs');
var pidPath='/run/daemon-demo.pid';
var fd=fs.openSync(pidPath,'w+');
fs.writeSync(fd,process.pid.toString(),{flag:'w+'});
fs.closeSync(fd);
var app=new Koa();
app.use(serveStatic(__dirname,{}));
app.listen(2201);
fs.unlinkSync(pidPath);

运行:

npm i -save koa koa-serve-static
node app.js

浏览器确认服务启动成功。随后关闭网站,准备让CentOS的守护进程启动服务。

增加一个CentOS系统服务

新建一个名称为daemon-demo.service的文本文件,写入以下代码:

[Unit]
Description=daemon-demo.service
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/run/daemon-demo.pid
ExecStart=/bin/setsid /usr/bin/node /var/www/daemon-demo/app.js
Restart=/bin/pkill node && /bin/setsid /usr/bin/node /var/www/daemon-demo/app.js
ExecStop=/bin/pkill node
ExecReload=
PrivateTmp=true
RemainAfterExit=yes
ExecStartPre=
 
[Install]
WantedBy=multi-user.target

把daemon-demo.service上传到CentOS服务器,把它复制到以下位置:

/usr/lib/systemd/system/

运行命令使服务开机自动启动:
sudo systemctl enable daemon-demo

把网站的源代码上传到CentOS服务器,并保存到以下位置:
/var/www/daemon-demo

SELinux安全设置和防火墙的设置请参照文章: CentOS 7 在SELinux保护下安全打开端口。设置完毕后启动服务:
sudo systemctl start daemon-demo

最终效果


转载时请遵重他人的劳动成果,不要删除作者原文链接。
转载请注明来源:http://blog.csdn.net/caoshiying。谢谢合作。

相关文章

linux下开机自启: 在/etc/init.d目录下新建文件elasticsear...
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以...
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用...
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一...
设置时区(CentOS 7) 先执行命令timedatectl status|grep &...
vim&#160;/etc/sysconfig/network-scripts/ifcfg-eth0 B...