BOA移植

http://hh8582.blog.163.com/blog/static/14041920420114202636840/

BOA (http://www.boa.org)是比较流行的嵌入式Web Server,虽然性能不见得太好,但是胜在简单,整个软件编译完后只有几十K.而且可以支持CGI动态脚本..很容易移植到支持POSIX风格的操作系统上.因此很多ARM-Linux 用于BOA来做Web Server 的演示.

PHP( http://www.php.net/) 是流行的跨平台,动态WEB页面的服务端脚本语言。跟ASP类似,广泛用于BBS,电子商务网站的建设.PHP可以直接支持许多流行的数据库,包括 MySQL、PostgreSQL、Oracle、Sybase、Informix 和 Microsoft SQL Server,在PHP 5,内嵌对SQLite的支持

一直认为PHP这个大家伙,BOA不可能玩得转,也没想到这样的应用,但是在我第一次ARM培训,有朝鲜的学生来在GOOGLE找到一个网址,BOA+PHP for uLinux (http://www.menie.org/georges/uClinux/boa-php.html),试着在嵌入式设备上使用PHP做管理界面,

我在ARM-Linux 试着做一下.这个文档写的很简单,而且版本用的都不是新版本.通过这个文档和分析BOA源码,几经折腾,这个实例还是用最新版的BOA和PHP做成功了.

1.所需源码

实验所需源码下载,和工具

1.       操作系统为arm-linux 2.4或2.6均测试通过

2.       arm-linux-gcc 2.95 或 arm-linux-gcc 3.3.2均可

3.       BOA源码下载Boa -0.94.13 (http://www.boa.org/boa-0.94.13.tar.gz)

4.       PHP 源码下载php-5.2.3.tar.bz2 (http://cn.php.net/get/php-5.2.3.tar.bz2/from/this/mirror)

5.       Php 测试网页http://www.menie.org/georges/uClinux/php-test.tar.gz

 


2.BOA的移植,编译和配置

               l          1.下载Boa源码 ,解压

– 下载地址: http://www.boa.org/, 或者http://sourceforge.net

– tar xvzf boa-0.94.13.tar.gz #解开源码

l          2、生成Makefile文件

–     直接运行src/configure文件

l          3.调整代码

– 实测boa-0.94.13 gcc 2.95.3 可以直接编译通过,而gcc 3.3.2以上版本有几处编译错误,主要是关于时间定义,如用gcc 3.3.2版本,需修改如下

l    util.c 100行 , time_offset = TIMEZONE_OFFSET(t); 编译通不过,需要改成time_offset = 0;

– 在redhat 9.0上当把boa启动用户改为其它用户,如root时经常报错,Boa.c 225-227行下, 执行到DIE那句报错,

 if (setuid(0) != -1) {

            DIE("icky Linux kernel bug!");

        }

l          4、修改Makefile文件

– 在Makefile 29行,加入如下定义

l    CROSS_PREFIX = arm-linux-

– 修改 CC = gcc 为 CC = $(CROSS_PREFIX)gcc

– 修改 CPP = gcc – E 为 CPP = $(CROSS_PREFIX)gcc –E

– 在BOA生成语句,原来44行后加上strip语句,以减少尺寸,内容如下

l     $(STRIP) $@

l          5、编译

–  make

Boa的配置

 

l          Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改。

l          端口

– Port 80,是缺省的HTTP端口,如果有程序占用,则要换一个

l          Group的修改

– 修改 Group nogroup为 Group 0   

l    由于在/etc/group文件中没有nogroup组,所以设成0。

l    在/etc/passwd中有nobody用户,所以User nobody不用修改。在Redhat9.0上为了方便一般改root

l          ErrorLog 的修改

– --原始值发布一个自建的日志文件 ErrorLog /var/log/boa/error_log

– 在嵌入式设备并如此必要,在调试可将其直接注释掉,这样会重定向的缺省错误输出,即串口上

– 正式发布,可直接 设为 ErrorLog /dev/null 即不输出.

l          AccessLog的修改

– 注释时 AccessLog的值 dev/null,调试时,可以将其改为 AccessLog /dev/console 输出到串口

l          ServerName的设置

– 修改 ServerName www.your.org.here为 ServerName <自己的主机名>  

l     注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。

l          DocumentRoot修改

– DocumentRoot /var/www表示静态网页存放目录,用户访问都以为此为根目录

– 修改成你自己的静态网页目录

l          DirectoryIndex的修改

– 缺省网页名字.即用户只输出路径,不带网页名字,BOA自动调用这个网页,缺省是调用index.html,前提DocumnetRoot必须有这个文件存在.

– 缺省值 DirectoryIndex index.html

l          CGIPath的修改

– 表示CGI程序在调用时,BOA查找CGI的路径顺序.为了保险,可以把ScriptAlias 所指向路径加到这里来

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

 

l          scriptAlias的修改

– 修改 scrīptAlias /cgi-bin/  /usr/lib/cgi-bin/

– 为 scrīptAlias /cgi-bin/  <自已CGI程序所在目录>

l    Boa所有的CGI程序应该放在这个目录下,注意最后的一个/,必须要有!

 

BOA 运行前准备

l          如果采用缺省日志(即配置文件ErrorLog 所指向的)还需要创建日志文件所在目录/var/log/boa,

l          创建静态网页HTML文档的主目录,将静态网页存入该目录下,(即DocumentRoot指向的目录)

l          创建CGI脚本所在目录,将cgi的脚本和程序存放在该目录下.(即ScriptAlias 所指向的目录)

l          另外还要将mime.types文件复制/etc目录下,通常可以从linux主机的 /etc目录下直接复制即可。

l          执行时,如果boa.conf 在/etc/boa下,直接运行boa即可. 但boa.conf  在其它目录,需要-c 指示boa.conf所在目录

– 如果boa和boa.conf 在同一目录下,运行 ./boa –c .即可

3.BOA 动态页面支持原理 

BOA 采用最早的一种动态页面技术,即CGI技术. CGI是Common Gateway Interface的缩写 .

网页是用HTML来表达的,但只能显示静态内容.为了让网页显示动态内容,多种技术被开发出来。CGI是最早一种,随后ASP,PHP,JSP等新的动态网页层出不穷.

 

CGI 应用程序读取从Web 服务器标准输出(stdout)传递来的各种信息,客户端的请求进行解释和处理,并用自己标准输出把处理结果发徐Web 服务器

 

CGI程序根据用户在前台输入的数据和本身状态,输出不同的结果,这样就形了动态网页.

因此,任何支持接收标准输入和标准输出的的程序都可以是CGI程序.只要标准输出的内容符合.HTML语法.因此,Linux Shell 脚本,C程序,Perl ,TCL等各种语言都能开发CGI程序.

 

CGI程序的缺点是每一次执行一个CGI程序都是调用了一个单独进程,占用系统资源大.并且开发效率也不高.因此在桌面和服务器上,均采用更新一代的动态页面解释语言.如ASP,PHP,JSP等等.但在嵌入式领域,很多情况下还是采用CGI这种比较简单的实现模式.

 

PHP是目前比较流行的动态页面平台.应用很多大型网站的开发.主要运行模式已经不是CGI模式,但仍然保留一个CGI接口程序,这就便BOA能够使用PHP的技术原理.

 

在所附的源码中,分别为Shell 脚本和C程序演示显示动态页面的使用

 

综上所述,BOA CGI程序有如下要求:

–                 从能从标准输入读取数据,并能用标准输出输出结果

–                 放在boa.conf, scriptAlias所指示的目录下,并有执行权限

–                 可以是脚本,或C程序

 

BOA判断CGI程序原理

l          BOA是通过用户发来URL(即浏览器里输入的网址)来判断是静态网页还是需要用CGI来处理

–                 如果url的路径包括cgi-bin 这们路径(即scriptAlias前半部分),那么BOA认为这是是需要cgi程序处理.并把它后面的参数变成cgi程度的命令行参数去执行.否则是静态网页

–                 如 http://192.168.0.146:8081/cgi-bin/hello.cgi

l                                        出现了cgi-bin,BOA把hello.cgi执行起来,如果hello.cgi正好是一个CGI程序,则进入CGI处理流程

4.PHP 与BOA配合.

4. 1 编译

    用在php目录下.执行  ./configure --host=arm-linux

   make.

   php 4.4.7编译出来的CGI版的程序是 sapi/cgi/php,而php 5.2.3编译出来的CGI版程序是 sapi/cgi/php-cgi,而老版本是编译出来CGI程序名字是php,两个有所差别.

 

 4.2 PHP 和BOA的配合

以下,假设整个项目所需的程序,PHP,BOA,SQLITE 都位于 /usr/local/arm-web 的php,boa,sqlite 下面

测试网页在www 下

所有的CGI程序在cgi-bin 下面

最终的测试程序 php-cgi,

PHP 测试网页(index.php….)必须放在DocumnetRoot 所指向的目录,在本项目就是www下,不能是cgi-bin目录下,(这是分析很久的程序和调试程序才得出这个结果,这是因为BOA把文档),而php的 cgi版本的程序放在 cgi-bin目录下.

 4.3 用现成源码测试

   1.                                本文档中所有文档所带源码和几个简单的示例代码.,建议解压在/usr/local下,解压后会生成arm-web 目录

             tar xvzf arm-web.tgz –C /usr/local

2.                                并且由shell脚本build.sh自动将上述过程,执行,编译,用run.sh 脚本来运行.运行后,会使用TCP 8080端口

3.                                假设开发板IP地址为 192.168.1.230 ,则在PC的浏览器上地址栏上输入 http://192.168.1.230:8080 即可看到所有测试项

4.4 测试结果

没有经过PHP处理的网页



经过BOA+PHP处理后的效果



其它网页效果

 

你可能感兴趣的:(BOA移植)