boa 支持 cgi ,能够为 cgi 程序 fork 出一个进程来执行。 Boa 的设计目标是速度和安全,在其站点公布的性能测试中, boa 的性能要好于 apache 服务器。
随着网络技术的迅猛发展,在嵌入式设备的管理和交互中,基于 Web 方式的应用成为目前的主流,用户可以直接通过远程登录的方式对设备进行管理和维护,大大方便了使用性。下面就为大家讲解一下 boa 服务器在嵌入式 Linux 系统中的移植过程。
一.下载 BOA 源码
BOA 的下载地址: http://www.boa.org/ 进入下载页
一、 BOA 服务器移植
工具链:crotex_a8 参照: http://blog.csdn.net/qq_26058749/article/details/52791702
平台: 处理器:s5pv210 内核: linux-3.21. 解压源码
tar xvf boa-0.94.13.tar.tar
cd boa-0.94.13
2. 进入 src/
./configure 生成 Makefile
修改 Makefile
修改 CC = gcc 为 CC = arm-cortex_a8-linux-gnueabi-gcc //用 cortex-a8 环境(交叉编译器视情况而定)
修改 CPP = gcc -E 为 CPP = arm-cortex_a8-linux-gnueabi-gcc –E3.make 编译
编译一个 linux 下的 c 系统,包含词法和语法分析模块, Linux 上用 bison 和 flex 。
yacc 是一个文法分析器的生成器 ,bison 即是 yacc 的 GNU 版本 .Lex 和 YACC 是用于构造词法分析机和语法解释器的工具,利用 Lex 和 YACC 你可以轻松的构造一个语法解释器。
1. 下载 Lex 和 YACC
Apt-get install bison flex
2. 修改 src/compat.h
找到 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
3. 修改 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");
}*
4. 修改 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
注释掉
if (setuid(0) != -1) {
DIE( ” icky Linux kernel bug! ” );
}
为
#if 0
if (setuid(0) != -1) {
DIE( ” icky Linux kernel bug! ” );
}
#endif
执行 make
然后给 boa 瘦身
Arm-none-linux-gnueabi-strip boa
二、 Boa 服务器配置
1. 创建目录
mkdir /source/rootfs/etc/boa
2. 将 boa 源码目录下的 boa.conf 拷贝到/source/rootfs/etc/boa 目录下
cp boa.conf /source/rootfs/etc/boa
3. 修改配置文件 boa.conf
vim /source/rootfs/etc/boa.conf
(1)Group 的修改
修改 Group nogroup
为 Group 0
(2)user 的修改
修改 User nobody
为 User 0
(3)ScriptAlias 的修改
修改 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
为 ScriptAlias /cgi-bin/ /www/cgi-bin/
(5)DocumentRoot 的修改
修改 DocumentRoot /var/www
为 DocumentRoot /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
(8)以下配置和 boa.conf 的配置有关,都是在 ARM 根文件系统中创建
以下步骤在开发板上进行:
创建 HTML 文档的主目录/www
mkdir /www
创建 CGI 脚本所在录 /www/cgi-bin
mkdir /www/cgi-bin
当不能使用 cgi 时
将 #AddType application/x-httpd-cgi cgi 改为 AddType application/x-httpd-cgi cgi
boa 器测试
将 boa 拷贝到开发板根文件系统的/etc/boa 下
#cp src/boa /source/rootfs/etc/boa
将 ubuntu 下/etc/mime.types 拷贝到开发板根文件系统的/etc 下
#cp /etc/mime.types /source/rootfs/etc
将你的主页 index.html 拷贝到 www 目录下
运行 boa, 然后在主机游览器输入开发板网址
[root@farsight boa]# ./boa
[30/10/2011:19:10:36 +0000] [root@farsight boa]# boa: server version Boa/0.94.13
[30/10/2011:19:10:36 +0000] boa: server built 10 30 2011 at 19:10:36
[30/10/2011:19:10:36 +0000] boa: starting server pid=968, port 80
在主机上启动浏览器,输入 URL 为 http://192.168.0.2 ,访问板上的 BOA 服务,效果如
下: BOA TEST
此时板上串口输出如下信息:
[28/Mar/2010:12:27:16 +0000] request from 192.168.0.1 "GET /favicon.ico HTTP/1.1"
("/var/www/favicon.ico"): document open: No such file or directory
是因为没有该图标文件,不过不影响。
测试完静态页面后,接下来测试 CGI 脚本文件:
在主机上创建一文件 helloworld.c,文件内容如下:
#include<stdio.h>
int main()
{
printf("Content-type:text/html\n\n");
printf("<html>\n");
printf("<head><title>BOA TEST</title></head>\n");
printf("<body>\n");
printf("<h1>BOA CGI TEST</h1>\n");
printf("</body>\n");
printf("</html>\n");
exit(0);
}
然后用交叉编译工具链编译,将得到的 helloworld文件复制到板上的/var/www/cgi-bin目
录下:
编译: arm-crotex_a8-gcc –o helloworld helloworld.c
在浏览器输入 http://192.168.0.2/cgi-bin/helloworld,可以看到如下效果:
BOA CGI TEST
至此, BOA 服务器移植成功!
附 1):boa 配置文件参数说明
boa 的配置文件是/etc/boa/boa.conf。
Port: boa服务器监听的端口,默认的端口是 80。如果端口小于1024,则必须是 root
用 户启动服务器。
Listen:绑定的 ip 地址。不使用这个参数时,将绑定所有的地址。
User:连接到服务器的客户端的身份,可以是用户名或UID。
Group:连接到服务器的客户端的组,可以是组名或GID。
ServerAdmin:服务器出故障时要通知的邮箱地址。
ErrorLog:指定错误日志文件。如果路径没有以“ /”开始,则相对于 ServerRoot路径。
没 有配置时默认的文件是/dev/stderr。若不想记录日志,指定文件为
/dev/null。
AccessLog:设置存取日志文件,与ErrorLog 类似。
UseLocaltime:设置使用本地时间,使用UTC 时注释这个参数。这个参数没有值。
VerboseCGILogs:在错误日志文件中记录CGI 启动和停止时间,若不记录,注释这个参
数。这个参数没有值。
ServerName:指定服务器的名称,当客户端使用gethostname + gethostbyname 时返
回给客户端。
VirtualHost:虚拟主机开关。使用此参数,则会在DocumentRoot 设定的目录添加一个
ip 地址作为新的 DocumentRoot 来处理客户端的请求。如DocumentRoot 设置为
/var/www,则 http://localhost/ 则转换成/var/www/127.0.0.1/, 若注释此参数,则为
/var/www/。
DocumentRoot: HTML 文件的根目录(也就是网站的目录)。
UserDir:指定用户目录。
DirectoryIndex:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker 变量。
这个变量也就是设置默认主页的文件名。