在嵌入式Linux系統中,實現Web服務的組件有很多,它們大多是輕量級的,對系統資源的占用不大,對嵌入式CPU的開銷也不大。比較常見的組件有boa、thttpd、mini_httpd、mongoose、lighttpd、appweb以及apache等。下面就以流行廣泛的boa為例來進行安裝和配置。
一、下載
Boa的官方網站為www.boa.org,其源代碼可直接從官網下載,本例下載的版本為boa-0.94.13.tar.tar。
下載完成后對源碼進行解壓,執行“tar –xvf boa-0.94.13.tar.tar –C /”,把源碼解壓到根目錄下。解壓完成后執行“cd /boa-0.94.13/src”,進入到源碼目錄。
二、配置
在源碼目錄下,執行“./configure”對其進行配置。配置結束后會生成Makefile文件,用Vi打開該文件,找到第31、32兩行,原來的代碼為“CC = gcc”和“CPP = gcc -E”,要把這兩行改為使用交叉編譯工具編譯,改為“CC = arm-linux-gcc”和“CPP = arm-linux-gcc -E”。然后再找到第23行,原來的代碼為“LDFLAGS= -g”,要把它改為靜態庫方式,改為“LDFLAGS = -g -static”。全部改完后存盤退出。
接下來找到compat.h文件並打開它,找到第120行,原來的代碼為“#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff”,把它改為“#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff”,即把兩個#號去掉。完成后存盤退出。
找到主文件boa.c並打開它,把其中的第210~212行和225~227行注釋掉(或刪除掉),如下:
210 // if (passwdbuf == NULL) {
211 // DIE("getpwuid");
212 // }
…………
225 // if (setuid(0) != -1) {
226 // DIE("icky Linux kernel bug!");
227 // }
其余部分不變,改完后存盤退出。
最后找到log.c文件,打開它並找到第72~74行,其代碼如下:
72 if (dup2(error_log, STDERR_FILENO) == -1) {
73 DIE("unable to dup2 the error log");
74 }
這里要把它們注釋掉,可改成下面的形式。
72 #if 0
73 if (dup2(error_log, STDERR_FILENO) == -1) {
74 DIE("unable to dup2 the error log");
75 }
76 #endif
其余部分不變,更改完成后存盤退出。
三、編譯
完成配置后,在/boa-0.94.13/src目錄下執行make命令進行編譯,本例所使用的交叉編譯工具鏈為4.4.3版本。
編譯完成后就會在當前目錄生成可執行文件boa。
四、安裝和部署
把剛才編譯好的文件boa拷貝到嵌入式開發板上的/usr/bin目錄下。
接下來在嵌入式開發板上執行“mkdir –p /etc/boa”,新建boa配置目錄。然后把剛才解壓的boa源碼下的配置文件boa.conf(在boa-0.94.13目錄下)拷貝到嵌入式開發板的/etc/boa目錄下。
接下來要更改配置文件boa.conf,按以下步驟進行(在開發板上完成)。
1、用vi打開boa.conf,找到第48、49兩行,原來的代碼為“User nobody”和“Group nogroup”,把它們改為“User root”和“Group root”,以指定root為其用戶和組。
2、找到第94行,原來的代碼為“#ServerName www.your.org.here”,現在把它前面的#號去掉,改為“ServerName www.your.org.here”。
3、找到第111行,原來的代碼為“DocumentRoot /var/www”,這里是指定網頁存放的根目錄,可按實際需求進行更改,本例把它放到home目錄下,改為“DocumentRoot /home/www”。
4、找到第74行,原來的代碼為“AccessLog /var/log/boa/access_log”,這里把它改為“AccessLog /home/www/log/boa/access_log”。
5、找到第193行,原來的代碼為“ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/”,這里把它改為“ScriptAlias /cgi-bin/ /home/www/cgi-bin/”。
全部完成后存盤退出。
接下來要在嵌入式開發板上建立剛才配置的目錄 ,如下:
1、執行“mkdir –p /home/www”,建立網頁文件的根目錄。
2、執行“mkdir –p /home/www/log/boa”,建立日志目錄。
3、執行“mkdir –p /home/www/cgi-bin”,建立CGI目錄。
4、執行“touch /home/www/log/boa/access_log”,新建一個日志文件。
接下來在嵌入式開發板的/etc目錄下查看一下有沒有文件mimi.types,如果沒有可以從虛擬機的/etc/目錄下拷貝一個過來。
五、測試
以上工作全部完成后就可以進行測試了,在嵌入式開發板上執行boa並回車,如果正常的話可看到控制台上打印出以下信息。
[29/May/2019:10:24:00 +0000] boa: server version Boa/0.94.13
[29/May/2019:10:24:00 +0000] boa: server built May 29 2019 at 10:19:44.
[29/May/2019:10:24:00 +0000] boa: starting server pid=1111, port 80
此時表明boa的web服務已經正常啟動了。需要注意的是,boa啟動后就以服務的形式在后台運行了,要重新啟動需要把原來的boa進程結束掉才行。(可通過ps命令查看boa的進程號,然后通過“kill -9 進程號”來結束進程。)
正常啟動后就可以進行測試了。先在/home/www/目錄下新建一個測試頁面,執行“vi index.html”,然后在其中寫入一句“This is a test Page!”,然后存盤退出。為了完成測試,可拷貝一個圖標文件到/home/www目錄下,並把文件名稱改為favicon.ico。完成后進行測試,在PC機上打開瀏覽器,在地址欄中輸入嵌入式開發板的IP地址(本例為192.168.1.90),然后回車,就可以看以剛才的測試頁面了。如下。
接下來進行CGI程序測試。在虛擬機下新建一個CGI測試文件,執行“vi hello_cgi.c”,然后在其中輸入以下程序。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Content-type:text/html\n\n");
printf("Hello world!");
exit(0);
}
然后執行“arm-linux-gcc hello_cgi.c –o hello_cgi”對其進行交叉編譯,完成后把生成的可執行文件hello_cgi拷貝到嵌入式開發板上的/home/www/cgi-bin目錄下。然后再樣在PC機上的瀏覽器中進行測試,在地址欄中輸入http://192.168.1.90/cgi-bin/hello_cgi並回車。如果正常的話會顯示出如下的頁面。
至此,boa在嵌入式Linux下的安裝配置全部完畢。