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

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


1、Boa程序的移植css

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

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

 

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

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

 

三、修改Makefile文件(注意:必須用cross-2.95.3, 如使用3.4.一、4.1.1等等會出錯) 四、交叉編譯服務器

[tekkamanninja@Tekkaman-Ninja src]$ makeapp

 

五、去除調試信息,減少體積。(可選)dom

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

 

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

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

  

 

 

2、配置Boa

Boa須要在/etc目錄下創建一個boa目錄,裏面放入Boa的主要配置文件boa.conf。在Boa源碼目錄下已有一個示例boa.conf,能夠在其基礎上進行修改。

 

一、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@~]#

二、ScriptAlias的修改

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

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

三、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/

 

3、運行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

 

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

 

 

4、功能測試

靜態網頁測試

將靜態網頁存入根文件系統的/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功能測試

一、編寫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系統
 

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

2、配置和交叉編譯
[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

3、程序安裝
[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

4、運行程序

在開發板上操做:

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

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

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

 


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

 

1、下載並解壓
下載的官方主頁:http://shttpd.sourceforge.net/
我下的是目前最新的shttpd-1.39.tar.gz
解壓:
[tekkamanninja@Tekkaman-Ninja source]$ tar zxvf shttpd-1.39.tar.gz
 
2、配置和交叉編譯
[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/
 
3、運行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  是你能夠自定義其後綴。
4、開發板測試
 
靜態網頁測試
在開發板的 /var/www(由-root指定的根目錄)放入測試網頁:index.html 
在HOST的瀏覽器中輸入開發板地址,測試經過!
 
CGI測試
在 /var/www (由-root指定的根目錄)放入測試 CGI 程序:helloworldCGI.cgi
 在流覽器中輸入(開發板地址)192.168.1.2/helloworldCGI.cgi ,測試經過!
相關文章
相關標籤/搜索