goAhead 2.5 嵌入式web服務器 移植到 ARM 板上

本文內容概要:詳細描述了移植goAhead 2.5到S5PV210的linux系統的過程、步驟、遇到的問題及其解決方法。

開發環境:

        宿    主   機:window 8;

        虛    擬   機:ubuntu12.04;

        交叉編譯器:arm-Linux-gcc

———————————————————————————————————————————————————————————————————

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源碼包

地址爲:goAhead源碼包,當前最新版本爲: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程序文件)


得到源碼後,建議用source insight等工具建一個goAhead工程,便於代碼的閱讀或者查詢API函數等。

4. goAhead自帶幫助文檔

進入goAhead的wwwdemo目錄,找到Webs25GettingStarted.pdf文件,這就是goAhead帶的幫助文檔,移植前,建議先看下。

5. GoAhead Web服務器移植到arm-linux步驟

在獲取源碼包並解壓後,現在把goAhead移植到arm-linux中,arm指S5PV210,linux-2.6.30.4。

移植步驟很簡單,基本上在編譯階段不會出現什麼問題,而且這幾個步驟在網上諸多博客中都有說明。但在測試服務器的時候,遇到了問題,在瀏覽器死活都打不開網頁,不過,最終還是解決了,請看下面說明。

5.1 修改Makefile文件

進入goAhead源碼下的LINUX目錄,用 VI 打開Makefile文件。

Makefile文件默認是虛擬機的本身的GCC編譯器,因此,指定其交叉編譯器,注意,交叉編譯器的版本應與你的文件系統用的交叉編譯器一致。

在Makefile文件開頭添加如下信息:

[plain] view plaincopy
  1. CROSS_COMPILE   =/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-  
  2. AS      = $(CROSS_COMPILE)as  
  3. LD      = $(CROSS_COMPILE)ld  
  4. CC      = $(CROSS_COMPILE)gcc  
  5. CPP     = $(CC) -E  
  6. AR      = $(CROSS_COMPILE)ar  
  7. NM      = $(CROSS_COMPILE)nm  
  8. STRIP   = $(CROSS_COMPILE)strip  
  9. OBJCOPY = $(CROSS_COMPILE)objcopy  
  10. OBJDUMP = $(CROSS_COMPILE)objdump  


同時把Makefile中的語句:

[plain] view plaincopy
  1. matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)  


屏蔽掉。這一句是用來啓動SSL matrixssl的,具體參考Webs25GettingStarted.pdf文檔中的說明(Page8)。

5.2 編譯:make clean;make

在shell中進入LINUX目錄下,執行命令make clean;make即可編譯通過。

編譯通過後,在LINUX目錄下,得到兩文件,分別爲:libwebs.a和webs可執行文件。用如下命令查看webs執行文件依賴的庫文件:

[plain] view plaincopy
  1. /usr/local/arm-uclibc/bin/arm-uclibc-readelf -d webs  

其中,arm-uclibc-依你用的交叉編譯器而定。

得到如下信息:

[plain] view plaincopy
  1. Dynamic segment at offset 0xf638 contains 18 entries:  
  2.   Tag        Type                         Name/Value  
  3.  0x00000001 (NEEDED)                     Shared library: [libfloat.so.1]  
  4.  0x00000001 (NEEDED)                     Shared library: [libc.so.0]  
  5.  0x0000000c (INIT)                       0x8e2c  
  6.  0x0000000d (FINI)                       0x15aa0  
  7.  0x00000004 (HASH)                       0x8130  
  8.  0x00000005 (STRTAB)                     0x8924  
  9.  0x00000006 (SYMTAB)                     0x83a4  
  10.  0x0000000a (STRSZ)                      712 (bytes)  
  11.  0x0000000b (SYMENT)                     16 (bytes)  
  12.  0x00000015 (DEBUG)                      0x0  
  13.  0x00000003 (PLTGOT)                     0x1f704  
  14.  0x00000002 (PLTRELSZ)                   552 (bytes)  
  15.  0x00000014 (PLTREL)                     REL  
  16.  0x00000017 (JMPREL)                     0x8c04  
  17.  0x00000011 (REL)                        0x8bec  
  18.  0x00000012 (RELSZ)                      24 (bytes)  
  19.  0x00000013 (RELENT)                     8 (bytes)  
  20.  0x00000000 (NULL)                       0x0  


從上面可看到,webs依賴libc.so.0和libfloat.so.1兩動態文件,查看文件系統中lib目錄下是否包含了這兩動態文件,如果沒有,則需從交叉編譯器安裝路徑中獲取這兩個動態庫文件到文件系統lib目錄中。

5.3 測試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://localhost:8080/

localhost是目標板的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()函數中,這個函數是處理默認網頁的。

具體代碼段如下:

  1. /* 
  2.  *  We do whitelist validation in addition to standard URL validation. 
  3.  *  The whitelist should really catch anything invalid first. 
  4.  *  If the whitelist check fails, rebuild the list and try again. 
  5.  *  Also validate if we are not on a secure connection, but the whitelist 
  6.  *  entry has the SSL flag set, do not serve the page. 
  7.  */  
  8. #ifdef WEBS_WHITELIST_SUPPORT  
  9.     if ((rc = websWhitelistCheck(wp->url)) < 0) {  
  10.         websBuildWhitelist();  
  11.         if ((rc = websWhitelistCheck(wp->url)) < 0) {  
  12.             websError(wp, 404, T("Cannot open URL"));  
  13.             return 1;  
  14.         }  
  15.     }  
  16.     if (!(flags & WEBS_SECURE) && (rc & WHITELIST_SSL)) {  
  17.         websError(wp, 500, T("HTTPS access required"));  
  18.         return 1;  
  19.     }  
  20. #endif /* WEBS_WHITELIST_SUPPORT */  

問題就出現在上面這個代碼中,我的理解是goAhead關於網頁安全方面功能,即網頁白名單(WHITELIST)功能支持。

把宏WEBS_WHITELIST_SUPPORT關閉,重新編譯,再測試,OK了,可以打開網頁了。

 

上述只是簡單的移植測試,然我們最終的目的是要把goAhead移植到我們的應用程序中的,在大多數的應用中,它也只是應用程序中的一個模塊,因此,後面的工作量還是蠻多的,包括SSL的移植等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章