一、BOA嵌入式服务器移植
1. BOA简介
- Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右,作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行,Boa的设计目标是速度和安全,是目前嵌入式领域比较流行的web服务器,智能家居的网关大部分也采用该web服务器作为主要架构。
2. 编译BOA
- 获取boa源代码
- 生成Makefile:进入boa源代码的src目录,执行./configure命令即可生成编译boa所必须的配置文件以及一些源代码和Makefile文件;
- 修改Makefile:找到CC=gcc,将其改成CC = arm-linux-gcc,再找到CPP = gcc –E,将其改成CPP = arm-linux-gcc –E,并保存退出。
- 修改源代码:Boa本身代码是存在些许bug的,我们要对这些bug进行修复。之所以这里能直接给出代码修改的步骤,是由于我们之前做了大量的实验,已经可以断定哪里的代码出了问题,这样避免大家少走弯路。
- a. 将util.c的第100行注释掉,改为 //time_offset = TIMEZONE_OFFSET(t);time_offset = 0;保留以前的代码,将其注释就可以,以便以后排查原来代码内容。不修改这里会出现以下错误:util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
- b. 将boa.c中210行到229行代码注视掉;否则boa运行的时候会出现DIE的现象,打印各种找不到密码的信息而停止进程。注释如下:
#if 0
if (passwdbuf == NULL)
{
DIE("getpwuid");
}
… …
/* test for failed-but-return-was-successful setuid
* http://www.securityportal.com/list-archive/bugtraq/2000/Jun/0101.html
*/
if (setuid(0) != -1)
{
DIE("icky Linux kernel bug!");
}
#endif
- 编译完以后将可执行文件boa复制到开发板的根文件系统下即可。
3. 配置BOA
- 虽然前面已经编译好了可在ARM平台运行的boa服务器程序,但是boa要真正能工作的话,还必须要有合适的配置文件才可以。而在boa源代码的顶层目录已经有了一个默认的boa.conf配置文件,但是我们需要针对自己的情况对一些配置选项进行修改,可以用boa.conf作为基础进行修改,将他复制到开发板文件系统的/etc/boa目录(自己新建)下。这里列出了常用的配置选项和含义:
选项名 |
说明 |
Port |
监听的端口号,缺省都是80,一般无需修改。 |
User |
作为哪个用户组运行,即它拥有该用户组的权限,一般都是nobody,需要/etc/passwd中有nobody用户。所以这里我们将其注释掉。 |
Group |
作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup组。也注释掉。 |
ErrorLog |
错误日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用/dev/null。设置为/dev/console表示错误信息打印到终端。在调试阶段建议改成/dev/console,调试稳定以后改成null或者具体的文件。 |
AccessLog |
访问日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用/dev/null或直接注释掉。 |
ServerName |
服务器名字。 |
DocumentRoot |
HTML文档的主目录,非常重要,boa毕竟是为网页服务的,所以这个参数指明了开发板上什么地方有网页文件,如果不指定正确的html文件的存放路径,访问会出错。如果没有以/开始,则表示从服务器的根路径开始。这里拷贝我们提供的web目录到开发板的文件系统根目录即可,因此这里设置为/web/。 |
DirectoryIndex |
HTML目录索引的文件名,也是没有用户只指明访问目录时返回的文件名。 |
KeepAliveMax |
一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用。 |
KeepAliveTimeout |