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)