把Nodejs做成CentOS系統服務並開機啟動
阿新 • • 發佈:2019-02-20
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安全設定和防火牆的設定請參照文章:。設定完畢後啟動服務:
sudo systemctl start daemon-demo