2012年4月5日 星期四

CGI環境架設


前幾天才剛剛將libvisca編譯完成,並且與開發版測試無誤,現在正準備要開發一個可以跨平台的測試介面,以利後續QA方便測試並驗證產品。鑑於監控產業的使用介面都是採用網頁的方式,因此將會建立一個 CGI 開發環境,並利用已撰寫好的C library,實作一個web-based的測試程式。


首先得先複習一下CGI(Common Gateway Interface)的原理?
CGI是一個讓瀏覽器與伺服器端的程式溝通的方法,其作法是將CGII/O導向到HTTP Daemon
l   Input而言,
n   若網頁採用HTTP GET方法,則瀏覽器所輸入的值會放在QUERY_STRING的環境變數中,
n   若網頁採用HTTP POST方法,則輸入值會導向至STDIN,可以使用fread()直接讀取STDIN的值即可。
l   Output而言,可以直接利用fprintf(),按照HTTP定義的格式,輸出字串至STDOUT即可。
這些I/O的處理已經有人幫忙寫好對應的處理函數,如: http://www.boutell.com/cgic/

接著便需要架設CGI 開發環境。
1.      安裝 JDK
2.      下載 apache tomcat,並且解壓縮。
3.      設定環境變數,加入下列環境變數 JAVA_HOME=C:\Program Files\Java\jdk1.7.0_03
4.      測試伺服器
甲、切換至安裝目錄C:\apache-tomcat-7.0.26-windows-x64\apache-tomcat-7.0.26\bin>
乙、啟動伺服器 startup.bat
丙、開啟預設網頁,http://127.0.0.1:8080/
丁、預設網頁對應的檔案為 index.jsp,若可以正常顯示網頁,就表示apache tomcat已經安裝成功,jsp也可以正確解析。
5.    伺服器預設值並不會打開CGI,因此需要更改web.xml,刪除下列設定值的註解,將支援CGI功能的選項打開。
    <servlet>
        <servlet-name>cgi</servlet-name>
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>cgiPathPrefix</param-name>
          <param-value>WEB-INF/cgi</param-value>
        </init-param>
         <load-on-startup>5</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>cgi</servlet-name>
        <url-pattern>/cgi-bin/*</url-pattern>
    </servlet-mapping>

6.      伺服器架設完成後,打開網頁http://127.0.0.1:8080/examples/servlets/,此處有六個基本的 CGI例子(in JAVA)可以先測試看看是否CGI功能可以正常執行。


然後就可以將已開發好的C函數庫,改寫成CGI程式囉。此時又遇到了一些問題,整理如下。
1       參考http://www.boutell.com/cgic/,此處提供了cgic.c,已經將常用的功能都包裝成對應的函數,可以使用此工具,然後自己實作cgiMain()函數,便可以寫出一個C語言的CGI程式。
2       最簡單的方式是直接編譯 cgic.c cgitest.c ,生成一個簡單的CGI程式(cgiTest.exe)。此時直接啟動tomcat,查看localhost.2012-04-05.log中,會發現tomcat發生載入錯誤。更改conf/context.xml,加入” <Context privileged="true">”便可以正常啟動。
3       接著修改web.xml,有兩處需要修改。
3.1    更改executable欄位,以設定用來執行CGI的程式,其預設值為perl,此處我要直接使用.exe,所以留空白即可。
3.2   調整cgidebug level以檢視問題。
<init-param>
<param-name>debug</param-name>
<param-value>100</param-value>
</init-param>
        <init-param>
          <param-name>executable</param-name>
          <param-value></param-value>
        </init-param>
發現此時網頁打印出了錯誤訊息,看來是我將CGI放到錯誤的位置了。
CGI script not found or not specified.

4       調整後的路徑如下:(cgiTest.exe更名為cgiTest.cgi)
檔案位置 \webapps\ROOT\WEB-INF\cgi\cgiTest.cgi

5       接著就可以測試CGI程式了。執行結果摘錄如下:

5.1         http://127.0.0.1:8080/cgi-bin/cgiTest.cgi 所出現的畫面。

5.2         按下submit 後的結果。

註:工作環境
  •    Windows 7 64bit
  •    Microsoft Visual C++ 2008
  •    apache-tomcat-7.0.26-windows-x64



參考資料:
1.      CGI程式入門(原理)
3.      Tomcat 的設定說明