00. 目录
01. BOA服务器概述
BOA是一款非常小巧的Web服务器,源代码开放、性能优秀、支持CGI通用网关接口技术,特别适合用在嵌入式系统中。
BOA服务器主要功能是在互联嵌入式设备之间进行信息交互,达到通用网络对嵌入式设备进行监控,并将反馈信息自动上传给主控设备的目的。它是基于HTTP超文本传输协议的,Web网页是Web服务最基本的传输单元。嵌入式Web服务的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,也就是著名的B/S结构。运行与客户端的浏览器首先要与嵌入式Web服务器BOA端建立连接,打开一个套接字虚拟文件,此文件建立标志着socket连接建立成功然后客户端浏览器通过套接字socket以GET或者POST参数传递方式向Web服务器提交请求,Web浏览器提交请求后,用过HTTP协议传输给Web服务器。Web服务器接到请求后,根据请求的不同进行事务处理,返回HTML文件或者通过CGI调用外部应用程序,返回处理结果。服务器通过CGI与外部应用程序和脚本之间进行交互,根据客户端浏览器在请求时所采用的方法,服务器会搜集客户端所提供的信息,并将该部分信息发送给指定的CGI扩展程序,CGI扩展程序进行信息处理并将结果返回给服务器,然后服务器对信息进行分析,并将结果发送回客户端在浏览器上显示出来。
通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后结果返回给客户端。组成CGI通信的两部分:一是HTML页面,就是用户浏览器上现实的页面;二就是运行在服务器上的CGI程序。
与Apache等高性能的Web服务器的主要区别是,Boa是一个单进程服务器,适合于嵌入式的单任务http服务器。是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。
02. BOA源码下载
官网网站:BOA源码
03. BOA移植
3.1 解压boa-0.94.13.tar.gz
deng@local:~/tools$ ls
boa-0.94.13.tar.gz
deng@local:~/tools$ tar -xvf boa-0.94.13.tar.gz
3.2 进入到boa-0.94.13目录
deng@local:~/tools$ cd boa-0.94.13/
deng@local:~/tools/boa-0.94.13$ ls
boa.conf ChangeLog contrib CREDITS docs examples extras Gnu_License README src
deng@local:~/tools/boa-0.94.13$
3.3 进入到src目录
deng@local:~/tools/boa-0.94.13$ cd src/
deng@local:~/tools/boa-0.94.13/src$ ls
acconfig.h boa_grammar.y cgi.c config.c defines.h globals.h log.c pipe.c response.c timestamp.c
aclocal.m4 boa.h cgi_header.c config.h.in escape.c hash.c Makefile.in queue.c select.c util.c
alias.c boa_lexer.l check_struct_for.m4 configure escape.h index_dir.c mmap_cache.c read.c signals.c webindex.pl
boa.c buffer.c compat.h configure.in get.c ip.c parse.h request.c sublog.c
deng@local:~/tools/boa-0.94.13/src$
3.4 设置启动服务器时寻找boa.conf配置文件的路径
deng@local:~/tools/boa-0.94.13/src$ pwd
/home/deng/tools/boa-0.94.13/src
deng@local:~/tools/boa-0.94.13/src$ vim defines.h +30
//修改内容如下 注释30行 添加31行
29 #ifndef SERVER_ROOT
30 //#define SERVER_ROOT "/etc/boa"
31 #define SERVER_ROOT "/home/deng/boa"
32 #endif
3.5 生成Makefile`
deng@local:~/tools/boa-0.94.13/src$ pwd
/home/deng/tools/boa-0.94.13/src
deng@local:~/tools/boa-0.94.13/src$ ./configure
3.6 编译
deng@local:~/tools/boa-0.94.13/src$ pwd
/home/deng/tools/boa-0.94.13/src
deng@local:~/tools/boa-0.94.13/src$ make -j4
04. BOA部署
4.1 创建BOA服务器目录
deng@local:~/boa-0.94.13/src$ mkdir -p ~/boa/bin
deng@local:~/boa-0.94.13/src$ mkdir ~/boa/log
deng@local:~/boa-0.94.13/src$ mkdir ~/boa/www
deng@local:~/boa-0.94.13/src$ mkdir ~/boa/www/cgi-bin
deng@local:~/boa-0.94.13/src$
deng@local:~/boa-0.94.13/src$ tree ~/boa
/home/deng/boa
├── bin
├── log
└── www
└── cgi-bin
4 directories, 0 files
deng@local:~/boa-0.94.13/src$
4.2 将可执行文件boa拷贝到/home/deng/boa/bin目录下
deng@local:~/boa-0.94.13/src$ pwd
/home/deng/boa-0.94.13/src
deng@local:~/boa-0.94.13/src$ cp boa ~/boa/bin/
deng@local:~/boa-0.94.13/src$
4.3 将boa.conf拷贝到~/boa/目录下
deng@local:~/tools/boa-0.94.13$ pwd
/home/deng/tools/boa-0.94.13
deng@local:~/tools/boa-0.94.13$ cp boa.conf ~/boa/
deng@local:~/tools/boa-0.94.13$
4.4 修改配置文件
deng@local:~/boa/boa$ pwd
/home/deng/boa
deng@local:~/boa$ vim boa.conf +48
48 #User nobody
49 #Group nogroup
50 User 0
51 Group 0
4.5 修改日志的路径
4.6 修改DocumentRoot的目录
115 #DocumentRoot /var/www
116 DocumentRoot /home/deng/boa/www
4.7 修改MimeTypes
160 #MimeTypes /etc/mime.types
161 MimeTypes /home/deng/boa/mime.types
4.8 修改ScriptAlias
199 #ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
200 ScriptAlias /cgi-bin/ /home/deng/boa/www/cgi-bin/
4.9 创建log和拷贝mime文件
deng@local:~$ cp /etc/mime.types ~/boa
deng@local:~$ touch ~/boa/log/error_log
deng@local:~$ touch ~/boa/log/access_log
deng@local:~$
4.10 创建index.html文件
deng@local:~/boa/www$ pwd
/home/deng/boa/www
deng@local:~/boa/www$ vim index.html
内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>深圳嵌入式2023</title>
</head>
<body>
<h1>深圳嵌入式培训</h1>
</body>
</html>
4.10 启动服务器
deng@local:~$ sudo ~/boa/bin/boa
deng@local:~/boa/boa$ ps -a | grep "boa"
1962 tty1 00:00:00 gsd-clipboard
1969 tty1 00:00:00 gsd-keyboard
2563 tty2 00:00:00 gsd-clipboard
2570 tty2 00:00:00 gsd-keyboard
4490 pts/1 00:00:00 boa
deng@local:~/boa/boa$
4.11 测试
05. 常见问题讨论
问题1:找不到lex和yacc命令
deng@local:~/tools/boa-0.94.13/src$ make -j4
yacc -d boa_grammar.y
lex boa_lexer.l
gcc -g -O2 -pipe -Wall -I. -c -o alias.o alias.c
gcc -g -O2 -pipe -Wall -I. -c -o boa.o boa.c
make: lex: Command not found
make: yacc: Command not found
Makefile:59: recipe for target 'y.tab.c' failed
make: *** [y.tab.c] Error 127
make: *** 正在等待未完成的任务....
Makefile:62: recipe for target 'lex.yy.c' failed
make: *** [lex.yy.c] Error 127
deng@local:~/tools/boa-0.94.13/src$
解决办法
sudo apt install bison
sudo apt install flex
问题2:error: pasting “t” and “->” does not give a valid preprocessing token
In file included from boa.h:50:0,
from util.c:26:
util.c: In function ‘get_commonlog_time’:
util.c:100:39: error: pasting "t" and "->" does not give a valid preprocessing token
time_offset = TIMEZONE_OFFSET(t);
^
compat.h:120:30: note: in definition of macro ‘TIMEZONE_OFFSET’
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
^~~
gcc -g -O2 -pipe -Wall -I. -c -o sublog.o sublog.c
<内置>: recipe for target 'util.o' failed
make: *** [util.o] Error 1
make: *** 正在等待未完成的任务....
解决办法:
//问题描述:在 compat.h 文件中的宏定义问题: ‘TIMEZONE_OFFSET’
deng@local:~/tools/boa-0.94.13/src$ vim compat.h +120
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
119 #ifdef HAVE_TM_GMTOFF
120 //#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
121 #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
122 #else
123 #define TIMEZONE_OFFSET(foo) timezone
124 #endif
deng@local:~/tools/boa-0.94.13/src$ vim boa.c +225
//注释掉226-228行
这三行注释掉,否则 boa 启动时会出现“boa.c:226 - icky linux kernel bug!: No suchfile or directory 错误”
222 /* test for failed-but-return-was-successful setuid
223 * http://www.securityportal.com/list-archive/bugtraq/2000/Jun/0101.html
224 */
225 #if 0
226 if (setuid(0) != -1) {
227 DIE("icky Linux kernel bug!");
228 }
229 #endif
问题3:log.c:73 - unable to dup2 the error log: Bad file descriptor
deng@local:~/boa/boa$ ./boa
[17/May/2023:01:08:57 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor
deng@local:~/boa/boa$
deng@local:~/boa/boa$
解决办法:
deng@local:~/tools/boa-0.94.13$ vim src/log.c +73
注释掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
为:
71 #if 0
72 /* redirect stderr to error_log */
73 if (dup2(error_log, STDERR_FILENO) == -1) {
74 DIE("unable to dup2 the error log");
75 }
问题4:unable to bind: Permission denied
deng@local:~/boa/boa$ ./boa
[17/May/2023:01:14:58 +0000] boa.c:194 - unable to bind: Permission denied
解决方法:
deng@local:~/boa/boa$ sudo ./boa
问题5:显示为乱码
解决方法:
修改浏览器的编码为utf-8
06. 附录
百度百科:boa服务器
参考:boa服务器