博客 > web服務(wù)器怎么搭建?從頭搭建一個(gè)嵌入式web服務(wù)器
瀏覽量:1803次評(píng)論:0次
作者:銳成網(wǎng)絡(luò)整理時(shí)間:2024-05-22 15:50:53
在當(dāng)今互聯(lián)網(wǎng)時(shí)代,web服務(wù)器是可以處理瀏覽器等Web客戶端的請(qǐng)求并返回相應(yīng)響應(yīng)的重要程序,我們平時(shí)訪問的網(wǎng)站時(shí)都離不開它web服務(wù)器的身影。搭建一個(gè)web服務(wù)器來處理響應(yīng)請(qǐng)求是常見的事,那么web服務(wù)器怎么搭建?本文內(nèi)容將詳細(xì)介紹如何從頭搭建一個(gè)嵌入式web服務(wù)器-boa服務(wù)器。
一、什么是boa服務(wù)器?
BOA是一款非常小巧的Web服務(wù)器,源代碼開放、性能優(yōu)秀、支持CGI通用網(wǎng)關(guān)接口技術(shù),特別適合應(yīng)用在嵌入式系統(tǒng)中。
BOA服務(wù)器主要功能是在互聯(lián)嵌入式設(shè)備之間進(jìn)行信息交互,達(dá)到通過網(wǎng)絡(luò)對(duì)嵌入式設(shè)備進(jìn)行監(jiān)控,并將反饋信息自動(dòng)上傳給主控設(shè)備的目的。它是基于HTTP超文本傳輸協(xié)議的,Web網(wǎng)頁是Web服務(wù)最基本的傳輸單元。
嵌入式Web服務(wù)的工作基于客戶機(jī)/服務(wù)器計(jì)算模型,由Web瀏覽器(客戶機(jī))和Web服務(wù)器(服務(wù)器)構(gòu)成,也即著名的B/S結(jié)構(gòu)。運(yùn)行于客戶端的瀏覽器首先要與嵌入式Web服務(wù)器BOA端建立連接,打開一個(gè)套接字虛擬文件,此文件建立標(biāo)志著SOCKET連接建立成功然后客戶端瀏覽器通過套接字SOCKET以GET或者POST參數(shù)傳遞方式向Web服務(wù)器提交請(qǐng)求,Web瀏覽器提交請(qǐng)求后,通過HTTP協(xié)議傳送給Web服務(wù)器。Web服務(wù)器接到請(qǐng)求后,根據(jù)請(qǐng)求的不同進(jìn)行事務(wù)處理,返回HTML文件或者通過CGI調(diào)用外部應(yīng)用程序,返回處理結(jié)果。
服務(wù)器通過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ā)送回客戶端在瀏覽器上顯示出來。
二、boa移植步驟
平臺(tái):ubuntu 16.04版本是:boa-0.94.13.tar.gz
1. 下載地址:
http://www.boa.org/
服務(wù)器已經(jīng)無法訪問,可以公號(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ī)和語法解釋器的工具,利用Lex和YACC你可以輕松的構(gòu)造一個(gè)語法解釋器。
4. 修改編代碼
src/compat.h 打開文件
src/compat.h
修改
120: #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
為
120: #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
src/log.c 打開文件:
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
其中,#表示注釋,在文件內(nèi)部,我們找到#后面的內(nèi)容,然后加上#下面的內(nèi)容即可。
三、運(yùn)行測(cè)試
在 /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> </td>
<tr><td>
密 碼: <input type="password" name="userpass" id="userpass">
<td> </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"> </td>
<td width="351"></td>
<td width="101"> </td>
</tr>
</div>
</body>
</html>
關(guān)于html語法,后面一口君會(huì)寫幾篇入門的教程。
運(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
打開瀏覽器
輸入地址:
http://192.168.174.128/
只要能ping通boa所在主機(jī)的ip地址的瀏覽器都可以訪問。
四、錯(cuò)誤匯總
1.必需要在板子的/etc下建一個(gè)boa目錄
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語句注釋掉。
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語句注釋掉。
6."gethostbyname:: Resource temporarily unavailable" 解決:把“#ServerName www.your.org.here”的“#”號(hào)去掉。
7."./boa: 1: syntax error: "(" unexpected" 解決:沒有修改Makefile,是用gcc編譯的,應(yīng)該改為是arm-linux-gcc編譯。
8.若是頁面上是:“502 Bad Gateway The CGI was not CGI/1.1 compliant.“ 解決:給你要執(zhí)行的cgi可執(zhí)行程序賦個(gè)權(quán)限。chmod 777 filename
9.cgi可執(zhí)行程序的路徑就直接寫“cgi-bin/test2.cgi”就能夠了,不要寫板子上的絕對(duì)路徑,這樣就重復(fù)了,由于cgi執(zhí)行時(shí)會(huì)自動(dòng)去boa.conf的指定的路徑里找。
10.出現(xiàn)警告:“control reaches end of non-void function”,是由于某個(gè)函數(shù)沒有return,而函數(shù)定義時(shí)是非void型的。因此須要有個(gè)返回值。好比int cgiMain()這個(gè)函數(shù)就必定要有個(gè)返回值的,不然會(huì)報(bào)這個(gè)錯(cuò)誤。
11.運(yùn)行網(wǎng)頁時(shí)老出現(xiàn)錯(cuò)誤:“mkstemp:No such file or diectory” 解決:不能用post,只能用get。由于post方式須要新建一個(gè)臨時(shí)文件,這就須要用到mkstemp函數(shù)。這個(gè)函數(shù)是在系統(tǒng)中以惟一的文件名建立一個(gè)文件并打開,且只有當(dāng)前用戶才能訪問這個(gè)臨時(shí)文件。故權(quán)限不夠,或其余什么問題都會(huì)報(bào)這個(gè)錯(cuò)誤。那么就用get吧!這里具體緣由細(xì)節(jié)筆者暫時(shí)也不是很清楚...
12.直接寫的含有system()函數(shù)的c程序用arm-linux-gcc編譯到板子上的能夠執(zhí)行,而若是寫在cgi中的就不必定能執(zhí)行了。由于牽涉到一個(gè)cgi的權(quá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ù)沒有執(zhí)行!
五、修改的參數(shù)說明
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ù)器的名稱,當(dāng)客戶端使用gethostname + gethostbyname時(shí)返回給客戶端。
重要聲明:本文來自一口Linux,經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有,不代表銳成觀點(diǎn),轉(zhuǎn)載的目的在于傳遞更多知識(shí)和信息。
相關(guān)文章推薦
2025-05-27 11:53:22
2024-08-20 17:58:16
2024-08-19 17:49:29
2024-08-19 10:23:28
2024-08-16 17:06:33
熱門工具
標(biāo)簽選擇
閱讀排行
我的評(píng)論
還未登錄?點(diǎn)擊登錄