回首向来萧瑟处,也无风雨也无晴
全部博文(37)
分类: Android平台
2015-11-12 14:53:28
Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。
下面给大家介绍一下Boa服务器移植的具体操作步骤,希望能够有帮助。
我所用的环境是在ubuntu12下,交叉编译工具arm-none-linux-gnueabi-gcc(arm-linux-gcc-4.4.3.tar.gz),运行板子安卓手机(最好是烧的android debug版,这样有root权限操作较为方便一些);
结合网上一些教程结合自己的移植过程中遇到的问题,贴出来;编译之前需要安装bison和flex,这两个工具用,sudo apt-get install就可以安装了;
1.下载Boa源码
下载地址:
最新发行版本: 0.94.13
下载 boa-0.94.13.tar.gz
解压:# tar xzf boa-0.94.13.tar.gz
2.修改一些头文件
(1)修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 修改成 #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
否则会出现错误:
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o] 错误 1
(2)修改 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");
}*/
否则会出现错误:
log.c:73 unable to dup2 the error log:bad file descriptor
(3)修改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
否则会出现错误:boa.c:211 - getpwuid: No such file or directory
注释掉下面语句:
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
为
#if 0
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif
否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory
3、生成Makefile文件
执行:
#cd boa-0.94.13/src
#./configure
4、修改Makefile
在 boa-0.94.13/src目录下修改Makefile
vim Makefile
找到CC,CPP,并添加AR,LD,STRIP,如下
CC = arm-none-linux-gnueabi-gcc
CPP = arm-none-linux-gnueabi-gcc -E
AR = arm-none-linux-gnueabi-ar
LD = arm-none-linux-gnueabi-ld
STRIP = arm-none-linux-gnueabi-strip
找到生成boa和boa_indexer的地方添加两行,如下
boa: $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
$(STRIP) boa
boa_indexer: index_dir.o escape.o
$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
$(STRIP) boa_indexer
5、boa.conf的配置
这一步的工作也在电脑主机上完成。
在boa-0.94.13目录下已有一个示例boa.conf,可以在其基础上进行修改。如下:
#vi 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/ /etc/boa/www/cgi-bin/
(5)DoucmentRoot的修改
修改DoucmentRoot /var/www
为DoucmentRoot /etc/boa/www
(6)ServerName的设置
修改#ServerName
为 ServerName
否则会出现错误“gethostbyname::No such file or directory”
(7)AccessLog修改
修改AccessLog /var/log/boa/access_log
为#AccessLog /var/boa/log/access_log
否则会出现错误提示:“unable to dup2 the error log: Bad file descriptor”
(8)以下配置和boa.conf的配置有关,都是在ARM根文件系统中创建
以下步骤在 安卓手机上进行:
adb root利用root权限启动adb,
adb进入手机中,
cd /system/etc/
mkdir boa
这时候会报错:mkdir failed for boa, Read-only file system
解决办法:
mount -o rw,remount /system
在手机adb下建立以下目录
/etc/boa/用于存放所有关于boa的东西,
/etc/boa/log用于存放日志文件,
/etc/boa/www用于存放静态网页,
/etc/boa/www/cgi-bin/,用于存放cgi脚本程序
将boa.conf拷贝到开发板根文件系统的/etc/boa下
#adb push boa.conf /etc/boa
将src下的boa,boa_indexer拷到手机中的/etc/boa下
#adb push boa /etc/boa
#adb push boa_indexer /etc/boa
将ubuntu下/etc/mime.types拷贝到开发板根文件系统的/etc下
#sudo adb push /etc/mime.types /etc/boa
将你的主页index.html拷贝到www目录下,同样利用adb push
adb下启动boa:
cd /system/etc/boa/
./boa
6、测试
adb下利用netcfg命令查看手机的IP 地址,打开手机的热点共享,然后用一台设备连上热点,打开浏览器输入IP,就可以看到刚才push进去的index.html的网页
OK
需要用cgi测试的话,将cgi程序在本地编译好adb push进www/cgi-bin下,
如果出现下面问题
cgi_header: unable to find LFLF
解决办法:
网上有相应的解决办法,如果还是不行的话,在本地编译cgi程序还是用前面提到的交叉编译工具来编译,并且需要静态编译,因为android使用的bonic libc和libc库还是不一样的