朱 錦,雷娟娟,陳福才
(國家數字交換系統工程技術研究中心 河南 鄭州450000)
基于CGI的嵌入式W eb服務器的設計與實現
朱 錦,雷娟娟,陳福才
(國家數字交換系統工程技術研究中心 河南 鄭州450000)
為了在資源有限的嵌入式設備上能夠有效地實現動態Web,本文比較了幾種Web服務器的優缺點,選擇了性能優異的Boa作為嵌入式Web服務器,闡述了CGI技術的相關原理以及SQLite數據庫的定義。本文所設計的查詢數據系統以嵌入式Linux操作系統為軟件平臺,以PowerPC8548為硬件平臺,利用HTML表單和CGI技術完成了對后端數據庫SQLite的數據信息查詢,實現Web客戶端與Web服務器的動態交互。
嵌入式Web服務器;Boa;CGI;SQLite
隨著計算機網絡技術的發展和嵌入式Web應用越來越廣泛,需要接入Internet網的信息化產品越來越多。在嵌入式系統中可以通過Web頁面進行遠程訪問和控制,查看或修改遠程設備的數據信息。為了滿足嵌入式設備接入互聯網的需求以及實現嵌入式Web服務器與Web頁面的動態交互[1],很多系統引入了CGI技術[2]。
CGI是實現動態Web的基礎。文中對嵌入式Web服務器Boa以及CGI技術的相關原理進行了研究,利用CGI技術實現Boa服務器和Web頁面的動態交互,實驗結果成功證明了其可行性。
嵌入式Web服務器(Embedded Web Server,EWS)指的是在現場測試和控制設備中嵌入的Web服務器。EWS是以TCP/IP協議棧為基礎進行設計的,在此基礎上要構建HTTP、TCP以及UDP等協議。由于嵌入式設備的處理器能力有限,存儲容量也小得多,傳統的Web服務器很難運行在嵌入式設備上,必須考慮使用體積更小、功能相對簡單、消耗資源更少的簡單Web服務器來解決這一問題,嵌入式Web服務器便應運而生。
衡量嵌入式Web服務器的性能取決于以下幾個方面[3]:1)可移植性,即能方便地在多種目標平臺上進行移植;2)可裁減性,使用戶可以根據實際需求,裁減掉那些冗余的功能,降低嵌入式Web服務器對資源的需求;3)可交互性,即服務器與目標系統間的交互性越好,說明它的使用越方便,對目標系統的控制越靈活。
常見的嵌入式Web服務器有httpd、apache、goAhead和Boa等。httpd是最簡單的一種Web服務器,它的功能最弱,不支持認證,不支持CGI,僅能提供一些靜態頁面;apache是重量級服務器,成熟穩定,但體積較大,適合復雜的嵌入式應用,在高負載的情況下,沒有單進程的服務器性能高;goAhead和Boa都支持CGI,但是goAhead是個比較專用的Web服務器,大部分功能都在服務它自己提供的goform功能和ASP功能,而Boa是一個非常小巧且高效的嵌入式服務器,開放源代碼,可執行代碼大約只有60 kB,它運行在Linux或Unix下,支持CGI和HTTP,響應請求的速度快,最多可以同時響應50個請求。Boa的設計目標是速度和安全,非常適合于嵌入式系統。為了實現動態Web技術,本文也正是采用了Boa。
2.1CGI工作原理
用戶通過Web瀏覽器進行URL訪問,形成的HTTP請求通過瀏覽器發送到Web服務器,Web服務器守護進程接收到該請求后會創建一個CGI的子進程,該子進程將CGI請求的有關數據設置成環境變量,然后根據鏈接啟動指定的CGI處理程序從環境變量中讀取數據,經過處理后,最后使用STDOUT輸出HTML形式的結果文件,經Web服務器送回瀏覽器顯示給用戶。
2.2CGI的傳送數據方式
CGI傳送方式[4]是使用HTML表單向Web服務器發送信息。基本語法如下:
其中method屬性定義了程序如何將數據傳送到Web服務器,傳送方式有兩種:
1)GET方法
使用GET方法時,表單數據會附加在所指向CGI腳本的URL后一起發送給Web服務器,Web服務器將收到的表單數據賦予環境變量QUERY-STRING,CGI程序將以字符串的形式從環境變量QUERY_STRING中獲取數據。
2)POST方法
POST方法通過使用標準輸入(STDIN)將表單數據傳送給Web服務器。將數據的長度存放在環境變量CONTENT_ LENGTH中,CGI程序先從CONTENT_LENGTH中讀出數據的長度,然后再從標準輸入STDIN中獲取數據。
2.3CGI環境變量
CGI環境變量[5]是CGI的重要內容,所有的信息都是通過環境變量和CGI聯系,服務器與CGI程序交換信息的工作方式也是通過環境變量來實現的。當通過瀏覽器訪問Web服務器時,利用環境變量來保存所發出的請求,CGI程序再訪問這些環境變量,換句話說,環境變量是Web服務器和CGI腳本進行數據傳遞的橋梁。
2.4CGI的調用方法
在Web網頁中調用CGI程序有兩種方法[5]:表單(FORM)和超鏈接(URL)。
1)表單(FORM)調用方法
當Web頁面以表單的方式向Web服務器提交數據時,把CGI程序存放的相對路徑放在