嵌入式Linux上通過boa服務器實現cgi/html的web上網【轉】
轉自:http://blog.csdn.net/tianmohust/article/details/6595996
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
嵌入式Linux上通過boa服務器實現cgi/html的web上網簡介:
第一步 Boa程序的移植
1.下載Boa源碼
2、生成Makefile文件
3、修改Makefile文件
4、編譯
第二步 Boa的配置
第三步boa的執行
1.將根文系統ramdisk在電腦主機上mount &nda
嵌入式linux上通過boa服務器實現cgi/html的web上網簡介:
第一步 Boa程序的移植
1.下載Boa源碼
2、生成Makefile文件
3、修改Makefile文件
4、編譯
第二步 Boa的配置
第三步boa的執行
1.將根文系統ramdisk在電腦主機上mount –o loop ramdisk 目標目錄進行展開
2.測試操作
3.將ramdisk文件重新打包壓縮下載到嵌入式板子上
4.CGI腳本測試
簡介
隨著Internet技術的興起,在嵌入式設備的管理與交互中,基於Web方式的應用成為目 前的主流,這種程序結構也就是大家非常熟悉的B/S結構,即在嵌入式設備上運行一個支持腳本或CGI功能的Web服務器,能夠生成動態頁面,在用戶端只需 要通過Web瀏覽器就可以對嵌入式設備進行管理和監控,非常方便實用。本節主要介紹這種應用的開發和移植工作。
嵌入式Web服務器移植 由於嵌入式設備資源一般都比較有限,並且也不需要能同時處理很多用戶的請求,因此不會使用Linux下最常用的如Apache 等服務器,而需要使用一些專門為嵌入式設備設計的Web服務器,這些Web服務器在存貯空間和運行時所占有的內存空間上都會非常適合於嵌入式應用場合。
典型的嵌入式Web服務器有Boa (http://www.boa.org/)和thttpd (http://www.acme.com/software/thttpd/)等,它們和Apache等高性能的Web服務器主要的區別在於它們一般是單進程服務器,只有在完成一個用戶請求後才能響應另一個用戶的請求,而無法並發響應,但這在嵌入式設備的應用場合裏已經足夠了。
Boa是一個非常小巧的Web服務器,可執行代碼只有約60KB。它是一個單任務Web服務 器,只能依次完成用戶的請求,而不會fork出新的進程來處理並發連接請求。但Boa支持CGI,能夠為CGI程序fork出一個進程來執行。Boa的設 計目標是速度和安全,在其站點公布的性能測試中,Boa的性能要好於Apache服務器。
說明:下面的移植和操作是在at91rm9200芯片linux2.4.27上進行的。
第一步 Boa程序的移植
這一步的工作在電腦主機上完成。
對於uClinux-dist而言,就是make menuconfig在應用程序選單中,在network application下面選擇boa,然後到uClinux-dist目錄下執行make編譯即可。
對於有MMU的平臺,如armlinux和ppclinux,都是到網上下載一個boa的 tar包,隨便找個主流的可用的版本即可,不要最新的也不要最舊的。下載到RedHat宿主機上後,解壓到任意目錄,然後修改boa/src /Makefile裏面的編譯器,就只要加入兩三行即可,如下幾步操作:
1.下載Boa源碼
下載地址: http://www.boa.org/, 或者http://sourceforge.net/
最新發行版本: 0.94.13
下載 boa-0.94.13.tar.gz,註意:從boa上下載的是boa-0.94.13.tar.tar,解壓方式一樣
解壓:# tar xzf boa-0.94.13.tar.gz
2、生成Makefile文件
boa-0.94.13.tar.gz解壓後生成boa-0.94.13目錄,直接運行./電腦主機目錄/boa-0.94.13/src/configure文件
3、修改Makefile文件
a、 修改 CC = gcc
為 CC = /usr/local/arm/2.95.3/bin/arm-linux-gcc (根據自己電腦主機的編譯器位置定)
b、 修改 CPP = gcc - E
為 CPP = /usr/local/arm/2.95.3/bin/arm-linux-gcc -E
註意:boa-0.94.13用3.3.2和3.4.1編譯器編譯不通過。沒有具體研究。
4、編譯
進入:/電腦主機目錄/boa-0.94.13/src目錄
# make
# /usr/local/arm/2.95.3/bin/arm-linux-strip boa (這是為了進行去除boa中生成的編譯信息,讓文件變小)
第二步 Boa的配置
這一步的工作也在電腦主機上完成。
在電腦主機上的Boa源碼boa-0.94.13目錄下已有一個示例boa.conf,可以在其基礎上進行修改。如下:
1、Group的修改
修改 Group nogroup
為 Group 0
由於在/etc/group文件中沒有nogroup組,所以設成0。另外在/etc/passwd中有nobody用戶,所以User nobody不用修改。
2、ScriptAlias的修改
修改 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
為 ScriptAlias /cgi-bin/ /var/www/cgi-bin/
3、ServerName的設置
修改 ServerName www.linuxidc.com
為 ServerName www.linuxidc.com
註意:該項默認為未打開,執行Boa會異常退出,提示“gethostbyname::No such file or directory”,所以必須打開。其它默認設置即可。
註釋: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 [email protected]
#錯誤日誌文件。如果沒有以/開始,則表示從服務器的根路徑開始。如果不需要錯誤日誌,
則用#/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 http://www.linuxidc.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的執行
這一步的工作也在電腦主機上完成。但是操作到的目錄跟嵌入式板子上的目錄有關。
1.將根文系統ramdisk在電腦主機上mount –o loop ramdisk 目標 目錄進行展開
進入展開後ramdisk的根文件夾,然後執行下面:
# mkdir /var/log
# mkdir /var/log/boa(創建日誌文件目錄)
# mkdir /var/www (創建HTML文檔的主目錄)
# mkdir /etc/boa
將第二步中修改過的boa.conf文件從電腦主機上別的目錄拷貝到ramdsik的相關目錄下
# cp /電腦主機目錄/ boa-0.94.13/boa.conf /etc/boa/
將mime.types文件復制到嵌入式板子ramdsik的/etc目錄下,通常mime.types可以從linux電腦主機的 /etc目錄下直接復制即可。
# cp / etc/mime.type /etc/
上面第一步驟中編譯生成的boa可執行文件,將其復制到展開後ramdsik的bin目錄裏面。
# cp /電腦主機目錄/ boa-0.94.13/src/boa /bin/
2.測試操作
可以將主機 /usr/share/doc/HTML/目錄下的index.html(這個是靜態的html網頁顯示文件,是RedHat9的歡迎主頁,當在局域網的 PC的IE上輸入http://嵌入式板子的IP地址時會顯示這個默認的靜態網頁)文件和img目錄復制到嵌入式ramdsik的/var/www目錄下
# cp /usr/share/doc/HTML/index.html /var/www/
# cp /usr/share/doc/HTML/img /var/www/
# cp /usr/share/doc/HTML/index-ZH_CH.html /var/www/
3.將ramdisk文件重新打包壓縮下載到嵌入式板子上。
Ramdisk重新大包壓縮下載到板子上後,在板子的超級終端的根目錄下輸入./boa,看boa是否可以執行。
可能提示錯誤如:libso.0.6 GLIB2.2版本問題,這個一般是boa執行時需要動態共享庫,解決的辦法是,在編譯boa的時候用靜態的方式進行編譯,即
進入:/電腦主機目錄/boa-0.94.13/src目錄下,修改makefile文件中:
LDFLAGS = -g
修改為:LDFLAGS = -static 就可以了。
執行boa時,可能出現其他的錯誤,則可以在開發板的/var/log/boa/error_log文件中找原因。大部分是跟boa.conf配置文件的正確與否有關。如:
問題:在執行./boa時出現錯誤:boa執行時,出錯 log.c:73 unable to dup2 the error log:bad file descriptor
解決方法:在log.c裏註釋掉那個if語句。
又出現了另個問題:unable to dup2 the error log: Bad file descriptor
解決方法:在boa.conf裏註釋掉#AccessLog /var/log/boa/access_log
4.CGI腳本測試
書寫下面的test.c測試程序,
#include
#include
int main(void)
{
printf("Contenttype:text/html ");
printf(" ");
printf(" ");
printf("
");
printf("
This is an HTML page generated from with in a CGI program..
");
printf("
--------------------------------------------------------------------------------
");
printf(" Go back to out put.html page ");
printf(" ");
printf(" ");
fflush(stdout);
}
交叉編譯生成test.cgi
# /usr/local/arm/2.95.3/bin/arm-linux-gcc -o test.cgi test.c
將test.cgi拷貝至嵌入式板子的/var/www/cgi-bin/下,當在局域網PC的IE上輸入 http:// 嵌入式板子的IP地址/cgi-bin/test.cgi
可以顯示出test.cgi的網頁。
有關CGI的知識可以學習:用C語言實現CGI相關資料。
註意:上面代碼執行時,可能會出現錯誤提示:
502 Bad Gateway
The CGI was not CGI/1.1 compliant.
可能出現的原因:
1.測試下看是否能瀏覽靜態網頁,以保證網絡是正確的。
在上面“第三步的 2.測試操作”後局域網的PC的IE上輸入http://嵌入式板子的IP地址,如果能顯示RedHat9的歡迎主頁,說明靜態訪問是正確的了。
2.將.cgi文件拷貝至目標板上後,必須改變其權限
chmod 755 test.cgi
否則,上位機瀏覽時會提示上面錯誤
3.最有可能是CGI程序本身的問題。
我們已經看到test.c的打印開頭有使用MIME頭信息″Content type :text/html ″來表示輸出HTML源代碼給Web服務器。請註意任何MIME頭信息後必須有一個空行,就是加了 ,
所以這點必須保證。
4.Test.c的原文件是在文本模式下編輯的,在linux下不能執行
可以改動:dos2unix test.c 改動後再進行編譯
5.還有一種可能,test.cgi被編譯成了動態形式,然而程序執行時在嵌入式中找不到動態庫文件,所以在編譯程序時加上-static,編譯成靜態的形式,但是這樣編譯出來的文件很大,在嵌入式中不適宜采用這種方式。
嵌入式Linux上通過boa服務器實現cgi/html的web上網【轉】