BOA服务器的移植

介绍在Ubuntu12.04和iTop4412上BOA服务器的移植

Posted by Jerry Chen on July 22, 2019

概述

BOA是一种非常小巧的web服务器,用来负责处理客户端或者是浏览器端的http请求,因为其特性小巧,性能优秀,故而适合应用于嵌入式系统。

用户通过网页客户端(浏览器)实现对服务端(嵌入式系统)的查询访问和下发数据命令。

A9开发板+CGI(提供接口的进程)+BOA构成服务端,浏览器或者应用程序够成客户端。

查看boa进程

boa在linux系统中一守护进程的方式存在,Linux 中一般把守护进程放在/etc/init.d/中,启动服务时的命令一般是 /etc/init.d/* {start|stop|status|restart},需要写一个脚本放在里面。

守护进程的 PPID (父进程 ID)是 1。执行命令ps -ef 用于查看全格式的全部进程,然后把结果用“ ”送到grep程序中筛选含有”boa”的进程信息,即ps -ef | grep "boa"

如果要终止boa进程,找到后kill即可,比如kill -9 11573

更简单的方法得到pid:pidof boa

BOA移植过程

简单描述为:

1.1.得到源码;1.2.修改宏配置;1.3.编译得到可执行程序;

2.1.建立工作目录;2.2.拷贝文件到工作目录;2.3.修改配置;2.4.新建页面;2.5.运行执行程序;

3.1.把目标执行程序加入到开机启动(可选);

移植到Ubuntu12.04

第一部分-源码处理
  1. 下载boa源码

    因为官网已经打不开,所以百度搜索“boa-0.94.13”进行下载,或者点击这里

  2. 解压文件

    拷贝到Ubuntu中(任意目录,目的仅是生成2个可执行文件),然后进行解压。

    1
    
    tar -xvf boa-0.94.13.tar.gz
    
  3. 在解压目录的src目录下修改defines.h文件中的SERVER_ROOT宏指定一个目录,这里指定为根目录下的“/boa”目录,后面步骤会新建它作为服务器工作目录,运行boa时首先会在该目录下查找boa.conf文件

    1
    2
    
    cd ./boa-0.94.13/src/
    vim defines.h
    

  4. 同样的在解压目录的src目录执行编译配置文件configure,执行后会生成新的Makefile文件。Makefile文件中包含了编译器信息,如果不是gcc就进一步修改为自己的配置。这里不改。

    1
    
    ./configure
    
  5. 执行make进行编译,执行成功后会生成后面需要的两个可执行文件:boaboa_indexer

    1
    
    make
    

    默认编译会出错,修改当前目录下compat.h中TIMEZONE_OFFSET(foo)宏定义,然后再次make即可,见下图:

这样第一部分就结束了,主要得到了三个文件:解压目录下的src目录中的可执行文件boaboa_indexer,解压目录下的boa.conf(是boa执行文件运行的配置文件)。

第二部分-BOA配置
  1. 创建工作目录“/boa”,需要和第一部分中的SERVER_ROOT宏指定的相同

    1
    
    mkdir -p /boa /boa/www /boa/cgi-bin /boa/log
    
  2. 复制必要的文件到工作目录

    1
    2
    3
    4
    5
    6
    
    cd boa-0.94.13解压目录
       
    cp boa.conf /boa/
    cp src/boa /boa/
    cp src/boa_indexer /boa/
    cp /etc/mime.types /boa/
    
  3. 在工作目录下修改boa的执行配置文件boa.conf

    1
    2
    3
    4
    5
    
    cd /boa
       
    cp boa.conf boa.conf.bak
    cat boa.conf.bak | grep -v "#" | grep -v "^$" > boa.conf
    vim boa.conf
    

    修改boa.conf为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    Port 80
    User jerry
    Group jerry
    ErrorLog /boa/log/error_log
    AccessLog /boa/log/access_log
    #ServerName www.your.org.here
    DocumentRoot /boa/www
    UserDir public_html
    DirectoryIndex index.html
    DirectoryMaker /boa/boa_indexer
    KeepAliveMax 1000
    KeepAliveTimeout 10
    MimeTypes /boa/mime.types
    DefaultType text/plain
    CGIPath /bin:/usr/bin:/usr/local/bin
    Alias /doc /usr/doc
    ScriptAlias /cgi-bin/ /boa/cgi-bin/
    

  4. 新建网页根目录访问的默认文件index.html放在/boa/www目录下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    <html>
            <body>
                    <h3>this is a test!</h3><br/>
                            <img src="https://github.com/jvfan/jvfan.github.io/raw/master/img/about-Jerry-gentle.jpg"/>
                    <h3>tree picture</h3><br/>
       
                    <a href="/cgi-bin/test.cgi">to cgi page</a>
            </body>
    </html>
    
  5. 新建test.c放在/boa/cgi-bin目录下,并编译生成test.cgi文件

    容易发现下面test.c的输出内容刚好是一个html格式的文本。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #include <stdio.h>
    int main()
    {
            printf("Content-type:text/html\n\n"); //这句一定要加上
            printf("<html><body>");
            printf("<font style=\"color:red; font-size:30px;\">Hello, CGI!</font><br/>");
            printf("<a href=\"/index.html\">return index.html</a>");
            printf("</body></html>");
            return 0;
    }
    

    下面是编译:

    1
    
    gcc test.c -o test.cgi
    
  6. 验证效果,很简单只需要在/boa目录执行./boa程序即可。

    • 这里先在/boa目录使用tree程序(没有就安装)看下结构

    • 使用./boa开始运行,然后ps -ef | grep "boa"会看到进程信息,如下,否则到/boa/log/error_log中找下错误信息,比如端口绑定错误就换端口;

      在局域网其他设备访问本机ip:http://192.168.2.246,就会有显示效果,浏览器默认访问端口80,效果如下:

第三部分-开机启动

/etc/init.d/rcS脚本默认调用/etc/init.d/rc脚本,进而去执行满足条件的脚本/etc/rc$runlevel.d/S*,诸如/etc/rc5.d/S75sudo等S开头的脚本。

boa服务器需要如socket服务的支持,所以等全部等级的系统服务脚本执行后再执行,因此可以放在/etc/init.d/rcS文件的最后。因为/boa/boa执行后会自动转入后台,因此添加就写/boa/boa,部分没有自动转入后台的添加需要写类似/bin/demo &,否则启动会卡死。

/etc/rc.local脚本在每个多用户运行级别的末尾执行,可以理解为开机启动优先级最低。该文件被/etc/init.d/rc.local调用。

因为/etc/rc.local本身是末尾执行,将执行命令放在这里也ok。

规范一点的选择:

  1. 写一个脚本boa放在/etc/init.d/目录,脚本内容 点这浏览

    其中pidof boa是获取boa进程的pid,判断是否为空执行不同的命令,如启动和杀死进程。

    这样就可以通过(需要给予执行权限):

    /etc/init.d/boa start来启动boa进程(执行了/boa/boa命令)

    /etc/init.d/boa stop来停止进程(执行了kill命令)

  2. 添加执行权限,添加后该文件会变成绿色

    1
    
    chmod +x /etc/init.d/boa
    
  3. 添加到开机启动

    这里添加/etc/init.d/boa start/etc/rc.local,你也可以选择添加到/etc/init.d/rcS

这样开机启动就ok了,可以愉快玩耍了,你也可以手动执行脚本。

移植到iTop4412开发板

研究过程中发现并不需要那么多文件,所以下面过程是可以运行的精简版。

  • 修改源码defines.h文件中的SERVER_ROOT,规定了boa.conf配置文件必须在该目录下;
  • 准备编译得到的boa文件、源码根目录中默认boa.conf文件、ubuntu自身的mime.types文件、需要展示的网页index.html文件;
  • 拷贝boa.conf到前面SERVER_ROOT定义的开发板中的地址,改写该配置文件,根据改写的配置内容复制其他文件到相应文件夹(没有就建立)。配置文件中需要改运行的group信息为root,所以需要保证开发板etc目录下有group文件(没有就新建,并加入root组)。
第一部分-源码处理
  1. 下载boa源码,并解压

    因为官网已经打不开,所以百度搜索“boa-0.94.13”进行下载,或者点击这里

    将其拷贝到Ubuntu中(任意目录,目的仅是生成boa可执行文件),然后进行解压。

    1
    
    tar -xvf boa-0.94.13.tar.gz
    
  2. 进入解压目录下的src目录,修改defines.h中SERVER_ROOT宏定义为目录”/boa”,后面会在该目录下放置boa.conf配置文件。

    1
    2
    
    cd boa-0.94.13/src/
    vim defines.h
    

  3. 进行初次编译

    • 首先生成Makefile

      1
      
      ./configure
      
    • 其次修改Makefile的参数

      CC指向的编译器 arm-none-linux-gnueabi-gcc -static

      CPP指向的编译器 arm-none-linux-gnueabi-gcc -E -static

    • make开始编译

  4. 解决编译错误,完成后重新make

    修改compat.hTIMEZONE_OFFSET(foo)宏定义中foo##->...(foo)->...

  5. 给生成的boa文件瘦身(只需要这一个执行文件)

    1
    
    arm-none-linux-gnueabi-strip boa
    
第二部分-BOA配置

虚拟机准备boa工作目录:

  1. 创建boa工作目录,任意位置,有nfs就放共享目录下

    1
    
    mkdir ~/boa
    
  2. 进入boa工作目录,然后拷贝boa解压目录下的boa.conf配置文件到该目录

    1
    2
    3
    
    cd ~/boa
    cp .../boa-0.94.13/boa.conf ./
    vim boa.conf
    

    修改配置或者直接新建(推荐)的内容参考下面:

    注意后面会把boa工作目录拷贝到开发板根目录,所以配置中出现的绝对路径是ok的。

    其中ServerName必须写(任意都行),否则开发板运行不了,但ubuntu可运行,很奇怪。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    Port 80
    User nobody
    Group root
    ErrorLog /boa/log/error_log
    AccessLog /boa/log/access_log
    ServerName www.your.org.here
    DocumentRoot /boa/www
    UserDir public_html
    DirectoryIndex index.html
    KeepAliveMax 1000
    KeepAliveTimeout 10
    MimeTypes /boa/mime.types
    DefaultType text/plain
    CGIPath /bin:/usr/bin:/usr/local/bin
    Alias /doc /usr/doc
    ScriptAlias /cgi-bin/ /boa/www/cgi-bin/
    
  3. 根据boa.conf文件内容来新建需要的目录

    1
    
    mkdir -p log/ www/ www/cgi-bin/
    
  4. 根据boa.conf文件内容拷贝文件到新建的目录中

    • 拷贝boa源码生成的boa执行文件到boa工作目录

      1
      
      cp .../boa-0.94.13/src/boa ./
      
    • 拷贝虚拟机上的mime.types文件到boa工作目录

      1
      
      cp /etc/mime.types ./
      
    • 在boa工作目录下的www目录中新建index.html网页

      内容点这浏览

      1
      2
      
      cd www
      vim index.html
      

    完成后,boa工作目录中文件展示如下:

开发板配置和操作:

  1. 创建用户组文件group(若无就建,boa配置文件指定了root组),并给予权限744

    1
    2
    3
    
    cd /etc
    vi group
    chmod 744 group
    

    group内容如下:

    1
    
    root:*:0:
    
  2. 将虚拟机中boa工作目录复制到开发板的根目录下并命名为/boa目录

    方法有挂载U盘、ftp、挂载nfs(建议 方法点这)等。

    下面是nfs挂载命令(假设boa工作目录已经在nfs共享目录下):

    1
    2
    
    mount -t nfs 192.168.2.246:/home/nfsroot /mnt/nfs -o nolock
    cp /mnt/nfs/boa / -r
    
  3. 加入到开机启动,在/etc/init.d/rcS文件中尾部加入/boa/boa即可。

第三部分-查看结果

重启开发板(或者不重启,运行/boa/boa),如果pidof boa返回进程pid就基本成功,杀死进程使用kill -9 xxxx

然后浏览器输入开发板ip192.168.2.200即可访问index.html页面。