boa服务器移植使用

来源:互联网 发布:java非运行异常有哪些 编辑:程序博客网 时间:2024/06/09 22:21

基于BOA的嵌入式WEB SERVER的设计

 

随着网络技术的不断发展,网络现在已无处不在。Linux最大的好处在于其良好的网络功能,因此在该系统中,我们通过设计WEB 服务器,使用户能通过浏览器访问设备上的Web服务器来远程控制现场设备。嵌入式Linux下,系统资源是非常有限的,因此我们选择Web服务器时,要考虑到其资源有限的特点;Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行,Boa的设计目标是速度和安全。

现在,多数嵌入式Linux的代码中已经包含boa的源代码,在嵌入式Linux下实现Boa只需要对Boa做一些简单的配置和修改。这主要通过对boa.confboa.cmime.types等文件进行修改来实现。服务器中主要包括boaCGI两部分,其中Boa管理着返回客户端的WEB页面,而CGI控制着客户端和服务器端的信息交换,所以我们可以通过编写相应的CGI程序来实现所需要的功能。Boa服务器的实现主要分为两步,boa服务器的移植和CGI程序的设计。

boa 服务器移植

Boa服务器的移植主要分为以下步骤进行:

1)首先下载boa源代码,网上有很多关于boa的源码下载网站,官方网址为:http://www.boa.org/;

2)根据目标平台修改boa的配置文件boa.conf,以及相关的源代码文件boa.c,log.c

3)执行configure生成Makefile,并修改MakefileCCCPP等项,改成与目标平台对应的编译工具;

4)交叉编译源代码,生成可执行文件boa

5)拷贝配置文件boa.conf和可执行程序boa到文件系统中。此时就可以在目标板中运行boa程序了。

 

下面具体介绍一下如何在ARM平台上移植boa服务器:

本系统中采用的boa源码是boa-0.94.13.tar.gz, 将下载的源码拷贝到工作目录解压,

# tar xzf boa-0.94.13.tar.gz

这里注意下系统中需要安装bisonflex等工具,如果在U-BOOT移植中已经在开发主机中安装过这些工具,则可以跳过这一步骤。如果没有,在UBUNTU系统中使用如下命令就可以自动安装:

#sudo apt-get install bison flex

如果不安装这些工具,在执行make生成可执行文件时会出现如下错误

make: yacccomman not found
       make: *** [y.tab.c] error 127

make: lexcomman not found
       make: *** [lex.yy.c] error 127

解压完源代码后,我们进入boa目录,boa的所有源代码及编译文件都放在都放在/src下面,进入该目录

#cd /source/boa-0.94.13/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] 

修改log.c源文件,将以下语句注释掉:

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 deor

boa.c文件的修改:

注释掉下面两句话:

if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }

否则会出现错误:boa.c:211 - getpwuid: No such file or directory

注释掉下面语句:

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

否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory

 

生成可执行文件BOA

首先进入src目录,并执行configure文件,生成Makefile文件

#cd /source/boa-0.94.13/src

#./configure

生成完Makefile后,接下来要做的就是对其做相应的修改,因为我们对应的目标平台是ARM,所以我们要查看我们用到的交叉编译器设置是否正确,本实验中所要修改的具体参数为:

修改CC = gcc 为 CC = arm-softfloat-linux-gnu-gcc

修改CPP = gcc -E 为 CC = arm-softfloat-linux-gnu-gcc -E

在确认以上修改正确后,我们在/src目录下就可以使用make命令来生成我们所需要的可执行文件boa了。

# make
此时会在当前目录下生成一个名为boa的可执行文件,可以通过ls命令查看。

 #ls -l boa
  -rwxr-xr-x 1 root root 187213 2009-07-11 13:44 boa

可以看到生成的可执行文件有180K,对于嵌入式系统来说,我们要尽可能的缩下其大小,因此,我们可以通过瘦身命令strip来删除其中的多余信息,达到缩下体积的目的。

#arm-softfloat-linux-gnu-strip boa

# ls -l boa
 -rwxr-xr-x 1 root root 61052 2009-07-11 13:49 boa

可以看到,boa在瘦身前后的大小差距很大,这对嵌入式系统来说,节省了很大的空间。

 

Boa的配置

在生成好boa以后,还要对boa的配置文件boa.conf做修改,在boa-0.94.13目录下已有一个示例boa.conf,可以在其基础上进行修改。修改如下:

#vi boa.conf

(1)Group的修改

修改 Group nogroup

为 Group 0

(2)user的修改

修改 User nobody

为 User 0

(3)Alias的修改

修改Alias /cgi-bin/ /usr/lib/cgi-bin/

为 Alias /cgi-bin/ /www/cgi-bin/

(5)DoucmentRoot的修改

修改DoucmentRoot /var/www

DoucmentRoot /www

(6)ServerName的设置

修改#ServerName www.your.org.here

为 ServerName www.your.org.here

否则会出现错误“gethostbyname::No such file or directory”

(7)AccessLog修改

修改AccessLog /var/log/boa/access_log

#AccessLog /var/log/boa/access_log

否则会出现错误提示:“unable to dup2 the error log: Bad file deor”

 

配置好boa.conf以后,我们将生成的boa以及修改好的boa.conf文件拷贝到文件系统中相应的目录中:

首先在目标板上创建目录/etc/boa并且把boa 和 boa.conf拷贝到这个目录下

mkdir /etc/boa

创建HTML文档的主目录/www

mkdir /www

创建CGI脚本所在录 /www/cgi-bin

mkdir /www/cgi-bin

 

以下步骤在ubuntu下进行:

boa.conf拷贝到开发板根文件系统的/etc/boa

#cp boa.conf /source/rootfs/etc/boa

boa拷贝到开发板根文件系统的/etc/boa

#cp src/boa /source/rootfs/etc/boa

ubuntu/etc/mime.types拷贝到开发板根文件系统的/etcmime.types的主要功能是控制从网络上发给宿主机端的媒体文件的类型,并且告诉宿主机怎么去处理这些数据。

#cp /etc/mime.types /source/rootfs_hw/etc

这时,我们可以将一个测试网页拷贝到/www目录下,并在开发板上启动boa服务器

/etc/boa/boa

然后在宿主机下,打开浏览器输入开发板的IP地址,就可以看到存放在开发板中的测试主页了,但此时我们点击页面上的按钮时不会执行任何相应,因为现在只是实现了简单的连接,网页并没有相应的CGI程序。在boa 服务器的设计中,最为关键的就是CGI程序的设计,通过CGI程序,就可以实现我们点击页面时所需要的功能。

 

CGI程序设计

该系统所要实现的功能是让客户端使用浏览器向服务器发送HTTP请求,服务器响应客户端的请求后,并引导到指定的脚本程序,对命令进行解析,将信息交给后台——CGI去处理。CGI解析信息后,向远程设备发出控制信息。设备响应后,返回给CGI控制信息,CGI再将信息解析成变量输出到Web Server上,最后客户端得到WebServer发回的页面消息(HTML),就能得到现场设备的运行状态,实现对现场设备的远程监控。

该系统中设计的BOA 服务器的的主要功能如下图所示:

系统功能实现流程图

 

CGI的程序编写包括两个部分: HTML代码和C代码; CGI程序与Boa Web服务器之间通过环境变量、命令行参数和标准输入等方式进行通信。本设计中采用的表单编码信息通过环境变量QUERY_STRING传递。在编写CGI程序时,需要注意:

REQUEST_METHOD

前面介绍过,请求方法有两种:GETPOST。在实验中,我选择GET方法,

如在showsetip()中的代码:

<meta http-equiv=pragma content=no-cache>

<meta http-equiv=expire content=now>

<form method=get action=/cgi-bin/config.cgi>

◆环境变量

在选用不同的方法时,所对应的环境变量也不同。选择GET时,所对应的

环境变量是QUERY_STRING,通过调用库函数getenv()来得到环境变量的具体

值,即querystring=getenv(QUERY_STRING)。系统功能框架图如下:

 

 

3Boa服务器测试

0 0
原创粉丝点击