摘 要: 本文對Linux下的Web服務器技術進行了分析,選擇了AppWeb+PHP+Sqlite的組合建立嵌入式Web服務器作為嵌入式設備生成動態的管理接口,并討論嵌入式Web服務器在基于arm-linux平臺上的移植。
關鍵詞: ARM-linux AppWeb+PHP+Sqlite Web服務器
1.引言
用戶需要通過嵌入式設備所提供的管理接口才能對其進行配置、管理和監控,因此管理接口的易用程度和效率成為衡量設備質量的重要標準之一。在嵌入式設備中,加入HTTP服務能將其轉化成Web Server,可以向Internet或內部網提供基于Web的圖形化管理接口,用戶可以使用瀏覽器作為接口來訪問嵌入式設備。這樣不僅能夠使設備的易用性大大提高,而且可以省去專用管理軟件,從而方便地進行統一管理。管理接口如果要收集和反饋用戶信息就需要支持數據庫。目前,Linux系統廣泛采用Apache+PHP+MySQL的組合來構建Web服務器,但Apache與MySQL占用的存儲空間與運行時需要的系統資源很高,不適用于嵌入式設備Web服務器的構建。因此需要選擇對系統資源要求低且功能相當的Appweb與Sqlite分別代替Apache與MySQL。
2.Linux下常見的Web服務器技術分析
2.1 Linux下常見的HTTP服務器技術分析
HTTP服務器目前常見的有:Thttpd、Apache與AppWeb,優缺點分析如下:
Thttpd:是一個簡單、小型、可移植、快速的安全http服務器,還具有其它服務器目前不具有的十分有用的特點(URL-traffic-based throttling),但它不支持PHP。
Apache:具有安全、高效、可擴展及與當前http標準保持同步的特點,并能在現在常用的操作系統如Unix和Windows上運行。但應用程序占很大的存儲空間,運行時需要占用很多系統資源,且移植難度很大,不適用于嵌入式設備。
Appweb:是第一個嵌入式Web服務器,它設計之初就包含安全的思想,具有十分快速、內存使用量小、基于標準的、可移植等特點,特別適用于嵌入式設備,同時支持PHP。
2.2 Linux下常見的數據庫技術分析
基于Linux平臺的數據庫非常多,大型的商用數據庫有Oracle、Sybase、Informix、IBM DB2等,常見的主要有PostgreSQL、MySQL、mSQL、Berkeley DB、SQLite等。
SQLite支持絕大多數標準的SQL語句,采用單文件存放數據庫,速度又比MySQL快上1—2倍,存儲量也不是問題,在操作語句上更類似關系型數據庫的使用,其版權允許無任何限制的應用,包括商業性的產品。由于具有這些優良特性,SQLite已集成至PHP中。
2.3動態網頁語言技術分析
ASP全名Active Server Pages,是一個Web服務器端的開發環境,是Microsoft開發的動態網頁語言,繼承了微軟產品的一貫傳統,只能執行于微軟的服務器產品上。
JSP是Sun公司推出的新一代網站開發語言,JSP可以在Serverlet和JavaBean的支持下,完成功能強大的站點程序,但ARM-Linux一般不支持JVM,即不能支持JSP。
PHP是一種跨平臺的服務器端的嵌入式腳本語言,能在Windows,Unix,Linux的Web服務器上正常執行。它大量地借用C、Java和Perl語言的語法,并耦合PHP自己的特性,使Web開發者能夠快速地寫出動態產生頁面。它支持目前絕大多數數據庫,包括Sqlite、Oracle、Sybase、Postgres、Mysql,等等。PHP是完全免費的,可以獲得源碼。
通過上述分析,我選擇AppWeb+PHP+Sqlite作為嵌入式Web服務器。
3.Appweb+PHP+Qlite在ARM-Linux平臺上的實現
3.1編譯環境的設置
假如交叉編譯工具鏈所在的目錄為/usr/local/armv5b-linux-2.3.3-3.3.2,輸出如下環境變量:
export PATH=$PATH:/usr/local/armv5b-linux-2.3.3-3.3.2/bin
export CC=″armv5b-linux-gcc″ export AR=″armv5b-linux-ar″
export RANLIB=″armv5b-linux-ranlib″ export STRIP=″armv5b-linux-strip″
export CC_FOR_BUILD=″/usr/bin/gcc″ export LD_FOR_BUILD
=″/usr/bin/ld″
3.2獲得源代碼
Appweb、PHP與Sqlite都可以從網上獲取源代碼。
3.3 Appweb+PHP+Sqlite的編譯
編譯程序時建立xxx-build及xxx-install目錄(xxx代表應該程序,分別為Appweb,PHP與Sqlite),build目錄用于編譯。這樣,編譯過程生成的文件單獨保存在此目錄下而不污染源代碼目錄,install目錄用于安裝頭文件、庫文件,以及執行程序等。
3.3.1 Sqlite的編譯
3.3.1.1將Sqlite-2.8.18.tar.gz解壓后將生成Sqlite目錄。
3.3.1.2不同體系結構的Linux,如x86和ARM,會有些差別,需要對sqlite/src/sqliteInt.h做一定的修改,以確保btree(B樹)有正確的變量大小,如“ptr”和“char*”。對于ARM-Linux可以找到如下部分:
# ifndef INTPTR_TYPE
# if SQLITE_PTR_SZ==4
在上面的代碼前加上一句:
# define SQLITE_PTR_SZ 4
這樣后面的“typedef INTPTR_TYPE ptr”就是定義的“int”類型,而不是“long”型。
3.3.1.3使用Configure進行一些配置。修改Sqlite目錄下的Configure使其不去檢查交叉編譯環境,注釋掉相應代碼行即可。
3.3.1.4修改Makefile文件
將代碼行BCC=armv5b-linux-gcc-g-O2改成BCC=gcc-g-O2。另外,ARM-Linux的交叉編譯工具不提供readline與ncures庫,則繼續修改Makefile,修改如下兩行:
READLINE_FLAGS=-DHAVE_READLINE=1-I/usr/include/readline→READLINE_FLAGS=LIBREADLINE=-lncurses→LIBREADLINE=
3.3.2 PHP的編譯過程
3.3.2.1解壓PHP-5.0.4.tar.gz后在當前工作目錄下生成PHP-5.0.4目錄。
3.3.2.2修改PHP-5.0.4目錄下的Configure文件使其不去檢查交叉編譯環境,另外,PHP需要版本不低于2.5.10的Libxml支持,但此版本的Libxml庫文件的大小為1.2M字節,在嵌入式系統中使用如此大的文件不太合理,而Libexpat的大小只有0.2M字節,因此使用Libexpat代替Libxml進行比較簡單的XML分析,詳見如下的配置內容。
3.3.2.3進入到PHP-Build目錄,使用Configure進行配置,配置的內容為:
../PHP-5.0./configure--prefix=../PHP-install--host=armv5b-linux--build=i586-linux
--enable-embed=shared--enable-maintainer-zts--with-sqlite--without-pear
--disable-libxml--disable-dom--disable-simplexml--enable-xml--without-libxml-dir
--with-libexpat-dir=/path/to/expat/install--with-sqlite=/path/to/sqlite/install
3.3.2.4運行make生成PHP執行程序與LibPHP.so動態加載庫。并運行make install安裝頭文件、庫文件、執行程序,以及man文件到PHP-Install目錄下。
3.3.3 Appweb的編譯
3.3.3.1解壓AppWeb-src-2.0.4-1.tar.gz后在當前工作目錄下生成AppWeb-2.0.4目錄。
3.3.3.2進入到AppWeb-build目錄,使用Configure進行配置,配置的內容為
../appWeb-2.0.4/configure--prefix/usr/local/appWeb--sbinDir=/usr/local/appWeb
--type=RELEASE--host=arm-linux--enable-access-log--enable-assert
--enable-config-parse--enable-log--with-PHP5=loadable--with-PHP5-libs=″PHP5 crypt
resolv z″--with-PHP5-dir=/path/to/PHP/install--with-PHP5-flags=″-I$(BLD_TOP)/$(BLD_PHP5_DIR)-I$(BLD_TOP)/$(BLD_PHP5_DIR)/main-I$(BLD_TOP)/$(BLD_PHP5_DIR)/Zend-I$(BLD_TOP)/$(BLD_PHP5_DIR)/TSRM″
3.3.3.3運行make生成AppWeb執行程序,并運行make install安裝執行程序及配置的各組件庫,如libauthModule.so等。
4.在ARM-Linux平臺上運行Web服務器
修改AppWeb文件中ServerRoot與DocumentRoot指令,ServerRoot表示AppWeb各模塊存放目錄(/usr/local/appWeb),DocumentRoot主服務器文檔存放目錄。將各文檔存放到DocumentRoot指向的目錄。在/etc/rc.d/init.d目錄下建立運行服務器的腳本AppWeb,運行service AppWeb start即可。
參考文獻:
[1]魏忠,蔡勇,雷紅衛.嵌入式開發詳解.北京:電子工業出版社,2003.
[2]李善平,劉文峰,王煥龍等.Linux與嵌入式系統.北京:清華大學出版社,2003.
[3]Karim Yaghmour.Building Embedded Linux Systems.O’ReillyPublisher,2003.
[4]Matthias Kalle Dalheimer.Running Linux(4th Edition).O’ReillyPublisher,2004.
[5]Michael Owens.Embedding an SQL Database with SQLite.Linux Journal,2003,(6).