顯示具有 Web技術 標籤的文章。 顯示所有文章
顯示具有 Web技術 標籤的文章。 顯示所有文章

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 的網路參考文章:

2013-10-30

如何在Mac建CA及核發伺服器憑證

想要讓Web伺服器能使用HTTPS通信協定,則Web Server務必需要有伺服器憑證。

可是,我們是「有窮氏」,沒$請具公信力的憑證發放中心(CA)核發。怎麼辦?

好吧!窮則變,變則通,我們就照著以下的這篇文章,在自個的Mac電腦,使用OpenSSL,自個開家CA;自己發伺服器憑證申請(CSR);自己透過自家CA核發伺服器憑證.......

How to create a secure (HTTPS) OS X Web Server 

然後,自己吃自己......

啊!寫得太順,寫多了!     ^^"

在 AWS EC2 雲端主機安裝 MongoDB

學著用MongoDB已好一陣子了,一直沒搞清楚,這到底是「芒果DB」;還是「蒙古DB」?

如果是「蒙古DB」,會讓人聯想到「蒙古大夫」,那......將資料存放在這,會不會有些令人擔憂?!    ^^"

在我的Mac電腦,研習MongoDB一陣子後,具備一些基本的掌握度了。所以,接著也想將MongoDB,安裝在我EC2的雲端主機上,啟動運轉,開始使用。

「如何在 AWS EC2 雲端主機安裝 MongoDB? 」,在網路搜尋先知先覺的PO文,結果,找到如下的這篇,依著指引照著做,一次就搞定。

Installing MongoDB on an EC2 Linux instance

提供給需要的同好做參考,但請注意,這篇的作法僅用於AMI版的Linux;不適用於Ubuntu版。

完成安裝後,應該心情很High;感覺Very good吧?!

但.......,能確定安裝與設定都正確了嗎?那MongoDB Service果真已能正常運作了嗎?

為求確認,以便心安,所以,需要有「作法」能夠驗證。我個人的驗證作法,會針對如下兩項目標進行檢驗:
  1. Service在作業系統中,是否已在執行?
  2. DB的指令,是否能夠操作資料庫?

至於以上兩項的驗證目標,其執行的細節程序如下:

【註】:文字背景標黃色處,表「個人需輸入的指令」;文字前景標紅色之字,表「需要目視檢查驗證的輸出結果」。

驗證Services已在執行

$ service mongod status
/etc/init.d/mongod: line 69: ulimit: open files: cannot modify limit: Operation not permitted
mongod (pid 8645) is running...

驗證可使用DB指令,進行資料操作

$ mongo
MongoDB shell version: 2.4.7
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
     http://docs.mongodb.org/
Questions? Try the support group
     http://groups.google.com/group/mongodb-user
> db.test.save({a:1})
> db.test.find()
{ "_id" : ObjectId("5270748a601825edfa039398"), "a" : 1 }
> exit
bye


2013-10-18

Dev HTTP Client 測試 REST API 的好工具

有在開發符合 REST 規格的 API 嗎?怎麼測試?

有人向你反應,他的程式呼叫你開發的 API (REST) ,所得到的結果有錯/異常收不到結果......,該怎麼診斷,以判斷是否真為你 API 的 Bug ,還是其它的問題導致?

這裡有個好用的 REST Client 工具,只要在 Google Chrome 瀏覽器安裝這個「擴充功能(extensions)」,就能使用。

https://chrome.google.com/webstore/detail/dev-http-client/aejoelaoggembcahagimdiliamlcdmfm

最近在學 Web Client 端的 JavaScript 技術﹣Backbone JS;在 Web Server 端,我用的是 Node.js 。

由於新手上路,當 Backbone 的 Model、Collection 物件,無法自 Server 端正常取得資料,這時我需要釐清,是 Server 端的 Node.js 程式碼有錯?還是 Client 端的 Backbone 程式沒搞對?

有了這個工具的協助,問題的導因很快就快界定,Oh Yeh! ^^y