1. 程式人生 > >物聯網之boa伺服器

物聯網之boa伺服器

一、移植boa伺服器

原始碼下載:boa-0.94.13.tar.gz 連結:https://pan.baidu.com/s/13pSIqRU47xkjInVfFDMorQ 密碼:m7eg

解壓原始碼:tar -xvf boa-0.94.13.tar.gz

安裝需要工具bison,flex:sudo apt-get install bison flex

修改 src/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] 錯誤 1

修改 src/log.c

註釋掉

if (dup2(error_log, STDERR_FILENO) == -1) {
                         DIE("unable to dup2 the error log");
                   }

為:

/*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 descriptor

修改src/boa.c

註釋掉下面兩句話:

if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        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

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

註釋掉下面語句:

if (setuid(0) != -1) {
                        DIE(”icky Linux kernel bug!”);
        }

#if 0
         if (setuid(0) != -1) {
                        DIE(”icky Linux kernel bug!”);
                }

#endif

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

修改src/defines.h

將 #define SERVER_ROOT "/etc/boa"

修改為: #define SERVER_ROOT "/boa"    //此處為boa伺服器位置,根據自己設定的位置填寫正確

(這樣boa程式啟動時會在/boa目錄下尋找boa.conf配置檔案,並且將/boa資料夾作為伺服器的根目錄)。

執行./configure

cd boa-0.94.13/src/

執行./configure

這是根據configure.in檔案進行一系列的配置,生成config.status,configure,和Makefile檔案。

如果無法執行,考慮許可權,修改該目錄下的configure的屬性為可執行 chmod 755 configure

修改Makefile

修改CC = gcc 為 CC = arm-linux-gcc

修改CPP = gcc -E 為 CC = arm-linux-gcc -E

make編譯

為生成的二進位制檔案boa瘦身

arm-linux-strip boa
      ls -l boa
       -rwxr-xr-x 1 david david 61052 2009-05-31 13:51 boa

可以發現boa的大小前後差距很大這為我們節省了很大的空間

Boa的配置(修改boa.conf檔案)

vi boa.conf, //幾乎全部指定到boa的目錄下,這樣方便我們進行管理

重新指定一些檔案的生成路徑,因為重新指定這些路徑後會幫助我們深刻的理解關於boa伺服器的工作機制

Port  80  

User  0  

Group 0  

# bind呼叫的IP地址,一般註釋掉,表明繫結到INADDR_ANY,通配於伺服器的所有IP地址

#Listen 192.68.0.5

##### error_log和access_log會自動生成,只要指定生成路徑就可以了。  

ErrorLog /boa/log/error_log  

AccessLog /boa/log/access_log    

##### 存放HTML檔案的根路徑  

DocumentRoot /boa/www  

UserDir public_html    

##### 預設頁面,若輸入http://127.0.0.1/則會自動返回給瀏覽器預設頁面index.html  

DirectoryIndex index.html    

##### 保持預設  

DirectoryMaker /boa/boa_indexer   //被修改

KeepAliveMax 1000  

KeepAliveTimeout 10  

MimeTypes /boa/mime.types   //被修改

DefaultType text/plain    

#####指定傳給cgi程式的PATH環境變數  

CGIPath /bin:/usr/bin:/usr/local/bin   

#####保持預設  

Alias /doc /usr/doc   

#####如果輸入http://127.0.0.1/cgi-bin/test.cgi, 則boa伺服器會到/boa/cgi-bin中尋找test.cgi程式。  

ScriptAlias /cgi-bin/ /boa/cgi-bin/  

 建立安裝目錄

mkdir -p /boa /boa/www /boa/cgi-bin /boa/log

將需要的檔案複製到安裝目錄中

將boa-0.94.13/src目錄下生成的boa、boa_indexer二進位制檔案複製到/boa下

將boa-0.04.13目錄下的boa.conf檔案複製到/boa下

將/etc/mime.types複製到/boa目錄下

此時整個boa伺服器移植完成,但是還需要測試boa伺服器是否移植成功

測試boa伺服器移植是否成功

需要用到cgi檔案 和 html檔案(都是測試檔案,可以自己寫);也可以網上下載。

cgi檔案下載:連結:https://pan.baidu.com/s/1k_tYw1D3alir_X-uCN9Jeg 密碼:cksr

html檔案下載:連結:https://pan.baidu.com/s/1bwRGrI8JjKrTILX8nwbSLg 密碼:3bx5

將解壓得到的cgi-bin目錄(存放cgi相關的檔案)和www目錄(存放html相關的檔案)直接覆蓋boa伺服器中的cgi-bin和www目錄

板子上電,啟動boa伺服器

在虛擬機器的瀏覽器中輸入板子的ip地址,可以看到測試網頁正常開啟,此時boa伺服器才真正的移植成功

二、在板子和網頁上實現自己想要的功能

將自己編寫的html檔案新增到boa伺服器的www目錄中

html檔案下載地址:連結:https://pan.baidu.com/s/15djVWst0fvbTLMeWC1i-Fg 密碼:suho

解壓得到的www目錄可以直接覆蓋boa伺服器中的www目錄,也可以一個一個的複製過去:

下載CGIC庫(CGIC是一個功能比較強大的支援CGI開發的標準C庫,並支援Linux, Unix 和Windows等多作業系統)

連結:https://pan.baidu.com/s/1ZH7ErIzbi0UXGsb0tMTmpA 密碼:rorq

 # tar xzf cgic205.tar.gz

 # cd cgic205

搭建交叉編譯環境(預設x86平臺)

 修改Makefile檔案,找到CC=gcc,將其改成CC=arm-linux-gcc,

 找到AR=ar,將其改成AR=arm-linux-ar,

 找到RANLIB=ranlib,將其改成RANLIB=arm-linux-ranlib。

 找到gcc cgictest.o -o cgictest.cgi ${LIBS},將其改成$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},

 找到gcc capture.o -o capture ${LIBS},將其改成$(CC) $(CFLAGS) capture.o -o capture ${LIBS},

 儲存退出。

修改後的Makefile
CFLAGS=-g -Wall
#CROSS_COMPILE=
CROSS_COMPILE=arm-linux-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
RANLIB=$(CROSS_COMPILE)ranlib
LIBS=-L./ -lcgic

all: libcgic.a cgictest.cgi capture

install: libcgic.a    //可以執行 make install 命令  目標
        cp libcgic.a /usr/local/lib
        cp cgic.h /usr/local/include
        @echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include.

libcgic.a: cgic.o cgic.h  //libcgic.a 依賴於 cgic.c 和 cgic.h  
        rm -f libcgic.a
        $(AR) rc libcgic.a cgic.o  //一個歸檔命令  ar rc libcgic.a  
        $(RANLIB) libcgic.a  //“ranlib”來對靜態庫的符號索引表進行更新。 

#mingw32 and cygwin users: replace .cgi with .exe

cgictest.cgi: cgictest.o libcgic.a
        $(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}
        #gcc cgictest.o -o cgictest.cgi ${LIBS}

capture: capture.o libcgic.a
        $(CC) $(CFLAGS) capture.o -o capture ${LIBS}
        #gcc capture.o -o capture ${LIBS}

clean:
        rm -f *.o *.a cgictest.cgi capture

根據Makefile編譯可以看出,有兩個拷貝的過程: cp libcgic.a /usr/local/lib  cp cgic.h /usr/local/include

兩個命令的學習:

ar命令可以用來建立、修改庫,也可以從庫中提出單個模組。庫是一單獨的檔案,

裡面包含了按照特定的結構組織起來的其它的一些檔案(稱做此庫檔案的member)。

原始檔案的內容、模式、時間戳、屬主、組等屬性都保留在庫檔案中。

cgi檔案分析

cd cgic205-arm

裡面有大約10個檔案:

cgic.h:標頭檔案;

cgic.c:CGIC的原始碼檔案;

cgictest.c:CGIC庫的作者提供的一個CGI程式例子;

capture.c:用於除錯CGI程式的工具;

Makefile:安裝CGIC的指令碼檔案;

可以看到,整個庫實際上就是cgic.c一個檔案,可以說是非常的精煉。

可以把CGIC安裝為作業系統的一個動態連結庫,這樣我們每次編譯的時候,就不需要有cgic.c這個原始檔了。

但是由於需要(以後將會看到),我們將修改cgic.c程式碼,所以我們不把它安裝進系統。每次編譯的時候,只要把cgic.c和cgic.h放到當前資料夾就好了。

make編譯cgi原始碼

make得到的CGIC庫libcgic.a,我們通過除錯輔助程式capture和測試程式cgictest.cgi,來驗證生成CGIC庫的正確性。

將capture和cgictest.cgi拷貝到主機的/nfs/rootfs/boa/cgi-bin目錄下。

cp capture cgictest.cgi  /nfs/rootfs/boa/cgi-bin

注:本人實際測試時的目錄為 /nfs/rootfs/boa/cgi-bin,可根據自己的實際 情況更改目錄。

測試安裝

在開始編寫你自己的CGI程式之前,一定要先走通他的例子程式,免得後來程式出錯的時候還不知道是配置有問題,還是你的程式程式碼有問題。

我們用他自帶cgictest.c來實現自己的第一個C語言CGI程式。

先執行boa伺服器

 再虛擬機器的瀏覽器位址列輸入http://192.168.31.66/cgi-bin/cgictest.cgi

測試地址為板子的實際ip地址。

可以看到頁面,表示CGIC庫和測試指令碼都移植成功。cgictest.cgi比較完整的展現了CGIC庫的功能,

在開發基於CGIC庫的CGI程式前最好先掌握cgictest.cgi程式,這個應用程式是十分重要的參考範例。

將自己編寫的C語言CGI程式拷貝到CGIC庫中

連結:https://pan.baidu.com/s/1Y4m7aOHnOAcylmEO4xOtMg 密碼:wkgr

其中Makefile檔案直接覆蓋即可

 修改Makefile檔案的拷貝路徑(改為自己的路徑)

 make編譯,如果CGIC庫中沒有out目錄,則新建

 make install將生成的cgi檔案移動到out目錄,然後再將out目錄下的cgi檔案拷貝到boa伺服器的cgi-bin檔案中

 

 將自己編寫的c程式編譯生成板子可執行的檔案:

編寫的c程式下載連結:https://pan.baidu.com/s/1SUctszfKDrvWdrqPi0tFCQ 密碼:kz78

make

 將生成的可執行檔案smart_storage拷貝到 /nfs/rootfs/目錄下

板子上電,後臺執行可執行檔案smart_storage 和 boa 伺服器

虛擬機器的瀏覽器中輸入板子的ip地址,網頁正常彈出,但是點選登入不能進入登入之後的頁面

修改login.c檔案中的ip地址,將ip地址改為板子的實際ip地址

 重新拷貝cgi相關檔案到cgi-bin目錄下

 再次點選登入,即可正常跳轉