2012
Aug
09

前幾篇文章,有介紹過如何使用 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 的目錄。

  1. LoadModule cgi_module modules/mod_cgi.so
  2. <Directory /home/demo>
  3. order allow,deny
  4. allow from all
  5. Options +ExecCGI
  6. AddHandler cgi-script .sjs
  7. </Directory>
  8.  
  9. <VirtualHost *:80>
  10. ServerAdmin [email protected]
  11. DocumentRoot "/home/demo"
  12. ServerName demo.pt
  13. LogFormat "%a %t %V \"%r\" \"%{Referer}i\" %f %s > %b" mylog
  14. ErrorLog "/home/demo/logs/demo-error"
  15. CustomLog "/home/demo/logs/demo-access" mylog
  16. SetEnv NODE_PATH /home/conf/nodejs_extension/
  17. </VirtualHost>
  18.  

建立一個檔案 index.sjs ,內容如下:

第一行為 Node.js 的執行檔

  1. #!/usr/local/bin/node
  2. console.log("Content-type: text/html\n\n");
  3. console.log("<h1>Hello World!</h1>");
  4.  

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)