Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145153
  • 博文数量: 37
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-28 11:52
个人简介

回首向来萧瑟处,也无风雨也无晴

文章存档

2016年(1)

2015年(36)

我的朋友

分类: 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

然后make

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库还是不一样的

阅读(2081) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~