Boa服务器移植到x86平台
Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。
Boa服务器的下载地址为: 。下面是我参考网上一些文档,移植Boa服务器到x86平台(linux虚拟机)上的具体过程。
一、移植环境
操作系统:Red Hat Enterprise Linux 5
交叉工具链:arm-linux-gcc-4.3.2
Boa服务器版本:boa-0.94.13
二、下载Boa源码包,将其进行解压,并进行配置和编译。
1、下载boa-0.94.13.tar.gz,解压:# tar zxvf boa-0.94.13.tar.gz
2、进入到boa-0.94.13下的src目录:# cd boa-0.94.13/src
3、执行:# ./configure
4、执行:#make
编译会出现错误:
util.c: 100: 1: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error1
5、修改src/compat.h,找到代码120行:
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改为: #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
6、先清除刚刚编译错误生成的一些目标文件:# make clean
再重新进行编译:# make
此时会在src目录下生成boa可执行文件。
三、修改配置文件boa.conf
1、建立/etc/boa目录,并复制boa-0.94.13目录下的boa.conf到/etc/boa目录下:
# mkdir /etc/boa
# cp boa.conf /etc/boa
2、修改boa.conf文件:# vi /etc/boa/boa.conf
(1)修改访问权限:
代码48行:User nobody,修改为:User 0
代码49行:Group nogroup,修改为:Group 0
(2)设定日志目录:
可以根据自己的情况设置日志目录,我这里使用默认的路径:
ErrorLog /var/log/boa/error_log
AccessLog /var/log/boa/access_log
(3)设置html文件目录: DocumentRoot /var/www/html
(4)设置默认首页: DirectoryIndex index.html
(5)设置cgi脚本目录:
将ScriptAlias /cgi-bin/ /usr/lib/cgi-bin,修改为:
ScriptAlias /cgi-bin/ /var/www/cgi-bin
四、根据上一步的配置创建相应的文件目录以存放文件:
(1)根据日志目录的设置建立/var/log/boa目录。
(2)根据html目录的设置建立/var/www/html目录,存放html文件,包括index.html文件。
(3)根据cgi目录的设置建立/var/www/cgi-bin文件夹,存放一些用来测试的cgi脚本。
五、运行boa程序
我在/var/www/html目录下存放了Boa的主页,将其命名为index.html后,在Windows下打开浏览器,输入 (虚拟机的IP地址)进行测试:
五、常见错误
这些错误内容可查看/var/log/boa/error_log文件。
1、gethostbyname:: No such file or directory
解决办法: 修改boa.conf,去掉下面语句前的注释符号“#”:
#ServerName
即修改为:
ServerName
2、util.c:100:1:pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error1
解决办法: 修改 src/compat.h ,找到:
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改为:
#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
3、boa.c:211 - getpwuid: No such file or directory
解决办法: 修改 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
4、boa.c:228 - icky Linux kernel bug!: No such file or directory
解决办法: 修改 src/boa.c 注释掉下面语句:
if(setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
即修改为:
#if 0
if(setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
#endif
5、boa.c:226 - icky Linux kernel bug!: Success
解决办法:修改boa.conf,将修改过的访问权限:
User 0
修改为默认的:
User nobody
6、log.c:73 unable to dup2 the error log:bad file descriptor
解决方法(建议采用方法1):
方法 1> 确定日志目录对与所有用户都具有可读/写的权限;
方法 2> 修改 src/log.c,注释掉下面语句:
if(dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
即修改为:
#if 0
if(dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
#endif
参考文献: web服务器Boa移植手册.pdf
阅读(2658) | 评论(0) | 转发(0) |