三种嵌入式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 |
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 |
?
三、運行Boa
開發板操作:
[root@~]#boa
如果發現boa沒有運行,則可以在開發板的/var/log/boa/error_log文件中找原因。
| 比如端口已被其他程序占用:
? 或是用戶設置錯誤等等,都可以查到。 |
?
?
四、功能測試
靜態網頁測試
將靜態網頁存入根文件系統的/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/ |
?
直接在瀏覽器中輸入開發板的IP地址(比如我的是http://192.168.1.2) ,出現fedora的歡迎網頁。靜態HTML調試成功。
CGI功能測試
1、編寫HelloworldCGI.c程序
[tekkamanninja@Tekkaman-Ninja source]$ vi helloworldCGI.c
(主程序的程序開頭一定要用Tab,而不是空格,不然編譯可能不通過)
?
| #include<stdio.h> 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?../.. |
?
| CC?=?/home/tekkamanninja/working/source/2.95.3/bin/arm-linux-gcc? |
?
?
| [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?,測試通過!
總結
以上是生活随笔為你收集整理的三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java-php-python-ssm在
- 下一篇: Linux多线程开发-线程同步-互斥锁p