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处理后的效果
其它网页效果