三種嵌入式web服務器(Boa / lighttpd / shttpd)的 linux移植筆記


一:移植Boa(web服務器)到嵌入式Linux系統


一、Boa程序的移植

1、下載Boa源碼
    下載地址:
 http://www.boa.org/
    目前最新發行版本: 0.94.13   (幾年沒更新版本了)
    下載 boa-0.94.13.tar.gz,

注意:若從boa上下載的是boa-0.94.13.tar.tar,解壓方式一樣
    解壓:

 

2、生成Makefile文件
   進入boa-0.94.13,直接運行src/configure文件

[tekkamanninja@Tekkaman-Ninja src]$./configure

 

3、修改Makefile文件(注意:必須用cross-2.95.3, 如使用3.4.1、4.1.1等等會出錯) 4、交叉編譯

[tekkamanninja@Tekkaman-Ninja src]$ make

 

5、去除調試信息,減小體積。(可選)

[tekkamanninja@Tekkaman-Ninja src]$/home/tekkamanninja/working/source/2.95.3/bin/arm-linux-strip boa

 

6、將編譯好的程序放入根文件系統的/bin目錄下。

[tekkamanninja@Tekkaman-Ninja src]$ cp boa/home/tekkamanninja/working/nfs/rootfs/bin/

  

 

 

二、配置Boa

Boa需要在/etc目錄下建立一個boa目錄,里面放入Boa的主要配置文件boa.conf。在Boa源碼目錄下已有一個示例boa.conf,可以在其基礎上進行修改。

 

1、Group的修改

修改 Group nogroup
為 Group user(開發板上有的組)
修改 User nobody
 User boa (user組中的一個成員)
根據你的開發板的情況設定。一定要存在的組和用戶。
 
以下是我在開發板上的操作:

[root@~]#adduser -g user boa
Changing password for boa
Enter the new password (minimum of 5, maximum of 8 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password:
Bad password: too short.

Warning: weak password (continuing).
Re-enter new password:
passwd[820]: password for `boa' changed by user `root'
Password changed.
[root@~]#

2、ScriptAlias的修改

修改 ScriptAlias /cgi-bin/  /usr/lib/cgi-bin/
為 ScriptAlias /cgi-bin/  /var/www/cgi-bin/

這是在設置CGI的目錄,你也可以設置成別的目錄。比如用戶文件夾下的某個目錄。

3、ServerName的設置

修改 #ServerName www.your.org.here
為 ServerName www.your.org.here

注意:該項默認為未打開,執行Boa會異常退出,提示“gethostbyname::No such file or directory”,所以必須打開。其它默認設置即可。你也可以設置為你自己想要的名字。比如我設置為:ServerName tekkaman2440

此外,還需要:

mime.types文件復制/etc目錄下,通常可以從linux主機的 /etc目錄下直接復制即可。

(以下配置和boa.conf的配置有關)

創建日志文件所在目錄/var/log/boa

創建HTML文檔的主目錄/var/www

創建CGI腳本所在錄 /var/www/cgi-bin

 

[tekkamanninja@Tekkaman-Ninja log]$ mkdir -m 777 boa
[tekkamanninja@Tekkaman-Ninja log]$ cd ..
[tekkamanninja@Tekkaman-Ninja var]$ mkdir -m 777 www
[tekkamanninja@Tekkaman-Ninja var]$ mkdir -m 777 www/cgi-bin
[tekkamanninja@Tekkaman-Ninja var]$ cd ..
[tekkamanninja@Tekkaman-Ninja rootfs]$ cp /etc/mime.types etc/

 

三、運行Boa

開發板操作:

[root@~]#boa

如果發現boa沒有運行,則可以在開發板的/var/log/boa/error_log文件中找原因。

比如端口已被其他程序占用:

[root@~]#cat /var/log/boa/error_log
[20/Feb/2008:21:21:57 +0000] boa.c:194 - unable to bind: Address already in use

 

或是用戶設置錯誤等等,都可以查到。

 

 

四、功能測試

靜態網頁測試

將靜態網頁存入根文件系統的/var/www目錄下(可以將主機 /usr/share/doc/HTML/目錄下的index.html、homepage.css和img、stylesheet-images目錄復制到/var/www目錄下)

我參考《嵌入式Web服務器移植 》的做法如下:

在根文件系統的/var目錄下

[tekkamanninja@Tekkaman-Ninja var]$ cp /usr/share/doc/HTML/index.html www/
[tekkamanninja@Tekkaman-Ninja var]$ cp -r /usr/share/doc/HTML/img www/
[tekkamanninja@Tekkaman-Ninja var]$ cp /usr/share/doc/HTML/homepage.css www/
[tekkamanninja@Tekkaman-Ninja var]$ cp -r/usr/share/doc/HTML/stylesheet-images www/

 

直接在瀏覽器中輸入開發板的IP地址(比如我的是http://192.168.1.2) ,出現fedora的歡迎網頁。靜態HTML調試成功。

CGI功能測試

1、編寫HelloworldCGI.c程序

[tekkamanninja@Tekkaman-Ninja source]$ vi helloworldCGI.c

(主程序的程序開頭一定要用Tab,而不是空格,不然編譯可能不通過)

 

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
        printf("Content-type: text/html\n\n");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("

Hello,world.

\n");
        printf("\n");
        printf("\n");
        exit(0);
}

 

 

2.交叉編譯生成CGI程序

 

[tekkamanninja@Tekkaman-Ninja source]$/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc-o helloworldCGI helloworldCGI.c

 

將helloworldCGI 拷貝至根文件系統的/var/www/cgi-bin/下

 

[tekkamanninja@Tekkaman-Ninja source]$ cp helloworldCGI../nfs/rootfs/var/www/cgi-bin/

 

3.測試

瀏覽器輸入
   http://192.168.1.2/cgi-bin/helloworldCGI

網頁出現 Hello,world. 調試成功!

 

[tekkamanninja@Tekkaman-Ninja src]$ cd ../..
[tekkamanninja@Tekkaman-Ninja source]$ cd ../nfs/rootfs/etc/
[tekkamanninja@Tekkaman-Ninja etc]$ mkdir boa
[tekkamanninja@Tekkaman-Ninja etc]$ chmod 777 boa/
[tekkamanninja@Tekkaman-Ninja etc]$ cd boa
[tekkamanninja@Tekkaman-Ninja boa]$ kwrite boa.conf

 

CC = /home/tekkamanninja/working/source/2.95.3/bin/arm-linux-gcc 
CPP = /home/tekkamanninja/working/source/2.95.3/bin/arm-linux-gcc -E


 

[tekkamanninja@Tekkaman-Ninja source]$tar xzf boa-0.94.13.tar.gz



 
二:移植lighttpd Web服務器到嵌入式linux系統
 

一、下載並解壓
下載的官方主頁:www.lighttpd.net
我下的是目前最新的lighttpd-1.4.18
解壓:
[tekkamanninja@Tekkaman-Ninja source]$ tar xjvf lighttpd-1.4.18.tar.bz2

二、配置和交叉編譯
[tekkamanninja@Tekkaman-Ninja source]$ cd lighttpd-1.4.18
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ CC=/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc ./configure -prefix=/lighttpd  -host=arm-9tdmi-linux-gnu --disable-FEUTARE -disable-ipv6 -disable-lfs  

這里特別注意一下-prefix=/lighttpd , 我是將軟件先裝在Host的根目錄下的lighttpd文件夾內,然后將其復制到開發板的根文件系統的根目錄下。我之所以這樣做是因為這個軟件在make install時會配置他私有的庫文件的路徑,在開發板運行時會在-prefix= 的文件加下找他的私有庫文件。而我又是交叉編譯給開發板,這樣配置比較方便移植。

--disable-FEUTARE -disable-ipv6 -disable-lfs 可以不加。

[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ make

三、程序安裝
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ make install

拷貝配置文件到開發板根文件系統的etc文件夾並進行適當修改:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp doc/lighttpd.conf  /home/tekkamanninja/working/nfs/rootfs/etc/

[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ kwrite  /home/tekkamanninja/working/nfs/rootfs/etc/lighttpd.conf 

必需修改的地方有:

    server.document-root        = "/srv/www/htdocs/"
改為server.document-root        = "/home/lighttpd/html/"

你可以自己定義,這里就是設置web服務的根目錄。

屏蔽一下語句,不然嵌入式這樣的小系統下可能無法啟動
#$HTTP["url"] =~ "\.pdf$" {
#  server.range-requests = "disable"
#}

開看程序需要那些動態庫
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d src/lighttpd

Dynamic section at offset 0x20790 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0xc200
 0x0000000d (FINI)                       0x231c0
 0x00000004 (HASH)                       0x8128
 0x00000005 (STRTAB)                     0xa338
 0x00000006 (SYMTAB)                     0x8b48
 0x0000000a (STRSZ)                      5946 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x30860
 0x00000002 (PLTRELSZ)                   960 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0xbe40
 0x00000011 (REL)                        0xbe00
 0x00000012 (RELSZ)                      64 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0xbd70
 0x6fffffff (VERNEEDNUM)                 2
 0x6ffffff0 (VERSYM)                     0xba72
 0x00000000 (NULL)                       0x0

拷貝動態庫:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libdl-2.3.2.so~/working/nfs/rootfs/lib/
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libdl.s*  ~/working/nfs/rootfs/lib/

在開發板為此程序新建一個用戶及存儲網頁的根目錄以及一個log目錄:

開發板操作:
[root@~]#adduser -g user lighttpd
Changing password for lighttpd
Enter the new password (minimum of 5, maximum of 8 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password:
Bad password: too short.

Warning: weak password (continuing).
Re-enter new password:
passwd[786]: password for `lighttpd' changed by user `root'
Password changed.
[root@~]#

HOST 操作:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cd ../../nfs/rootfs/home/lighttpd/
[tekkamanninja@Tekkaman-Ninja lighttpd]$ su
口令:
[root@Tekkaman-Ninja lighttpd]# mkdir html
[root@Tekkaman-Ninja lighttpd]# chmod 777 html/
[root@Tekkaman-Ninja lighttpd]# mkdir  ../../var/log/lighttpd
[root@Tekkaman-Ninja lighttpd]# chmod 777 ../../var/log/lighttpd

將移植好的程序(整個目錄,其中包含了bin、sbin、lib和share目錄)拷貝到開發板根文件系統的根目錄下:
[root@Tekkaman-Ninja lighttpd]# mv /lighttpd   /home/tekkamanninja/working/nfs/
[root@Tekkaman-Ninja lighttpd]# exit
exit

四、運行程序

在開發板上操作:

[root@~]#/lighttpd/sbin/lighttpd -f /etc/lighttpd.conf

將測試靜態網頁放在server.document-root設置的目錄下,並在HOST的瀏覽器下輸入開發板IP,測試通過。

至於CGI的運行,我還不懂配置,有空再研究!

 


三:移植shttpd Web服務器到嵌入式Linux系統

 

一、下載並解壓
下載的官方主頁:http://shttpd.sourceforge.net/
我下的是目前最新的shttpd-1.39.tar.gz
解壓:
[tekkamanninja@Tekkaman-Ninja source]$ tar zxvf shttpd-1.39.tar.gz
 
二、配置和交叉編譯
[tekkamanninja@Tekkaman-Ninja source]$ cd shttpd-1.39  
[tekkamanninja@Tekkaman-Ninja shttpd-1.39]$ cd src/
[tekkamanninja@Tekkaman-Ninja src]$ kwrite Makefile
 
只需在前面加上交叉編譯器路徑就好:
CC = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc
AR = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-ar
CFLAGS =  -DNO_SSL
 
加上CFLAGS =  -DNO_SSL,是因為如果編譯SSL支持,會因符號未定義而無法通過。所以我去除了SSL 支持。
 
交叉編譯:
[tekkamanninja@Tekkaman-Ninja src]$ make unix
開看程序需要那些動態庫:
[tekkamanninja@Tekkaman-Ninja src]$ ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d shttpd
Dynamic section at offset 0x12cc8 contains 20 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x9180
 0x0000000d (FINI)                       0x18708
 0x00000004 (HASH)                       0x8128
 0x00000005 (STRTAB)                     0x8a5c
 0x00000006 (SYMTAB)                     0x843c
 0x0000000a (STRSZ)                      807 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x22d90
 0x00000002 (PLTRELSZ)                   704 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8ec0
 0x00000011 (REL)                        0x8e88
 0x00000012 (RELSZ)                      56 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8e48
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8d84
 0x00000000 (NULL)                       0x0

將編譯好的程序放入開發板的文件系統下:
[tekkamanninja@Tekkaman-Ninja src]$ cp shttpd /home/tekkamanninja/working/nfs/rootfs/sbin/
 
三、運行shttpd
因為shttpd 沒有配置文件,所以配置是由啟動參數加的,比如我在開發板中操作如下:
[root@~]#shttpd -root /var/www -ports 80  &
意思是Web 根目錄為/var/www 用80端口提供服務。
 
還有別的參數如下:
[root@~]#shttpd --help
SHTTPD version 1.39 (c) Sergey Lyubka
usage: shttpd [options] [config_file]
  -A <htpasswd_file>
  -root         Web root directory (default: .)
  -index_files  Index files (default: index.html,index.htm,index.php,index.cgi)
  -ports        Listening ports (default: 80)
  -dir_list     Directory listing (default: 1)
  -cfg_uri      Config uri
  -protect      URI to htpasswd mapping
  -cgi_ext      CGI extensions (default: cgi,pl,php)
  -cgi_interp   CGI interpreter
  -cgi_env      Additional CGI env vars
  -ssi_ext      SSI extensions (default: shtml,shtm)
  -auth_realm   Authentication domain name (default: mydomain.com)
  -auth_gpass   Global passwords file
  -auth_PUT     PUT,DELETE auth file
  -access_log   Access log file
  -error_log    Error log file
  -mime_types   Additional mime types list
  -aliases      Path=URI mappings
  -acl          Allow/deny IP addresses/subnets
  -inetd        Inetd mode (default: 0)
  -uid          Run as user
 
這里說明一下 -cgi_ext  :shttpd沒有CGI 目錄的概念,它是通過認文件擴展名來識別的。要運行CGI 程序,默認情況下就要在編譯好的程序后面加上 “.cgi””pl””php”等后綴。而 -cgi_ext  是你可以自定義其后綴。
四、開發板測試
 
靜態網頁測試
在開發板的 /var/www(由-root指定的根目錄)放入測試網頁:index.html 
在HOST的瀏覽器中輸入開發板地址,測試通過!
 
CGI測試
在 /var/www (由-root指定的根目錄)放入測試 CGI 程序:helloworldCGI.cgi
 在流覽器中輸入(開發板地址)192.168.1.2/helloworldCGI.cgi ,測試通過!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM