文章目錄
- 1. GoAhead Web伺服器介紹
- 2. 擷取Goahead源碼包
- 3. goAhead源碼結構
- 4. goAhead內建協助文檔
- 5. GoAhead Web伺服器移植到arm-linux步驟
- 6. 參考資料
本文內容概要:詳細描述了移植goAhead 2.5到S3C2440的linux系統的過程、步驟、遇到的問題及其解決方案。
開發環境:
宿 主 機:window XP;
虛 擬 機:ubuntu9.10;
交叉編譯器:arm-uclibc-gcc(arm-linux-gcc-4.3.2可以順利編譯通過)
———————————————————————————————————————————————————————————————————
1. GoAhead Web伺服器介紹
goAhead Web伺服器,小巧、精緻,提供了值得稱道的效能,特別適合於嵌入式系統,因此,在很多嵌入式產品如路由器中都用到了goAhead作為嵌入式web伺服器。
goAhead Web伺服器,具有如下特點:
- 支援ASP;
- 嵌入式的JavaScript,即Ejscript;
- 支援記憶體中的CGI處理;
- 快速響應,每秒中可處理超過65個請求;
- 符合HTTP1.0/HTTP1.1標準;
- 擁有眾多擴充API,方便使用者開發;
- 支援SSL3.0(Secure Sockets Layer),如MatrixSSL(最新版本為:MatrixSSL 3-2);
- 支援使用者群組管理;
- 支援DAA訪問認證;
- 佔用很小記憶體,如果不包含SSL,僅要求60K記憶體;包含SSL,要求500K記憶體;
- Web頁面可存在於ROM或檔案系統中;
- 支援多種作業系統,如linux、wince、vxworks等等;
當前最新版本為:WebServer 2.5,本次移植即是這個版本。
2. 擷取Goahead源碼包
地址為:http://www.goahead.com/products/webserver/Download.aspx,當前最新版本為:WebServer 2.5
註:當前下載源碼包,需要填寫一些設定檔才能下載。
下載後,解壓壓縮包:
#tar -xzvf webs-2-5.tar.gz
#cd webs-2-5/
3. goAhead源碼結構
進入goAhead的源碼目錄webs-2-5/,很容易瞭解其源碼結構。
webs-2-5/
| 各種OS移植子目錄,分別有:CE、ECOS、LINUX、LYNX、MACOSX、NW、QNX4、VXWORKS、WIN
| utils:當前只有webcomp.c,即網頁編譯器
| www:存放web網頁
| wwwdemo:goAhead帶的demo網頁,裡麵包含了goAhead的一些文檔
| goAhead伺服器來源程式檔案(C程式檔案)
從上面可以看到,goAhead支援window系統的,有興趣的可以在PC機上移植試試。
得到源碼後,建議用source insight等工具建一個goAhead工程,便於代碼的閱讀或者查詢API函數等。
4. goAhead內建協助文檔
進入goAhead的wwwdemo目錄,找到Webs25GettingStarted.pdf檔案,這就是goAhead帶的協助文檔,移植前,建議先看下。
5. GoAhead Web伺服器移植到arm-linux步驟
在擷取源碼包並解壓後,現在把goAhead移植到arm-linux中,arm指S3C2440,linux-2.6.30.4。
移植步驟很簡單,基本上在編譯階段不會出現什麼問題,而且這幾個步驟在網上諸多部落格中都有說明。但在測試伺服器的時候,遇到了問題,在瀏覽器死活都打不開網頁,不過,最終還是解決了,請看下面說明。
5.1 修改Makefile檔案
進入goAhead源碼下的LINUX目錄,用UE開啟Makefile檔案。
Makefile檔案預設是虛擬機器的本身的GCC編譯器,因此,指定其交叉編譯器,注意,交叉編譯器的版本應與你的檔案系統用的交叉編譯器一致。
在Makefile檔案開頭添加如下資訊:
view plain
- CROSS_COMPILE =/usr/local/arm-uclibc/bin/arm-uclibc-
- AS = $(CROSS_COMPILE)as
- LD = $(CROSS_COMPILE)ld
- CC = $(CROSS_COMPILE)gcc
- CPP = $(CC) -E
- AR = $(CROSS_COMPILE)ar
- NM = $(CROSS_COMPILE)nm
- STRIP = $(CROSS_COMPILE)strip
- OBJCOPY = $(CROSS_COMPILE)objcopy
- OBJDUMP = $(CROSS_COMPILE)objdump
同時把Makefile中的語句:
view plain
- matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)
屏蔽掉。這一句是用來啟動SSL matrixssl的,具體參考Webs25GettingStarted.pdf文檔中的說明(Page8)。
5.2 修改LINUX/main.c檔案:initWebs()函數中指定IP地址
由於LINUX/main.c檔案:initWebs()函數中原程式無法正確獲得伺服器IP;因此置伺服器一個靜態IP地址。
修改如下:
view plain
- /*
- * Define the local Ip address, host name, default home page and the
- * root web directory.
- */
- /* del by gyr 2011.09.17
- if (gethostname(host, sizeof(host)) < 0) {
- error(E_L, E_LOG, T("Can't get hostname"));
- printf("initWebs::Can't get hostname.\n"); // added by gyr 2011.09.17
- return -1;
- }
- if ((hp = gethostbyname(host)) == NULL) {
- error(E_L, E_LOG, T("Can't get host address"));
- printf("initWebs::Can't get hostname...\n"); // added by gyr 2011.09.17
- return -1;
- }
- memcpy((char *) &intaddr, (char *) hp->h_addr_list[0],
- (size_t) hp->h_length);
- */
- intaddr.s_addr = inet_addr(T("192.168.1.168")); // added by gyr 2011.09.17
5.3 編譯:make clean;make
在shell中進入LINUX目錄下,執行命令make clean;make即可編譯通過。
編譯通過後,在LINUX目錄下,得到兩檔案,分別為:libwebs.a和webs可執行檔。用如下命令查看webs執行檔案依賴的庫檔案:
view plain
- /usr/local/arm-uclibc/bin/arm-uclibc-readelf -d webs
其中,arm-uclibc-依你用的交叉編譯器而定。
得到如下資訊:
view plain
- Dynamic segment at offset 0xf638 contains 18 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [libfloat.so.1]
- 0x00000001 (NEEDED) Shared library: [libc.so.0]
- 0x0000000c (INIT) 0x8e2c
- 0x0000000d (FINI) 0x15aa0
- 0x00000004 (HASH) 0x8130
- 0x00000005 (STRTAB) 0x8924
- 0x00000006 (SYMTAB) 0x83a4
- 0x0000000a (STRSZ) 712 (bytes)
- 0x0000000b (SYMENT) 16 (bytes)
- 0x00000015 (DEBUG) 0x0
- 0x00000003 (PLTGOT) 0x1f704
- 0x00000002 (PLTRELSZ) 552 (bytes)
- 0x00000014 (PLTREL) REL
- 0x00000017 (JMPREL) 0x8c04
- 0x00000011 (REL) 0x8bec
- 0x00000012 (RELSZ) 24 (bytes)
- 0x00000013 (RELENT) 8 (bytes)
- 0x00000000 (NULL) 0x0
從上面可看到,webs依賴libc.so.0和libfloat.so.1兩動態檔案,查看檔案系統中lib目錄下是否包含了這兩動態檔案,如果沒有,則需從交叉編譯器安裝路徑中擷取這兩個動態庫檔案到檔案系統lib目錄中。
5.4 測試webs伺服器
用FTP把webs執行檔案傳到目標板中,本人把其放到了/mnt/webs/目錄中。
需要注意的是,在goAhead2.5版本中,web網頁的根目錄是在webs程式的../www或../wwwdemo(webs執行時帶 -demo參數)中,這一點可查看LINUX/main.c檔案中190行處代碼和注釋。因此,把goAhead源碼目錄下的www和wwwdemo兩文 件夾傳用FTP傳到/mnt/目錄下。
在PC機用IE瀏覽器瀏覽goAhead伺服器的網頁,輸入http://192.168.1.168:8080/
192.168.1.168是目標板的IP地址即goAhead伺服器的地址,8080是goAhead用的連接埠號碼,這是預設的連接埠號碼,定義在webs.h檔案。
5.4.1 測試問題
用瀏覽器死活不管怎樣,都打不開home.htm網頁的,提示是404錯誤,意思是:
Access Error: Site or Page Not Found
Cannot open URL
5.4.2 不能開啟網頁的原因和解決方案
折騰許久,決定從原始碼著手。最後定位在default.c檔案中websDefaultHandler()函數中,這個函數是處理預設網頁的。
具體程式碼片段如下:
view plain
- /*
- * We do whitelist validation in addition to standard URL validation.
- * The whitelist should really catch anything invalid first.
- * If the whitelist check fails, rebuild the list and try again.
- * Also validate if we are not on a secure connection, but the whitelist
- * entry has the SSL flag set, do not serve the page.
- */
- #ifdef WEBS_WHITELIST_SUPPORT
- if ((rc = websWhitelistCheck(wp->url)) < 0) {
- websBuildWhitelist();
- if ((rc = websWhitelistCheck(wp->url)) < 0) {
- websError(wp, 404, T("Cannot open URL"));
- return 1;
- }
- }
- if (!(flags & WEBS_SECURE) && (rc & WHITELIST_SSL)) {
- websError(wp, 500, T("HTTPS access required"));
- return 1;
- }
- #endif /* WEBS_WHITELIST_SUPPORT */
問題就出現在上面這個代碼中,我的理解是goAhead關於網頁安全方面功能,即網頁白名單(WHITELIST)功能支援。
把宏WEBS_WHITELIST_SUPPORT關閉,重新編譯,再測試,OK了,可以開啟網頁了。
上述只是簡單的移植測試,然我們最終的目的是要把goAhead移植到我們的應用程式中的,在大多數的應用中,它也只是應用程式中的一個模組,因此,後面的工作量還是蠻多的,包括SSL的移植等等。
6. 參考資料
- http://www.docin.com/p-67202641.html
- http://www.cnitblog.com/zouzheng/archive/2008/01/04/38464.html
- http://www.dzjs.net/html/qianrushixitong/2009/0812/3890.html
- http://blog.csdn.net/zyboy2000/article/details/6191266
- http://www.bianceng.cn/webkf/aspx/201103/25071.htm
- http://blog.chinaunix.net/space.php?uid=22982394&do=blog&id=116136