搭建boa服務器

1、編譯boa

1.1 設置編譯環境

boa 的官方網站是:www.boa.org,下載地址:

https://sourceforge.net/project/showfiles.php?group_id=78,下載的版本爲:boa-0.94.13 版。

#tar xvfz boa-0.94.13.tar.gz -C /opt/EmbedSky/

1.2 配置編譯條件

配置 boa:

#cd /opt/EmbedSky/boa-0.94.13/src

#./configure

會在 boa-0.94.13/src 目錄下面生成 Makefile 文件,修改 Makefile 文件:

#vi Makefile

1)在 31 行和 32 行,找到:CC = gcc 和 CPP = gcc -E,然後改成:CC = mipsel-linux-gcc 和 CPP=mipsel-linux-gcc -E,保存退出。


2)相關文件的修改:

a. 修改compat.h

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

將其修改成

#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

否則會出現錯誤:

util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o]

b. 修改log.c

將以下語句註釋掉:

if (dup2(error_log, STDERR_FILENO) == -1) {

DIE("unable to dup2 the error log");

}

否則會出現錯誤:

log.c:73 unable to dup2 the error log:bad file deor

c. 修改boa.c(步驟6)

註釋掉下面兩句話:

if (passwdbuf == NULL) {

DIE(”getpwuid”);

}

if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

DIE(”initgroups”);

}

否則會出現錯誤:boa.c:211 - getpwuid: No such file or directory

註釋掉下面語句:

if (setuid(0) != -1) {

DIE(”icky Linux kernel bug!”);

}

否則會出現問題:boa.c:228 - icky Linux kernel bug!: No such file or directory

生成可執行文件BOA:

首先進入src目錄,並執行configure文件,生成Makefile文件

#cd /source/boa-0.94.13/src


# make(步驟9)

對生成文件進程瘦身

#mipsel-linux-strip boa(步驟10)

2配置 Web 服務器

主要修改 boa.conf 文件

User 0 //行48

Group 0 //行49

//作爲哪個用戶組運行,即它擁有該用戶組的權限,一般都是root,需要在/etc/group文件中有root組。

ErrorLog /dev/console //行62

//錯誤日誌文件。如果沒有以/xxx開始,則表示從服務器的根路徑開始。如果不需要錯誤日誌,則用

/dev/null。系統啓動後看到的boa的打印信息就是由/dev/console得到的。

AccessLog /dev/null //行75

//訪問日誌文件。如果沒有以/xxx開始,則表示從服務器的根路徑開始。如果不需要錯誤日誌,則用

/dev/null或直接註釋掉。

DocumentRoot /www //行112

//非常重要,這個就是存放HTML文檔的主目錄。如果沒有以/xxx開始,則表示從服務器的根路徑開

始。

ScriptAlias /cgi-bin/ /www/cgi-bin/ //行194

//非常重要,指明CGI腳本的虛擬路徑對應的實際路徑。一般所有的CGI腳本都要放在實際路徑裏,

用戶訪問執行時輸入站點+虛擬路徑+CGI腳本名。前面的/cgi-bin/就是虛擬路徑,/web/cgi-bin/就是

實際的路徑。

3、測試

(1)先進入開發板的根目錄,創建www目錄,在進入www目錄創建cgi-bin目錄,用來放置cgic測試文件。

(2)進入etc目錄,創建boa目錄。通過nfs將boa 和 boa.conf文件拷到該目錄下。

(3)將linux系統下得/etc/mime.types拷貝到開發板根文件系統的/etc下,mime.types的主要功能是控制從網絡上發給宿主機端的媒體文件的類型,並且告訴宿主機怎麼去處理這些數據。

(4)啓動boa :./boa &

(5)CGI 腳本測試

使用 helloweb.c 進行測試。

helloweb.c 源碼如下:

#include <stdio.h>

main()

{

printf("Content-type: text/html\n\n");

printf("<html>\n");

printf("<head><title>CGI Output</title></head>\n");

printf("<body>\n");

printf("<hl>Hello, Web Server.</hl>\n");

printf("<body>\n");

printf("</html>\n");

exit(0);

}

編譯:

#mipsel-linux-gcc -o helloweb.cgi helloweb.c

#cp /mnt/helloweb.cgi /www/cgi-bin

然後在 PC 的網頁瀏覽器中輸入:

http://xx.xx.xx.xx/cgi-bin/helloweb.cgi 即可打開測試頁面。

注意:

用cgi程序進行交互時,瀏覽器端出現瞭如下的錯誤信息:
502 Bad Gateway  
The CGI was not CGI/1.1 compliant

在終端上還會顯示這樣的提示信息:
cgi_header:unable to find LFIF
這樣的錯誤一般是格式的問題,我寫的頭是
printf("Content-type: text/html");
正確的應該是:
printf("Content- type: text/html\n\n");

也就是後面有兩個空行,這也是默認的格式,必須這樣寫才行,一定要注意哦。

如果還是錯誤時,嘗試以下方法:

1,修改boa代碼cgi.c,在  complete_env 函數中添加環境變量  
my_add_cgi_env(req,   "LD_LIBRARY_PATH",   "/lib"),然後重新make即可;     

2,編譯時加入一個參數,具體如下:  
gcc   -static   test.c   -o   test.cgi  
3,有時原因可能是出在 req->post_data_fd上,在cgi.c的ini_cgi()中,在進行fork()之後,父行程會將 req->post_data_fd開關必設為零,在別的系統中這不會影響到子行程,不知道爲什麼在uclinux下就會出問題,試試吧
if (req->method == M_POST) 
{
close(req->post_data_fd); /* child closed it too */
req->post_data_fd = 0;
}
裡的req->post_data_fd = 0,註解掉看看;


發佈了19 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章