Node应用的Systemd启动(转)
作者:?阮一峰
日期:?2016年3月12日
前面的文章介紹了 Systemd 的操作命令和基本用法,今天給出一個實例,如何使用 Systemd 啟動一個 Node 應用。
本文是獨立的,不需要前面的教程作為預備知識。
一、克隆代碼
首先,下載示例庫。
$ git clone https://github.com/ruanyf/node-systemd-demo.git $ cd node-systemd-demo示例腳本server.js非常簡單,就是一個 HTTP 服務器。
var http = require('http'); var hostname = '0.0.0.0'; var port = 5000; http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }).listen(port, hostname, function () { console.log('Server running at http://%s:%s/', hostname, port); });二、修改配置文件
Systemd 啟動上面這個腳本,需要一個配置文件node-server.service。這個文件的文件名可以隨便取,但是后綴名必須是.service。
[Unit] Description=node simple server[Service] ExecStart=[/path/to/node/executable] [path/to/node-systemd-demo]/server.js Restart=always User=[yourUserName] Group=[yourUserGroup] Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=[/path/to/node-systemd-demo] [Install] WantedBy=multi-user.target上面腳本里面,有五個地方出現了四個占位符。
- [/path/to/node/executable]:node可執行文件的絕對路徑
- [path/to/node-systemd-demo]:示例庫的絕對路徑
- [yourUserName]:你的用戶名
- [yourUserGroup]:你的組名
你需要將上面這四個占位符,改成自己電腦的設置。下面是一個已經改好的例子。
[Unit] Description=node simple server[Service] ExecStart=/usr/bin/node /tmp/node-systemd-demo/server.js Restart=always User=nobody Group=nobody Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/tmp/node-systemd-demo [Install] WantedBy=multi-user.target如果你不知道這幾個占位符的值,下面的命令可以幫你找出來。
# node executable path $ which node# your user name $ id -un# your group name $ id -gn三、配置文件的解釋
簡單解釋一下,上面的配置文件的幾個參數。
Unit區塊的Description字段,是服務的簡單描述。
Service區塊的字段含義如下。
- ExecStart:啟動命令
- Restart:如何重啟。always表示如果進程退出,總是重啟
- Environment:環境變量
- WorkingDirectory:工作目錄
Install區塊的WantedBy字段指定,設為開機啟動時,該服務所在的 Target 是multi-user.target。
四、啟動服務
現在將配置文件拷貝到 Systemd 之中。
$ sudo cp node-server.service /etc/systemd/system接著,就啟動服務。
# 重載配置文件 $ sudo systemctl daemon-reload# 啟動服務 $ sudo systemctl start node-server訪問 http://0.0.0.0:5000,應該看到網頁顯示"Hello World"。
五、查看狀態
如果啟動失敗,或者想查看日志,就要執行下面的命令。
# 查看狀態 $ sudo systemctl status node-server# 查看日志 $ sudo journalctl -u node-server # 實時輸出最新日志 $ sudo journalctl --follow -u node-server六、重啟服務和停止服務
# 重啟服務 $ sudo systemctl restart node-server# 停止服務 $ sudo systemctl stop node-server如果想設為開機啟動,就要執行systemctl enable。
$ sudo systemctl enable node-server七、Socket 激活
一般情況下,學到這里,應該就夠用了。如果你還想體驗一下 Systemd 的強大功能,請接著往下讀。
我們知道,HTTP服務器啟動在那里,終究是耗費資源的。那么能不能做到,只有有人訪問時,才啟動服務,否則就關閉?
這在 Systemd 里面叫做"Socket 激活"。開發者可以指定 Socket 監聽的端口,系統根據有沒有收到請求,自動啟動或關閉服務。不難想到,只要前面加一層負載均衡器,這就等同于實現了一個簡單的云服務,即根據訪問量,系統自動擴容或收縮。
下面就是"Socket 激活"的Demo。
八、安裝依賴
首先,請確認前面啟動的 Node 服務已經被關閉了,5000 端口已經釋放出來了。
然后,打開啟動腳本socket-server.js,你會發現多出了兩個模塊:systemd?和?autoquit。
require('systemd'); require('autoquit'); var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }); server.autoQuit({ timeOut: 60 }); server.listen('systemd'); console.log('Server running at http://0.0.0.0:5000/');上面代碼中,systemd模塊用于添加"Socket 激活",autoquit模塊用于指定多少時間無人訪問后,關閉 Node 服務,上面腳本是60秒。另外,還有一個journald模塊,用于向 Systemd 日志添加內容,這個例子中沒有使用。
現在,安裝依賴。
$ npm install九、改寫配置文件
Socket 激活需要兩個配置文件。
一個是node-socket-server.socket。
[Socket] ListenStream=5000[Install] WantedBy=sockets.target另一個是node-socket-server.service。
[Unit] Description=node simple server (socket activation) [Service] ExecStart=[/path/to/node/executable] [path/to/node-systemd-demo]/socket-server.js User=[yourUserName] Group=[yourGroupName] Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=[/path/to/node-systemd-demo]上面這個文件需要改寫占位符。可以看到,由于不是開機啟動,配置文件里面沒有Install區塊;由于不需要重啟,也沒有Restart字段。
改寫后,將它們拷貝到 Systemd。
$ sudo cp node-socket-server.socket /etc/systemd/system $ sudo cp node-socket-server.service /etc/systemd/system十、啟動 Socket 激活
然后,執行下面兩個命令,啟動 Socket 激活。
$ sudo systemctl daemon-reload $ sudo systemctl start node-socket-server.socket這個時候,檢查一下狀態。
$ sudo systemctl status node-socket-server.socket ● node-socket-server.socket Loaded: loaded (/etc/systemd/system/node-socket-server.socket; disabled) Active: active (listening) since 2016-03-10 20:36:41 CST; 7s ago Listen: [::]:5000 (Stream) $ sudo systemctl status node-socket-server.service ● node-socket-server.service - node simple server (socket activation) Loaded: loaded (/etc/systemd/system/node-socket-server.service; disabled) Active: inactive (dead)可以看到,node-socket-server.socket是激活的(active),而node-socket-server.service沒有(inactive)。
這時訪問 http://0.0.0.0:5000 ,會發現網頁可以正常訪問。
然后,再檢查一下狀態。
$ sudo systemctl status node-socket-server.socket ● node-socket-server.socket Loaded: loaded (/etc/systemd/system/node-socket-server.socket; disabled) Active: active (running) since 2016-03-10 20:36:41 CST; 1min 20s ago Listen: [::]:5000 (Stream) $ sudo systemctl status node-socket-server.service ● node-socket-server.service - node simple server (socket activation) Loaded: loaded (/etc/systemd/system/node-socket-server.service; disabled) Active: active (running) since 2016-03-10 20:37:55 CST; 3min 11s ago Main PID: 1084 (node) CGroup: /system.slice/node-socket-server.service └─1084 node /home/ruanyf/project/node-systemd-demo/socket-server.js這時,socket和service都激活了。
十一、停止服務
此時,如果手動停止 HTTP 服務器,Systemd 會發出一個警告。
$ sudo systemctl stop node-socket-server.service Warning: Stopping node-socket-server.service, but it can still be activated by: node-socket-server.socket上面的警告表示,Socket 依然是激活的,因此服務隨時可能被重啟,所以還需要關閉 Socket 激活。
$ sudo systemctl stop node-socket-server.socket十二、參考鏈接
- Ruben Vermeersch,?Deploying Node.js with systemd
- Mike MacCana,?How to deploy your node app on Linux, 2016 edition
?
參考:
http://www.ruanyifeng.com/blog/2016/03/node-systemd-tutorial.html(以上內容鉆子此篇文章)
==>如有問題,請聯系我:easonjim#163.com,或者下方發表評論。<==總結
以上是生活随笔為你收集整理的Node应用的Systemd启动(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ajax+php】动态展示4级单位(省
- 下一篇: 你需要知道的Xcode Debug功能