Linux —— Fedora8
交叉編譯器版本:
arm-vfp-linux-gnu-gcc
開發(fā)板平臺:
YL-3250
<一>在x86平臺上的移植
一>
1、下載源碼程序boa-0.94.13.tar.gz
2、解壓 #tar xzf boa-0.94.13.tar.gz
3、進入boa的源代碼目錄
#./configure
5、編譯
#make
用2.95.3以上的版本編譯時會出錯:
util.c:100:1: 錯誤:毗連“t”和“->”不能給出一個有效的預處理標識符
make: *** [util.o] 錯誤 1(中文版本)
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make:*** [util.o] Error 1(English version)
解決方法:
修改本目錄下compat.h中的
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
為:
#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
再次編譯,通過,會在當前目錄(boa-0.94.13/src)下生成可執(zhí)行文件boa。
二>
1、在/etc下建立boa目錄,并復制/boa-0.94.13/boa.conf到/etc/boa目錄下,因為在/src/defines.h源碼中,宏SERVER_ROOT定義了服務器的根目錄,如下:
#ifndef SERVER_ROOT
#define SERVER_ROOT "/etc/boa"
#endif
當然也可以在運行命令時使用-c來指定根目錄。
為
為
為
3、設(shè)定日志目錄:boa日志有兩部分,ErrorLog和AccessLog,可根據(jù)自己情況設(shè)置日志目錄,也可以選擇默認值:
下面是從網(wǎng)上找到的配置說明,其實就是boa.conf的中文翻譯而已。
Port:boa服務器監(jiān)聽的端口,默認的端口是80。如果端口小于1024,則必須是
Listen:綁定的ip地址。不使用這個參數(shù)時,將綁定所有的地址。
User:連接到服務器的客戶端的身份,可以是用戶名或UID。
Group:連接到服務器的客戶端的組,可以是組名或GID。
ServerAdmin:服務器出故障時要通知的郵箱地址。
ErrorLog:指定錯誤日志文件。如果路徑?jīng)]有以"/"開始,則相對于ServerRoot路徑。沒有配置時默認的文件是/dev/stderr。若不想記錄日志,指定文件為/dev/null。
AccessLog:設(shè)置存取日志文件,與ErrorLog類似。
UseLocaltime:設(shè)置使用本地時間,使用UTC時注釋這個參數(shù)。這個參數(shù)沒有值。
VerboseCGILogs:在錯誤日志文件中記錄CGI啟動和停止時間,若不記錄,注釋這個參數(shù)。這個參數(shù)沒有值。
ServerName:指定服務器的名稱,當客戶端使用gethostname + gethostbyname時返回給客戶端。
VirtualHost:虛擬主機開關(guān)。使用此參數(shù),則會在DocumentRoot設(shè)定的
目錄添加一個ip地址作為新的DocumentRoot來
處理客戶端的請求。如DocumentRoot設(shè)置為/var/www,則http://localhost/轉(zhuǎn)換成/var/www/127.0.0.1/,若注釋此參數(shù),則為/var/www/。
DocumentRoot:HTML文件的根目錄(也就是網(wǎng)站的目錄)。
UserDir:指定用戶目錄。
DirectoryIndex:指定預生成目錄信息的文件,注釋此變量將使用DirectoryMaker變量。這個變量也就是設(shè)置默認主頁的文件名。
DirectoryMaker:指定用于生成目錄的程序,注釋此變量將不允許列目錄。
DirectoryCache:當DirectoryIndex文件不存在,而DirecotryMaker又被注釋掉時,將列出這個參數(shù)指定目錄給客戶端。
KeepAliveMax:每個連接允許的請求數(shù)量。如果將此值設(shè)為" 0 ",將不限制請求的數(shù)目。
KeepAliveTimeOut:在關(guān)閉持久連接前等待下一個請求的秒數(shù)。(秒)。
MimeTypes:設(shè)置包含mimetypes信息的文件,一般是/etc/mime.types。
DefaultType:默認的mimetype類型,一般是text/html。
CGIPath:相當于給CGI程序使用的$PATH變量。
SinglePostLimit:一次POST允許最大的字節(jié)數(shù),默認是1MB。
AddType: 增加MimeType沒有指定的類型,例: AddType type extension [extension ...]。要使用cgi,必須添加cgi類型:AddType application/x-httpd-cgi cgi
Redirect:重定向文件。
Aliases:指定路徑的別名。
ScriptAlias:指定腳本路徑的虛擬路徑。
4、根據(jù)boa.conf建立相應目錄
并在其中存放html文件(包括默認主頁index.html)
注意:這里/var/log/boa目錄必須為可寫,否則會出現(xiàn)錯誤:log.c:73 – Unable to dup2 the error log: Bad file r.)
5、關(guān)閉其它Web服務器
6、啟動boa
(使用普通用戶無法啟動boa,提示錯誤:[03/Aug/2011:09:04:45 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor)
若ps中沒有看到boa進程,說明boa沒有成功啟動
查看/var/log/boa/error_log顯示:
[03/Aug/2011:00:46:33 +0000] boa.c:226 - icky Linux kernel bug!: Success
解決方法:將boa.c中的以下內(nèi)容注釋掉
if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
---------->
重新make
7、將Windows與虛擬機的IP設(shè)在一個網(wǎng)段,在Windows瀏覽器中輸入linux的IP地址,即可進入首頁,即/var/www/index.html。
<二>移植到開發(fā)板
一>修改Makefile文件:
1、將:CC = gcc
改為:
注:根據(jù)安裝的交叉編譯工具進行更改
2、#make
二>拷貝虛擬機下/etc/mime.types文件到開發(fā)板/etc目錄下
開發(fā)板上根據(jù)boa配置文件建立相關(guān)文件(夾)同X86中二>配置boa
4
將可執(zhí)行文件boa復制到開發(fā)板,并運行~
在Windows瀏覽器地址欄中輸入開發(fā)板地址進行測試。
在板子上運行出現(xiàn)這個問題gethostbyname:: Resource temporarily unavailable。
解決方法:把src文件夾下的config.c里的if(!server_name){..........}(大概在266行到286行之間)注釋掉,就能運行在板子上運行boa。
附錄:
常見錯誤
這些錯誤內(nèi)容可查看/var/log/boa/error_log文件
1>. 錯誤1: gethostbyname:: No such file or directory
解決辦法: 修改boa.conf
2>. 錯誤1: util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o]
解決辦法: 修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
3>. 錯誤2: boa.c:211 - getpwuid: No such file or directory
解決辦法: 修改src/boa.c
注釋掉下面這段程序:
if (passwdbuf == NULL) {
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
即修改為:
#if 0
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
#endif
4>. 錯誤3: boa.c:228 - icky Linux kernel bug!: No such file or directory
解決辦法: 修改src/boa.c
注釋掉下面語句:
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
即修改為:
#if 0
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif
5>. 錯誤4: log.c:73 unable to dup2 the error log:bad file descriptor
解決方法:
方法1> 確定日志目錄對與所有用戶都具有可讀/寫的權(quán)限
方法2> 修改src/log.c (建議采用方法1)
注釋掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
即修改為:
#if 0
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
#endif
參考網(wǎng)址:http://www.linuxidc.com/Linux/2011-03/33485.htm
http://hi.baidu.com/??x??/blog/item/63118b3d8b9f4fe63b87ce1f
在前面的文章里講了如何安裝、配置boa,這篇文章主要講一下一些boa測試實例,主要涉及到html以及cgi程序的編寫。 測試環(huán)境: html不用介紹了。cgi全稱為Common Gate Interface,它不是一種具體的語言,它可以使用其它語言來實現(xiàn),比如C、C++、Perl、shell,等等。我們使用C語言來編寫cgi程序。 我們需要使用到兩個文件,一個是用于頁面顯示的使用html語言編寫的hello.html,該文件放到/var/www/html目錄中。另一個是用于響應該頁面的cgi程序hello.c,該程序使用C語言編寫,編譯方式為: 編譯后的可執(zhí)行文件hello.cgi放到/var/www/cgi-bin目錄中 完整的hello.html如下: you 這個html文件分兩部分,前半部分是一些常見的頁面顯示語句,這里包括了標題、圖片顯示、超鏈接。后半部分是我們真正的測試程序,主要設(shè)計了兩個輸入框,分別輸入用戶名和密碼;兩個按鈕,分別是登陸和清除,這里的“登陸”并非實際中的登陸,它只是測試cgi程序的響應,結(jié)果是顯示輸入的信息。 它的action表明了由哪一個cgi程序來響應來自該頁面的消息,而method為http響應的方法,常用的有兩種,分別是“post”和“get”,這里非專業(yè)地介紹一下。post,顧名思義,就是“提交”,用于更新信息;而get,即“獲取”,用于從服務器中獲取、查詢信息。在下文將會看到,這兩者在地址欄中的區(qū)別,使用post方法時數(shù)據(jù)是不會在地址欄中顯示的,而get方法則會顯示。不過本文不介紹這兩者的本質(zhì)區(qū)別。 如果直接輸入Linux的IP地址,則會顯示Fedora Project的啟動頁面,而要訪問我們的測試網(wǎng)頁,還需要再添加一些目錄才行。這里的實際地址應該是: 下面是響應的cgi程序hello.c完整代碼:
http://blog.sina.com.cn/s/blog_b4ed6f2f0101d0b7.htmlboa測試實例
虛擬機(虛擬機軟件為VMware)Fedora(以下與Linux為同義詞),Linux的IP為192.168.184.100,通過VMnet8方式與物理機MS Windows連接,使用常用瀏覽器訪問,如IE、Maxthon、Chrome等。$ gcc hello.c –o hello.cgi
this
hello
注意到這一句:
http://192.168.184.100/html/hello.html
當然,IP地址需要根據(jù)實際情況而改變。#include
#include
#include
char*
{