2013-10-31

如何讓Node Express開發的Web Application可於開機後自動啟動

使用 Node.JS 及 Express 開發的 Web Application,因為底層沒有如 Apache 的 Web Server,所以,基本上,無法滿足「作業系統完成開機後,便自動啟動」的需求。

這下麻煩可大了,我們這個自動啟動的需求,該如何滿足?

還好,在 Linux 的世界,有個名為:「supervisor」的工具軟體。這套軟體的用途為:提供使用者,可對 UNIX-like 作業系統上執行的程式(processes),進行監視及控管。

透過這套工具,能讓我們將開發好的 Web Application,當成作業系統的服務(System Service)來用;而「作業系統的服務」因為可設成開機後自動啟動,所以,以上所述的需求,自然就能滿足了。

以下的安裝、設定程序,系以下列所示之環境為前題,因此,讀者在使用的時候,可能無法照著全抄,得需配合個人的環境,進行調整。
  • Node執行檔安裝之目錄路徑: /usr/bin/local/node 
  • Express Web Application的安裝路徑: /web/todos/app.js 
  • Express Web Log檔存放路徑:/web/logs 

執行程序

(1)安裝supervisor套件。
$ sudo easy_install supervisor

(2)透過指令產生「設定檔」。
$ sudo echo_supervisord_conf > /etc/supervisord.conf

(3)編輯設定檔,加入Node.JS Web App。
$ sudo vim /etc/supervisord.conf
在檔案的最底端,添加如下內容:
[program:myWebApp]
command=/usr/local/bin/node app.js
directory=/web/todos
autostart=true
autorestart=unexpected
startsecs=2
startretries=3
exitcodes=0,2
stdout_logfile=/web/logs/myWebApp.log
  • program之後的名稱:myWebApp非強制性的規範,可由個人自行決定。
  • Express Web的主程式app.js檔,其存放目錄路徑為「/web/todos」,但在「command」欄位,沒有標示出app.js檔案所在目錄路徑;反而標明在「directory」欄位中,這點須請留心。
  • 以上設定檔的「directory」、「stdout_logfile」、「command」欄位,很可能跟讀者的環境不同,請依個人需求自行修改。

(4)在路徑為:「/etc/rc.d/init.d」的目錄下,建立名為「supervisord.sh」的bash指令稿檔案。
$ sudo vim /etc/rc.d/init.d/supervisord.sh
完成編輯後,bash指令稿檔案的內容:
#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord

# Source init functions
. /etc/rc.d/init.d/functions

prog="supervisord"

prefix="/usr/"
exec_prefix="${prefix}"
prog_bin="${exec_prefix}/bin/supervisord"
PIDFILE="/var/run/$prog.pid"

start()
{
  echo -n $"Starting $prog: "
  daemon $prog_bin --pidfile $PIDFILE
  [ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
  echo
}

stop()
{
  echo -n $"Shutting down $prog: "
  [ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
  echo
}

case "$1" in

  start)
    start
    ;;

  stop)
    stop
    ;;

  status)
    status $prog
    ;;

  restart)
    stop
    start
    ;;

  *)
    echo "Usage: $0 {start|stop|restart|status}"
    ;;

esac

(5)設定supervisord.sh,使能開機後,自動執行。

5-1) 變更 supervisord.sh 檔案權限,使其可「執行」。
$ sudo chmod +x /etc/rc.d/init.d/supervisord.sh
5-2) 確認 supervisord.sh 檔案己具備可執行之權限。
$ ls -al /etc/rc.d/init.d/supervisord.sh
-rwxr-xr-x 1 root root 993 2013-10-31 07:38 /etc/rc.d/init.d/supervisord.sh
5-3) 查詢 supervisord.sh 檔案,在「作業系統服務 (System Service)」的「操作環境級別(Run Level)」。不過,以下的指令,最主要的目的,是要透過無法正常執行的結果,來證實 supervisord.sh 尚未完成註冊動作,所以無法查詢其「操作環境級別」,只會獲得錯誤訊息。
$ chkconfig --list supervisord.sh
supervisord.sh 服務支援 chkconfig,但未向任何執行等級註冊(請執行 'chkconfig --add supervisord.sh')
5-4) 將 supervisord.sh 註冊成作業系統的「服務」。
$ sudo chkconfig --add supervisord.sh
5-5) 設定 supervisord.sh 服務的操作環境級別,使之可以在作業系統完成開機後,便能自動啟動。
$ sudo chkconfig supervisord.sh on
5-6) 查詢 supervisord.sh 檔案,在作業系統「服務」中的「操作環境級別」(2,3,4,5)。
$ chkconfig --list supervisord.sh
supervisord.sh 0:關閉 1:關閉 2:開啟 3:開啟 4:開啟 5:開啟 6:關閉
完成以上設定工作後,請重開機。於確定重開機完成後,請找台 Web Client 端的電腦,打開 Web 瀏覽器,輸入網址,確認是否能連上你的 Web Application ,以便驗證此文所述之需求己經達成。

關於 Supervisor 的網路參考文章:

沒有留言:

張貼留言