概述
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
第一部分-源码处理
-
下载boa源码
因为官网已经打不开,所以百度搜索“boa-0.94.13”进行下载,或者点击这里。
-
解压文件
拷贝到Ubuntu中(任意目录,目的仅是生成2个可执行文件),然后进行解压。
1
tar -xvf boa-0.94.13.tar.gz
-
在解压目录的src目录下修改defines.h文件中的SERVER_ROOT宏指定一个目录,这里指定为根目录下的“/boa”目录,后面步骤会新建它作为服务器工作目录,运行boa时首先会在该目录下查找boa.conf文件
1 2
cd ./boa-0.94.13/src/ vim defines.h
-
同样的在解压目录的src目录执行编译配置文件configure,执行后会生成新的Makefile文件。Makefile文件中包含了编译器信息,如果不是gcc就进一步修改为自己的配置。这里不改。
1
./configure
-
执行make进行编译,执行成功后会生成后面需要的两个可执行文件:boa和boa_indexer;
1
make
默认编译会出错,修改当前目录下compat.h中TIMEZONE_OFFSET(foo)宏定义,然后再次make即可,见下图:
这样第一部分就结束了,主要得到了三个文件:解压目录下的src目录中的可执行文件boa和boa_indexer,解压目录下的boa.conf(是boa执行文件运行的配置文件)。
第二部分-BOA配置
-
创建工作目录“/boa”,需要和第一部分中的SERVER_ROOT宏指定的相同
1
mkdir -p /boa /boa/www /boa/cgi-bin /boa/log
-
复制必要的文件到工作目录
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/
-
在工作目录下修改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/
-
新建网页根目录访问的默认文件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>
-
新建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
-
验证效果,很简单只需要在
/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。
规范一点的选择:
-
写一个脚本boa放在
/etc/init.d/
目录,脚本内容 点这浏览其中
pidof boa
是获取boa进程的pid,判断是否为空执行不同的命令,如启动和杀死进程。这样就可以通过(需要给予执行权限):
/etc/init.d/boa start
来启动boa进程(执行了/boa/boa
命令)/etc/init.d/boa stop
来停止进程(执行了kill命令) -
添加执行权限,添加后该文件会变成绿色
1
chmod +x /etc/init.d/boa
-
添加到开机启动
这里添加
/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组)。
第一部分-源码处理
-
下载boa源码,并解压
因为官网已经打不开,所以百度搜索“boa-0.94.13”进行下载,或者点击这里。
将其拷贝到Ubuntu中(任意目录,目的仅是生成boa可执行文件),然后进行解压。
1
tar -xvf boa-0.94.13.tar.gz
-
进入解压目录下的src目录,修改defines.h中SERVER_ROOT宏定义为目录”/boa”,后面会在该目录下放置boa.conf配置文件。
1 2
cd boa-0.94.13/src/ vim defines.h
-
进行初次编译
-
首先生成Makefile
1
./configure
-
其次修改Makefile的参数
CC指向的编译器
arm-none-linux-gnueabi-gcc -static
CPP指向的编译器
arm-none-linux-gnueabi-gcc -E -static
-
make
开始编译
-
-
解决编译错误,完成后重新
make
修改
compat.h
中TIMEZONE_OFFSET(foo)
宏定义中foo##->...
为(foo)->...
-
给生成的boa文件瘦身(只需要这一个执行文件)
1
arm-none-linux-gnueabi-strip boa
第二部分-BOA配置
虚拟机准备boa工作目录:
-
创建boa工作目录,任意位置,有nfs就放共享目录下
1
mkdir ~/boa
-
进入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/
-
根据boa.conf文件内容来新建需要的目录
1
mkdir -p log/ www/ www/cgi-bin/
-
根据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工作目录中文件展示如下:
-
开发板配置和操作:
-
创建用户组文件group(若无就建,boa配置文件指定了root组),并给予权限744
1 2 3
cd /etc vi group chmod 744 group
group内容如下:
1
root:*:0:
-
将虚拟机中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
-
加入到开机启动,在
/etc/init.d/rcS
文件中尾部加入/boa/boa
即可。
第三部分-查看结果
重启开发板(或者不重启,运行/boa/boa
),如果pidof boa
返回进程pid就基本成功,杀死进程使用kill -9 xxxx
。
然后浏览器输入开发板ip192.168.2.200
即可访问index.html页面。