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