物联网之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

否则会出现错误:

扫描二维码关注公众号,回复: 2409333 查看本文章

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目录下

 再次点击登录,即可正常跳转

猜你喜欢

转载自blog.csdn.net/weixin_39148042/article/details/81221965