boa cgi html

來源:互聯網
上載者:User

隨著Internet技術的興起,在嵌入式裝置的管理與互動中,基於Web方式的應用成為目前的主流,這種程式結構也就是大家非常熟悉的B/S結構,即在嵌入式裝置上運行一個支援指令碼或CGI功能的Web伺服器,能夠產生動態網頁面,在使用者端只需要通過Web瀏覽器就可以對嵌入式裝置進行管理和監控,非常方便實用。本節主要介紹這種應用的開發和移植工作。

   使用者首先需要在嵌入式裝置上成功移植支援指令碼或CGI功能的Web伺服器,然後才能進行應用程式的開發。
   
1、嵌入式Web伺服器移植  
   
   由於嵌入式裝置資源一般都比較有限,並且也不需要能同時處理很多使用者的請求,因此不會使用Linux下最常用的如Apache等伺服器,而需要使用一些專門為嵌入式裝置設計的Web伺服器,這些Web伺服器在存貯空間和運行時所佔有的記憶體空間上都會非常適合於嵌入式應用場合。
   典型的嵌入式Web伺服器有Boa (www.boa.org)和thttpd (http://www.acme.com/software/thttpd/)等,它們和Apache等高效能的Web伺服器主要的區別在於它們一般是單進程伺服器,只有在完成一個使用者請求後才能響應另一個使用者的請求,而無法並發響應,但這在嵌入式裝置的應用場合裡已經足夠了。
   
   我們介紹比較常用的Boa伺服器的移植。Boa是一個非常小巧的Web伺服器,可執行代碼只有約60KB。它是一個單任務Web伺服器,只能依次完成使用者的請求,而不會fork出新的進程來處理並發串連請求。但Boa支援CGI,能夠為CGI程式fork出一個進程來執行。Boa的設計目標是速度和安全,在其網站公布的效能測試中,Boa的效能要好於Apache伺服器。
    第一步完成Boa程式的移植。從www.boa.org下載Boa源碼,當前最新版本為0.94.13,將其解壓並進入源碼目錄的src子目錄
    # tar xzf boa-0.94.13.tar.gz
    # cd boa-0.94.13/src
產生Makefile檔案
    # ./configure
    修改Makefile檔案,找到CC=gcc,將其改成CC = arm-linux-gcc,再找到CPP = gcc –E,將其改成CPP = arm-linux-gcc –E,並儲存退出。
    然後運行make進行編譯,得到的可執行程式為boa,將調試資訊剝去,得到的最後程式只有約60KB大小。
    # make
    # arm-linux-strip boa
   第二步完成Boa的配置,使其能夠支援CGI程式的執行。Boa需要在/etc目錄下建立一個boa目錄,裡面放入Boa的主要設定檔boa.conf。在Boa源碼目錄下已有一個樣本boa.conf,可以在其基礎上進行修改,下面解釋一下該檔案的含義:
#監聽的連接埠號碼,預設都是80,一般無需修改
Port 80
# bind調用的IP地址,一般注釋掉,表明綁定到INADDR_ANY,通配於伺服器的所有IP地址
#Listen 192.68.0.5
#作為哪個使用者運行,即它擁有該使用者的許可權,一般都是nobody,需
要 /etc/passwd中有nobody使用者
User nobody
#作為哪個使用者組運行,即它擁有該使用者組的許可權,一般都是nogroup,需要在/etc/group檔案中有nogroup組
Group nogroup
#當伺服器發生問題時發送警示的email地址,目前未用,注釋掉
#ServerAdmin root@localhost
#錯誤記錄檔檔案。如果沒有以/開始,則表示從伺服器的根路徑開始。如果不需要錯誤記錄檔,則用#/dev/null。在下面設定時,注意一定要建立/var/log/boa目錄
ErrorLog /var/log/boa/error_log
#訪問記錄檔。如果沒有以/開始,則表示從伺服器的根路徑開始。如果不需要錯誤記錄檔,則用#/dev/null或直接注釋掉。在下面設定時,注意一定要建立/var/log/boa目錄
#AccessLog /var/log/boa/access_log
#是否使用本地時間。如果沒有注釋掉,則使用本地時間。注釋掉則使用UTC時間
#UseLocaltime
#是否記錄CGI運行資訊,如果沒有注釋掉,則記錄,注釋掉則不記錄
#VerboseCGILogs
#伺服器名字
ServerName www.hyesco.com
#是否啟動虛擬機器主機功能,即裝置可以有多個網路介面,每個介面都可以擁有一個虛擬Web伺服器。一般注釋掉,即不需要啟動
#VirtualHost
#非常重要,HTML文檔的主目錄。如果沒有以/開始,則表示從伺服器的根路徑開始。
DocumentRoot /var/www
#如果收到一個使用者請求的話,在使用者主目錄後再增加的目錄名
UserDir public_html
#HTML目錄索引的檔案名稱,也是沒有使用者只指明訪問目錄時返回的檔案名稱
DirectoryIndex index.html
#當HTML目錄沒有索引檔案時,使用者只指明訪問目錄時,boa會調用該程式產生索引檔案然後返回給使用者,因為該過程比較慢最好不執行,可以注釋掉或者給每個HTML目錄加上DirectoryIndex指明的檔案
#DirectoryMaker /usr/lib/boa/boa_indexer
#如果DirectoryIndex不存在,並且DirectoryMaker被注釋,那麼就用Boa內建的索引產生程式來組建目錄的索引檔案並輸出到下面目錄,該目錄必須是Boa能讀寫
# DirectoryCache /var/spool/boa/dircache
#一個串連所允許的HTTP持續作用請求最大數目,注釋或設為0都將關閉HTTP持續作用
KeepAliveMax 1000
#HTTP持續作用中伺服器在兩次請求之間等待的時間數,以秒為單位,逾時將關閉串連
KeepAliveTimeout 10
#指明mime.types檔案位置。如果沒有以/開始,則表示從伺服器的根路徑開始。可以注釋掉避免使用mime.types檔案,此時需要用AddType在本檔案裡指明
MimeTypes /etc/mime.types
#副檔名沒有或未知的話,使用的預設MIME類型
DefaultType text/plain
#提供CGI程式的PATH環境變數值
CGIPath /bin:/usr/bin:/usr/local/bin
#將副檔名和MIME類型關聯起來,和mime.types檔案作用一樣。如果用mime.types
#檔案,則注釋掉,如果不使用mime.types檔案,則必須使用
#AddType application/x-httpd-cgi cgi
#指明文檔重新導向路徑
#Redirect /bar http://elsewhere/feh/bar
#為路徑加上別名
Alias /doc /usr/doc
#非常重要,指明CGI指令碼的虛擬路徑對應的實際路徑。一般所有的CGI指令碼都要放在實際路徑裡,使用者訪問執行時輸入網站+虛擬路徑+CGI指令碼名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
   使用者可以根據自己需要,對boa.conf進行修改,但必須要保證其他的輔助檔案和設定必須和boa.conf裡的配置相符,不然Boa就不能正常工作。在上面的例子中,我們還需要建立記錄檔所在目錄/var/log/boa,建立HTML文檔的主目錄/var/www,將mime.types檔案拷貝到/etc目錄,建立CGI指令碼所在目錄/var/www/cgi-bin/。mime.types檔案用來指明不同副檔名對應的MIME類型,一般可以直接從Linux主機上拷貝一個,大部分也都是在主機的/etc目錄下。
第三步就是測試Boa能否正常工作,靜態HTML頁面能否正常訪問,CGI指令碼能否正常運行,一般採用NFS方式來進行測試工作,可以將嵌入式目標系統上的/etc目錄拷貝到主機的NFS共用目錄下,然後將NFS共用目錄下的etc目錄重新NFS mount為目標系統上的/etc目錄。這樣就可以在主機上對etc目錄下的各種設定檔,如進行修改而立刻在目標系統上生效。
  假設主機/nfs目錄為共用目錄,在其下面建立一個www子目錄作為Web網站的主目錄,其內容如下:
# ls /nfs/www
cgi-bin  images index.html
   index.html為測試首頁面,images為存放各種圖片的子目錄,cgi-bin為CGI指令碼的存放目錄。根據樣本boa.conf的配置,目前HTML文檔的主目錄為/var/www,CGI指令碼目錄為/var/www/cgi-bin,則運行以下命令將主機的/nfs/www目錄mount成目標板上的/var/www目錄。然後就可以運行boa了:
# mount -t nfs 192.168.0.20:/nfs/www /var/www -o nolock
# boa
在工作站上運行瀏覽器進行測試,在地址欄輸入目標系統IP,即
http://192.168.0.162
,可以看到相關頁面,表示靜態HTML頁面測試通過。
    接下來進行CGI指令碼的測試,我們需要一個測試用的CGI指令碼。可以寫個最簡單的Hello World程式,範例程式碼如下
#include
void main() {
    printf("Content-type: text/html\n\n") ;
    printf("\n") ;
    printf("CGI Output\n") ;
    printf("\n") ;
    printf("Hello, world.\n") ;
    printf("\n") ;
    printf("\n") ;
    exit(0) ;
}
   然後進行交叉編譯,將得到的helloworld.cgi拷貝到主機的/nfs/www/cgi-bin目錄下。
#arm-linux-gcc -o helloworld.cgi helloworld.c
#cp helloworld.cgi /nfs/www/cgi-bin
在瀏覽器地址欄輸入http://192.168.67.16/cgi-bin/helloworld.cgi,可以看到相關頁面,表示CGI指令碼測試通過。
  現在我們已經可以讓Boa在嵌入式目標系統上正常工作了,嵌入式Web伺服器移植成功。在以上的移植過程中,最好設定boa.conf中的錯誤記錄檔檔案ErrorLog,允許Boa記錄錯誤資訊;測試靜態HTML頁面和CGI指令碼時,不管結果如何,最好都查看錯誤記錄檔檔案;CGI指令碼測試很容易發生許可權不夠的錯誤,要保證Boa訪問的主目錄、CGI指令碼目錄以及臨時檔案目錄(如果沒有設定TMP環境變數時,預設是/tmp目錄),都必須能被Boa運行時所代表的使用者完全訪問,該使用者由boa.conf中的User指出。

   目前Web技術中產生動態Web頁面的方法有CGI和伺服器指令碼,如JSP, ASP等,但後者需要Web伺服器具有這些指令碼的運行支援模組。在嵌入式Web伺服器中,考慮到資源限制問題,一般都只提供CGI支援,因此在嵌入式裝置中Web方式應用實際上就是基於CGI的程式開發。
    CGI(Common Gate Intergace)是一段運行在Web伺服器上的程式,提供同用戶端Html頁面的介面。我們看一個實際例子:常見的個人首頁上大都有一個留言本,留言本的工作方式是這樣的:先由使用者輸入一些資訊,如名字之類的東西,接著使用者按一下“留言”(到目前為止工作都在用戶端),瀏覽器就把這些資訊傳送到伺服器的CGI程式中,於是CGI程式在伺服器上按照預定的方法進行處理,在本例中就是把使用者提交的資訊存入指定的檔案中,最後CGI程式給用戶端發回一個“留言結束”字樣的頁面,使用者可以在瀏覽器裡看到。
  在進行CGI編程之前,我們先瞭解HTML的一些知識。CGI可以使用多種程式設計語言來實現,包括C、 C++、Perl等,但在嵌入式裝置的開發中,一般都不會採用Perl等解釋性語言,因為這種語言還需要有解釋執行的支撐模組,會佔用存貯空間和記憶體,最常用的方法當然是用C來編寫,但C並不是很適合開發象CGI這種需要大量進行字串操作的程式,編程比較煩瑣,因此,對於一個專業的開發人員來說,首先想到的應該是有沒有可複用的庫來支援快速高效的開發CGI程式。幸運的是目前就有不少開放源碼的支援CGI開發的 C庫。我們在此只介紹CGIC,有興趣的朋友可以自己在Internet上搜尋其他的C庫。
CGIC庫的移植
   

   CGIC是一個支援CGI開發的開放源碼的標準C庫,可以免費使用,只需要在開發的網站和程式文檔中有個公開聲明即可,表明程式使用了CGIC庫,使用者也可以購買商業授權而無需公開聲明。
    CGIC能夠提供以下功能:
   1  分析資料,並自動校正一些有缺陷的瀏覽器發來的資料;
   2  透明接收用GET或 POST方法發來的From資料;
   3   能接受上傳檔案;
   4   能夠設定和接收cookies;
   5   用一致的方式處理From元素裡的斷行符號;
   6   提供字串,整數,浮點數,單選或多選功能來接收資料;
   7   提供數字欄位的邊界檢查;
   8   能夠將CGI環境變數轉化成C中的非Null 字元串;
   9   提供CGI程式的調試手段,能夠回放CGI程式執行時的CGI狀態;
  總之,CGIC是一個功能比較強大的支援CGI開發的標準C庫,並支援Linux, Unix 和Windows等多作業系統。
  以下描述CGIC的移植過程。
  從CGIC的主要站台http://www.boutell.com/cgic/下載源碼,當前最新版本是2.05版。將其解壓並進入源碼目錄
    # tar xzf cgic205.tar.gz

    # cd cgic205

    修改Makefile檔案,找到CC=gcc,將其改成CC=arm-linux-gcc,找到AR=ar,將其改成AR=arm-linux-ar,找到RANLIB=ranlib,將其改成RANLIB=arm-linux-ranlib。找到gcc cgictest.o -o cgictest.cgi ${LIBS},將其改成$(CC)
$(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},找到gcc capture.o -o capture ${LIBS},將其改成$(CC) $(CFLAGS) capture.o -o capture ${LIBS},並儲存退出。
   然後運行make進行編譯,得到的CGIC庫libcgic.a,我們通過調試輔助程式capture和測試程式cgictest.cgi,來驗證產生CGIC庫的正確性。
   將capture和cgictest.cgi拷貝到主機的/nfs/www/cgi-bin目錄下。
    在工作站的瀏覽器地址欄輸入http://192.168.67.16/cgi-bin/cgictest.cgi,可以看到頁面,表示CGIC庫和測試指令碼都移植成功。cgictest.cgi比較完整的展現了CGIC庫的功能,在開發基於CGIC庫的CGI程式前最好先掌握cgictest.cgi程式,也是使用者開發特定應用程式時的參考範例。

  HTML模板的製作
Web方式的應用開發一般都會將介面和程式邏輯脫離開來,允許在一定程度下更改介面,如改變介面文本的屬性,建立多語言版本等,而無需改動程式邏輯。介面一般由美工來進行製作,而程式員負責具體功能的實現。在 HTML中,表單 (FORM)是最主要的傳遞資訊的手段,它適用於任何瀏覽器。表單中有很多元素,包括輸入文字框,單選框,多選框,按鈕,等等,可以提供資訊的互動。具體對象說明和文法請參見其他HTML書籍,在這裡不作介紹。根據應用需求,美工或其他設計人員將最後的Web頁面設計出來,作為程式員進行開發的模板。

    CGI程式的工作一般就是接收表單資料,進行資料處理,最後根據處理結果產生新的頁面返回給瀏覽器。表單資料一般是以POST方法提交給伺服器,由CGI程式獲得,程式必須要將介面資料和內部資料對應起來才能夠進行下一步的處理。CGI程式從頁面擷取資料就根據元素名字/值中的元素名字來進行區分。但CGI返回頁面就比較麻煩。由於介面在程式開發完成後還有可能會改變,而且有些需要程式處理的地方可能沒有表單元素,因此對程式來說,不能以表單元素名作為區分的基礎,一般方法是採用HTML中的注釋來標記。

    程式員需要在模板中為每一個表單元素以及其他任何需要程式處理的地方,按照一定規則,如注釋的下一行就是表單元素行,建立其注釋標記。CGI程式就可以根據注釋標記來判斷表單元素資訊並進行處理。程式逐行讀模數板檔案,檢查有無注釋標記,如有的話,則下一行需要進行處理,給表單元素賦上資料,最後就可以返回帶資料的頁面給瀏覽器。

    HTML模板還需要關注的是輸入的檢查。根據輸入檢查越早越好的原則,需要在使用者介面上就對使用者提交的資料進行檢查。目前一般是採用javascript指令碼的方式。當使用者提交資料時,表單對象的onSubmit方法就會被調用,在該方法裡就可以對使用者的輸入進行檢查。常用的檢查有是否必需、最大/小長度、是否字元、是否數字、email地址、IP地址是否正確、是否匹配一個Regex等。

CGI程式的開發
    CGI程式的工作一般就是接收表單資料,根據應用需求進行資料處理,最後根據處理結果產生新的頁面返回給瀏覽器。表單資料一般是以POST方法提交給伺服器,由CGI程式獲得,程式根據元素名字/值中的元素名字來區分資料,完成資料處理後,再讀取相應的模板檔案,根據注釋標記將對應的資料填充到HTML文本中去,產生最後的頁面返回給瀏覽器。

    程式一般邏輯為:

    1.  安全性檢查,是否允許運行指令碼;
    2.  處理使用者提交的資料,根據元素名字/值中的元素名字來區分資料,然後根據應用需求進行資料處理;
    3.  將處理結果填充表單,根據注釋標記將對應的資料填充到HTML文本中去,產生最後的頁面返回給瀏覽器。
    關於具體的代碼實現細節,使用者可以參考《嵌入式Linux系統開發詳解-基於EP93XX系列ARM》一書的相關章節。(全文完)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.