• 正文
    • 一、什么是boa?
    • 二、boa移植步驟
    • 三、運(yùn)行測(cè)試
    • 四、錯(cuò)誤匯總
    • 五、修改的參數(shù)說(shuō)明
    • 六、補(bǔ)充
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

從頭搭建一個(gè)嵌入式web服務(wù)器-boa服務(wù)器

02/10 11:45
804
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

一、什么是boa?

BOA是一款非常小巧的Web服務(wù)器,源代碼開(kāi)放、性能優(yōu)秀、支持CGI通用網(wǎng)關(guān)接口技術(shù),特別適合應(yīng)用在嵌入式系統(tǒng)中。

BOA服務(wù)器主要功能是在互聯(lián)嵌入式設(shè)備之間進(jìn)行信息交互,達(dá)到通過(guò)網(wǎng)絡(luò)對(duì)嵌入式設(shè)備進(jìn)行監(jiān)控,并將反饋信息自動(dòng)上傳給主控設(shè)備的目的。它是基于HTTP超文本傳輸協(xié)議的,Web網(wǎng)頁(yè)是Web服務(wù)最基本的傳輸單元。

嵌入式Web服務(wù)的工作基于客戶機(jī)/服務(wù)器計(jì)算模型,由Web瀏覽器(客戶機(jī))和Web服務(wù)器(服務(wù)器)構(gòu)成,也即著名的B/S結(jié)構(gòu)。運(yùn)行于客戶端的瀏覽器首先要與嵌入式Web服務(wù)器BOA端建立連接,打開(kāi)一個(gè)套接字虛擬文件,此文件建立標(biāo)志著SOCKET連接建立成功然后客戶端瀏覽器通過(guò)套接字SOCKET以GET或者POST參數(shù)傳遞方式向Web服務(wù)器提交請(qǐng)求,Web瀏覽器提交請(qǐng)求后,通過(guò)HTTP協(xié)議傳送給Web服務(wù)器。Web服務(wù)器接到請(qǐng)求后,根據(jù)請(qǐng)求的不同進(jìn)行事務(wù)處理,返回HTML文件或者通過(guò)CGI調(diào)用外部應(yīng)用程序,返回處理結(jié)果。

服務(wù)器通過(guò)CGI與外部應(yīng)用程序和腳本之間進(jìn)行交互,根據(jù)客戶端瀏覽器在請(qǐng)求時(shí)所采用的方法,服務(wù)器會(huì)搜集客戶所提供的信息,并將該部分信息發(fā)送給指定的CGI擴(kuò)展程序,CGI擴(kuò)展程序進(jìn)行信息處理并將結(jié)果返回給服務(wù)器,然后服務(wù)器對(duì)信息進(jìn)行分析,并將結(jié)果發(fā)送回客戶端在瀏覽器上顯示出來(lái)。

二、boa移植步驟

平臺(tái):ubuntu 16.04版本是:boa-0.94.13.tar.gz

1. 下載地址:

http://www.boa.org/

服務(wù)器已經(jīng)無(wú)法訪問(wèn),可以公號(hào)后臺(tái)回復(fù)關(guān)鍵字:boa,獲取壓縮包

2. 源碼解壓

源代碼拷貝到:

/home/peng/boa
peng@ubuntu:~/boa$?tar?-xf?boa-0.94.13.tar.gz?

3. 安裝詞法解析器

$?sudo?apt-get?install?bison
$?sudo?apt-get?install?flex

yacc是一個(gè)文法分析器的生成器,bison即是yacc的GNU版本
Lex和YACC是用于構(gòu)造詞法分析機(jī)和語(yǔ)法解釋器的工具,利用Lex和YACC你可以輕松的構(gòu)造一個(gè)語(yǔ)法解釋器。

4. 修改編代碼

    1. src/compat.h

 

    打開(kāi)文件
src/compat.h

修改

120:?#define?TIMEZONE_OFFSET(foo)?foo##->tm_gmtoff

120:?#define?TIMEZONE_OFFSET(foo)?(foo)->tm_gmtoff
    1. src/log.c
    打開(kāi)文件:
src/log.c

3. boa.c

5. 編譯

peng@ubuntu:~/boa/boa-0.94.13$?cd?src/
peng@ubuntu:~/boa/boa-0.94.13/src$?./configure?--prefix=/home/peng/boa/boa-0.94.13/tmp

peng@ubuntu:~/boa/boa-0.94.13/src$?make
peng@ubuntu:~/boa/boa-0.94.13/src$?sudo?mkdir?/etc/boa
peng@ubuntu:~/boa/boa-0.94.13/src$?sudo?cp?../boa.conf?/etc/boa

6. 修改配置文件boa.conf

修改AccessLog?/var/log/boa/access_log
為#AccessLog?/var/log/boa/access_log

其中,#表示注釋?zhuān)谖募?nèi)部,我們找到#后面的內(nèi)容,然后加上#下面的內(nèi)容即可。

Boa Webserver配置參數(shù)說(shuō)明:

Port:boa服務(wù)器監(jiān)聽(tīng)的端口,默認(rèn)的端口是80。如果端口小于1024,則必須是root用戶啟動(dòng)服務(wù)器。Listen:綁定的ip地址。不使用這個(gè)參數(shù)時(shí),將綁定所有的地址。User:連接到服務(wù)器的客戶端的身份,可以是用戶名或UID。(為什么非要指定為文件的所有者才能訪問(wèn)網(wǎng)頁(yè)呢?nobody用戶也有讀權(quán)限?。?br /> Group:連接到服務(wù)器的客戶端的組,可以是組名或GID。ServerAdmin:服務(wù)器出故障時(shí)要通知的郵箱地址。ErrorLog:指定錯(cuò)誤日志文件。如果路徑?jīng)]有以“/”開(kāi)始,則相對(duì)于ServerRoot路徑。沒(méi)有配置時(shí)默認(rèn)的文件是/dev/stderr。若不想記錄日志,指定文件為/dev/null。AccessLog:設(shè)置存取日志文件,與ErrorLog類(lèi)似。UseLocaltime:設(shè)置使用本地時(shí)間,使用UTC時(shí)注釋這個(gè)參數(shù)。這個(gè)參數(shù)沒(méi)有值。VerboseCGILogs:在錯(cuò)誤日志文件中記錄CGI啟動(dòng)和停止時(shí)間,若不記錄,注釋這個(gè)參數(shù)。這個(gè)參數(shù)沒(méi)有值。ServerName:指定服務(wù)器的名稱(chēng),當(dāng)客戶端使用gethostname + gethostbyname時(shí)返回給客戶端。VirtualHost:虛擬主機(jī)開(kāi)關(guān)。使用此參數(shù),則會(huì)在DocumentRoot設(shè)定的目錄添加一個(gè)ip地址作為新的DocumentRoot來(lái)處理客戶端的請(qǐng)求。如DocumentRoot設(shè)置為/var/www,則http://localhost/ 則轉(zhuǎn)換成/var/www/127.0.0.1/,若注釋此參數(shù),則為/var/www/。DocumentRoot:HTML文件的根目錄(也就是網(wǎng)站的目錄)。UserDir:指定用戶目錄。DirectoryIndex:指定預(yù)生成目錄信息的文件,注釋此變量將使用DirectoryMaker變量。這個(gè)變量也就是設(shè)置默認(rèn)主頁(yè)的文件名。DirectoryMaker:指定用于生成目錄的程序,注釋此變量將不允許列目錄。DirectoryCache:當(dāng)DirectoryIndex文件不存在,而DirecotryMaker又被注釋掉時(shí),將列出這個(gè)參數(shù)指定目錄給客戶端。KeepAliveMax:每個(gè)連接允許的請(qǐng)求數(shù)量。如果將此值設(shè)為" 0 ",將不限制請(qǐng)求的數(shù)目。KeepAliveTimeOut:在關(guān)閉持久連接前等待下一個(gè)請(qǐng)求的秒數(shù)。(秒)。MimeTypes:設(shè)置包含mimetypes信息的文件,一般是/etc/mime.types。DefaultType:默認(rèn)的mimetype類(lèi)型,一般是text/html。CGIPath:相當(dāng)于給CGI程序使用的$PATH變量。SinglePostLimit:一次POST允許最大的字節(jié)數(shù),默認(rèn)是1MB.
AddType: 增加MimeType沒(méi)有指定的類(lèi)型,例: AddType type extension [extension ...]。要使用cgi,必須添加cgi類(lèi)型:AddType application/x-httpd-cgi cgi
Redirect:重定向文件
Aliases:指定路徑的別名。ScriptAlias:指定腳本路徑的虛擬路徑。

三、運(yùn)行測(cè)試

    1. 在 /www下新建index.html文件,并放置名為

yikou.png

    的圖片到image目錄下。文件目錄如下:
root@ubuntu:/www#?tree?./
./
├──?image
│???└──?yikou.png
└──?index.html

1?directory,?2?files

index.html內(nèi)容

<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?>
<html?xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/>
<title>一口Linux</title>
</head>
<body??>
<div?align="center">
?<table?width="900"?border="0">
???<tr><td>
????<form??onsubmit="return?isValidate(myform)"?action="cgi-bin/login.cgi"?method="post">
??用戶名:?<input?type="text"?name="username"?id="username"?>?
??<td>&nbsp;</td>
????<tr><td>
??密??&nbsp;&nbsp;碼:?<input?type="password"?name="userpass"?id="userpass">?
???<td>&nbsp;</td>
????<tr><td>
??<input?type="submit"?value="登錄"?id="button"??>
???</form>

???</td></tr>
?</table>
</div>

???<div?align="center">
????<table?width="900"?height="467"?border="0"?background="./image/yikou.png">
??????<tr>
????????<td?width="126"?height="948">&nbsp;</td>
????????<td?width="351"></td>
????????<td?width="101">&nbsp;</td>
??????</tr>??
??</div>
</body>
</html>

關(guān)于html語(yǔ)法,后面一口君會(huì)寫(xiě)幾篇入門(mén)的教程。

    運(yùn)行boa
root@ubuntu:/home/peng/boa/boa-0.94.13/src#?./boa
root@ubuntu:/home/peng/boa/boa-0.94.13/src#?[29/Jan/2022:15:42:26?+0000]?boa:?server?version?Boa/0.94.13
[29/Jan/2022:15:42:26?+0000]?boa:?server?built?Jan?29?2022?at?07:42:23.
[29/Jan/2022:15:42:26?+0000]?boa:?starting?server?pid=5761,?port?80
    打開(kāi)瀏覽器

輸入地址:

http://192.168.174.128/

只要能ping通boa所在主機(jī)的ip地址的瀏覽器都可以訪問(wèn)。

四、錯(cuò)誤匯總

1.必需要在板子的/etc下建一個(gè)boa目錄(錯(cuò)誤代碼忘了)

2.”can't open boa.conf for reading“
解決:不只要在你本身放置boa的目錄下放入boa.conf配置文件,并且要在板子的/etc/boa下也要放入boa.conf文件,這樣系統(tǒng)在運(yùn)行boa的時(shí)候才能夠讀取到boa.conf文件。

3.“unable to dup2 the error log bad file descriptor”
解決:在boa源碼里,即src文件夾下把log.c中的第73行的if語(yǔ)句注釋掉。

4."unable to dup2 the error log:Bad file descriptor"
解決:在boa.conf里,把“#AccessLog /var/log/boa/access_log”注釋掉(即去掉#號(hào))。

5.“[01/Jan/2031:00:12:25 +0000] boa.c:226 - icky Linux kernel bug!: No such file or directory”
解決:在boa源碼里,即src文件夾下把boa.c中的第226行的if語(yǔ)句注釋掉。

6."gethostbyname:: Resource temporarily unavailable"
解決:把“#ServerName www.your.org.here”的“?!碧?hào)去掉。

7."./boa: 1: syntax error: "(" unexpected"
解決:沒(méi)有修改Makefile,是用gcc編譯的,應(yīng)該改為是arm-linux-gcc編譯。

8.若是頁(yè)面上是:“502 Bad Gateway The CGI was not CGI/1.1 compliant.“
解決:給你要執(zhí)行的cgi可執(zhí)行程序賦個(gè)權(quán)限。chmod 777 filename

9.在中,cgi可執(zhí)行程序的路徑就直接寫(xiě)“cgi-bin/test2.cgi”就能夠了,不要寫(xiě)板子上的絕對(duì)路徑,這樣就重復(fù)了,由于cgi執(zhí)行時(shí)會(huì)自動(dòng)去boa.conf的指定的路徑里找。

10.出現(xiàn)警告:“control reaches end of non-void function”,是由于某個(gè)函數(shù)沒(méi)有return,而函數(shù)定義時(shí)是非void型的。因此須要有個(gè)返回值。好比int cgiMain()這個(gè)函數(shù)就必定要有個(gè)返回值的,不然會(huì)報(bào)這個(gè)錯(cuò)誤。

11.運(yùn)行網(wǎng)頁(yè)時(shí)老出現(xiàn)錯(cuò)誤:“mkstemp:No such file or diectory”
解決:不能用post,只能用get。由于post方式須要新建一個(gè)臨時(shí)文件,這就須要用到mkstemp函數(shù)。這個(gè)函數(shù)是在系統(tǒng)中以惟一的文件名建立一個(gè)文件并打開(kāi),且只有當(dāng)前用戶才能訪問(wèn)這個(gè)臨時(shí)文件。故權(quán)限不夠,或其余什么問(wèn)題都會(huì)報(bào)這個(gè)錯(cuò)誤。那么就用get吧!這里具體緣由細(xì)節(jié)筆者暫時(shí)也不是很清楚...

12.直接寫(xiě)的含有system()函數(shù)的c程序用arm-linux-gcc編譯到板子上的能夠執(zhí)行,而若是寫(xiě)在cgi中的就不必定能執(zhí)行了。由于牽涉到一個(gè)cgi的權(quán)限的問(wèn)題。即便給你的cgi-bin文件夾下的全部cgi可執(zhí)行文件都賦了權(quán)限,也不必定能執(zhí)行。

解決辦法就是看看你的boa.conf中的權(quán)限設(shè)置的如何。這里正確的應(yīng)該是把“User nobody Group nogroup”改成“User root ?Group 0”,不然不能正確執(zhí)行!你會(huì)發(fā)現(xiàn)你的cgi可執(zhí)行程序的其余代碼都執(zhí)行了,卻只有這個(gè)system()函數(shù)沒(méi)有執(zhí)行!

五、修改的參數(shù)說(shuō)明

(1)Group的修改:

修改 Group nogroup
為 Group 0
Group表示連接到服務(wù)器的客戶端的組,可以是組名或GID。

(2)user的修改

修改 User nobody
為 User 0
User:連接到服務(wù)器的客戶端的身份,可以是用戶名或UID。

(3)ScriptAlias的修改

修改ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
為 ScriptAlias /cgi-bin/ /www/cgi-bin/
ScriptAlias:指定腳本路徑的虛擬路徑。

(4)DocumentRoot的修改

修改DocumentRoot /var/www
為DocumentRoot /www
DocumentRoot:HTML文件的根目錄(也就是網(wǎng)站的目錄)。

(5)ServerName的設(shè)置

修改#ServerName www.your.org.here
為 ServerName www.your.org.here
否則會(huì)出現(xiàn)錯(cuò)誤“gethostbyname::No such file or directory”
ServerName:指定服務(wù)器的名稱(chēng),當(dāng)客戶端使用gethostname + gethostbyname時(shí)返回給客戶端。

六、補(bǔ)充

后續(xù)一口君會(huì)在本篇文章基礎(chǔ)之上,繼續(xù)講解HTTP協(xié)議,并基于該服務(wù)器實(shí)現(xiàn)一個(gè)物聯(lián)網(wǎng)綜合項(xiàng)目。

敬請(qǐng)大家關(guān)注!

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫(xiě)文章/發(fā)需求
立即登錄

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開(kāi)發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見(jiàn)教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專(zhuān)利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門(mén)和技術(shù)進(jìn)階。