【网络编程】Ubuntu部署BOA服务器

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服务器

参考:【实战】物联网安防监控项目【2】———boa服务器的移植

猜你喜欢

转载自blog.csdn.net/dengjin20104042056/article/details/133394575
今日推荐