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,註解掉看看;