前幾篇文章,有介紹過如何使用 v8cgi(Teajs) 搭配 Apache 一起使用,最近覺得 Teajs 的使用人數實在是太少了,而且又沒有特點,寫起來會越來越像 PHP ,本來想要整合 Teajs 與 Node.js 這兩個相似的程式語言,希望可以同樣的程式碼,用這兩種方式執行,但終究是失敗了,想一想還是自已來串接 Node.js 與 Apache。
Apache 要將 Request 傳給 Node.js來處理的方式不只一種,『Apache Node.js Module』 就是一種,當然要先有強者去寫出這個 Module 來給我們用才行,目前只有 v8cgi 有做 Apache 的 Module,這種方式就像是 Apache PHP Module 一樣,所有的 Get , Post , Cookie, File 等等的資料,都會在 Apache Module 中處理完成, 而 PHP 工程師只要會用 $_GET, $_FILES ,就可以很簡單的寫程式啦。
網路上常見的方式,還有使用 Apache Proxy 去導網址,將 Apache 接到的網址,導到 Node.js 執行的網址 (如 Http://www.page.com/index -> Http://nodejs.com/index)。
這裡我介紹的是使用 Apache CGI Module 的方式來串接 Node.js ,透過 CGI 的方式,Apache 可以直接呼叫 Node.js 執行,並將內容回傳給 Browser。
Apache CGI Module 設定
為了讓 Apache 能夠執行 cgi 程式,我們首先要修改 apache conf ,增加以下的設定。
一開始我們要先載入 Apache CGI Module , Module 的檔名是 「mod_cgi.so」
接著要設定 AddHandler cgi-script .sjs ,指定副檔名為 sjs 的檔案,使用 cgi 來處理。
SetEnv NODE_PATH [path] : 在 apahce conf 中可以設定 NODE_PATH ,指定 程式在 require 時,預設尋找 Module 的目錄。
- LoadModule cgi_module modules/mod_cgi.so
- <Directory /home/demo>
- order allow,deny
- allow from all
- Options +ExecCGI
- AddHandler cgi-script .sjs
- </Directory>
- <VirtualHost *:80>
- ServerAdmin [email protected]
- DocumentRoot "/home/demo"
- ServerName demo.pt
- LogFormat "%a %t %V \"%r\" \"%{Referer}i\" %f %s > %b" mylog
- ErrorLog "/home/demo/logs/demo-error"
- CustomLog "/home/demo/logs/demo-access" mylog
- SetEnv NODE_PATH /home/conf/nodejs_extension/
- </VirtualHost>
建立一個檔案 index.sjs ,內容如下:
第一行為 Node.js 的執行檔
- #!/usr/local/bin/node
- console.log("Content-type: text/html\n\n");
- console.log("<h1>Hello World!</h1>");
Restart Apahce 後,這樣就完工囉,你可以用執行「node index.sjs」 ,也可以透過 Browser ,使用連結 「http://demo.pt/index.sjs」, Browser 會收到 「Hello World!」的 Response。
第二行的 「Content-type」,是要回傳 header 給 Browser ,告訴 Browser 伺服器將會回傳一個 Html File ,而第三行回傳的就是 Html 的內容囉。
使用 CGI 的方式, header 都要自行處理,如 傳參數,傳 cookie 等等,所以最好先研究 Http Protocol 。
下一篇文章 Http Protocol Header 的處理。
回應 (Leave a comment)