• 安防监控项目---boa服务器的移植



    前言

    书接上期,在配置完成环境后,那么接下来呢还得移植两个非常关键的东西,一个呢时boa服务器,另一个呢时cgi接口,boa服务器能够使得我们更好的与web进行交互,cgi接口能够更好的实现c语言和html语言的交互;两者在网页和A9平台交互之间起着至关重要的作用;接下来呢,看我手把手教学,哈哈哈哈,大家好好学哦!


    一、boa服务器简介

    首先要清楚boa是一个web服务器,它其实就是用来实现网页和终端通信的一段软件代码;
    其可执行代码只有大约60KB左右,Boa是一个单任务的HTTP服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。Boa支持CGI。
    Boa的设计目标是速度和安全。(CGI只是一个进程,用来提供接口),自动目录生成和自动文件强制进行拼接。
    Boa的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。
    源码下载地址如下:http://www.boa.org/,大家可以根据自己需求进行下载;
    在本项目中使用的版本是boa-0.94.13

    二、移植步骤

    • 步骤一
      解压源码,生成Makefile文件,编译工程,进行安装
    tar -xvf boa-0.94.13.tar.gz 	//解压工程文件
    cd boa-0.94.13/src/				//进入源目录文件夹
    ./configure						//生成Makefile文件,如果执行不了调整权限为0777
    make 							//进行编译
    
    • 1
    • 2
    • 3
    • 4

    注意:在执行make编译文件的时候会出现一些问题,下面是一些解决办法:

    问题1: 	
    目录: boa-0.94.13/src$ make
    	yacc  -d boa_grammar.y
    	make: yacc: Command not found
    	make: *** [y.tab.c] Error 127
    解决方法:
    	/boa-0.94.13/src$ sudo apt-get install bison
    问题2: 
    	yacc  -d boa_grammar.y
    	gcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c
    	......
    	lex  boa_lexer.l
    	make: lex: Command not found
    	make: *** [lex.yy.c] Error 127
    解决方法:
    	/boa-0.94.13/src$ sudo  apt-get install flex
    WARNING: The following packages cannot be authenticated!
      libfl-dev flex
    Install these packages without verification? [y/N] 
    E: Some packages could not be authenticated
    注意加参数-f 自动搜索依赖,下面选择y  : sudo  apt-get install flex -f
    Do you want to continue? [Y/n] y
    WARNING: The following packages cannot be authenticated!
      libfl-dev flex
    Install these packages without verification? [y/N] y
    
    问题3: 	
    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						  ^
    make: *** [util.o] Error 1	
    问题描述:在compat.h文件中的宏定义问题:  ‘TIMEZONE_OFFSET’
    解决方法:
    	修改 boa-0.94.13/src$ vi compat.h  +120
    	找到
    	#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
    	修改成
    	#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
    
    	将boa.c中的 vi   boa.c
    	225     #if 0     //注释掉
    	226         if (setuid(0) != -1) {
    	227             DIE("icky Linux kernel bug!");
    	228         }
    	229     #endif             
    
    这三行注释掉,否则boa启动时会出现“boa.c:226 - icky linux kernel bug!: No such file or directory错误”		
    清除之前编译的内容 make clean (防止某些依赖的信息出现问题)
    重新make 
    再次boa-0.94.13/src$ make
    make: Nothing to be done for `all'.
    make主要检查的是时间戳, 只要target比依赖的文件时间靠后它就认为不需要编译
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 步骤二
      建立安装目录,如果是在Ubuntu下测试,那我们可以安装在你想要安装的目录下,要是直接安装ARM版本的,那就是得在A9平台上使用,所以必须安装在根文件服务器下,这样是不是就直接可以在PC终端直接在A9平台直接运行该服务器啦,哈哈;

       sudo mkdir -p 	/boa 	/boa/www 	/boa/cgi-bin 	/boa/log 
        (-p,--parents,此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录)
       将src/defines.h中的
       #define SERVER_ROOT "/etc/boa" 
       修改为
       #define SERVER_ROOT "/boa"
       (这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)。
       将需要的文件复制到安装目录中
       将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下
       sudo  cp  boa boa_indexer  /boa
       将boa-0.94.13目录下的boa.conf文件复制到/boa下
       sudo  cp  boa.conf  /boa
       可选项: arm-linux-strip boa(去掉boa中的调试信息,只是减小文件的大小可以执行也可以不执行)
       将/etc/mime.types复制到/boa目录下
       sudo cp  /etc/mime.types  /boa
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 步骤三
      返回boa的顶层目录 — 修改配置文件
      boa-0.94.13$ ls
      boa.conf contrib docs extras README
      ChangeLog CREDITS examples Gnu_License src

       vi boa.conf //几乎全部指定到boa的目录下,这样方便我们进行管理
       重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机制
       Port  80  
       User  0  
       Group 0  
       bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
       #Listen 192.68.0.5 
       error_log和access_log会自动生成,只要指定生成路径就可以了。  
       ErrorLog /boa/log/error_log  
       AccessLog /boa/log/access_log    
       存放HTML文件的根路径  
       DocumentRoot /boa/www  
       UserDir public_html  
       默认页面,若之输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html  
       DirectoryIndex index.html    
       保持默认  
       DirectoryMaker /boa/boa_indexer   //被修改
       KeepAliveMax 1000  
       KeepAliveTimeout 10  
       MimeTypes /boa/mime.types   //被修改
       DefaultType text/plain    
       指定传给cgi程序的PATH环境变量  
       CGIPath /bin:/usr/bin:/usr/local/bin   
       保持默认  
       Alias /doc /usr/doc   
       如果输入http://127.0.0.1/cgi-bin/test.cgi, 则boa服务器会到/boa/cgi-bin中寻找test.cgi程序。  
       ScriptAlias /cgi-bin/ /boa/cgi-bin/  
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27

    三、测试结果

    大家先不要着急看结果,这里先给大家说一个注意事项,如果大家是把boa安装在根目录下,那不存在什么情况,如果是将服务器安装在任意目录下,那么要提醒大家的是在boa.conf文件中的boa目录必须使用绝对路径,不能使用相对路径;就比如下图一些路径(当然该文件中所有的类似路径都必须用绝对路径):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    测试条件:在www文件夹下放置index.html文件,这个是客户端访问boa服务器的默认返回页面,或者大家直接在cgi-bin目录下直接放值.cgi测试文件(当然我们还没有移植cgi,所以写个简单的html就行了),那么测试结果如下:
    html文件内容:
    在这里插入图片描述
    测试结果:
    在这里插入图片描述
    这样就表示在Ubuntu下测试成功了;当然我们是不是要在A9平台与web通信,所以一定最终是要把boa服务器移植到A9平台上;

    四、A9平台移植BOA

    先来分析一下最大的不同点,下图是Ubuntu下的boa文件的属性,所以要想移植到ARM平台下,必须编译生成ARM版本的boa;其余的移植步骤基本相同;
    在这里插入图片描述
    必须编译生成ARM的版本:
    在这里插入图片描述
    接下来具体看看:
    能力)
    (1)移植boa到嵌入式linux上的方法和上面几乎一样,具体做法是

    ./configure
    生成Makefile后将Makefile中的
    CC = gcc   CPP=gcc -E 
    改为
    CC = arm-linux-gcc,
    CPP = arm-linux-gcc -E,
    然后make就OK
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (2)重新拷贝修改后的文件:
    将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下
    将boa-0.04.13目录下的boa.conf文件复制到/boa下
    将/etc/mime.types复制到/boa目录下
    将test.cgi放在/boa/cgi-bin目录下,
    将index.html image.jpg 放在/boa/www目录下

    (3)拷贝文件到rootfs文件系统目录下:
    cd boa 进入boa文件目录
    移植到开发板后:

    	[root@fengjunhui boa]:~$ ./boa
    	No such user: nobody
    	解决方法:
    		sudo vi boa.conf
    		(1)Group的修改
    			修改 Group nogroup  为 Group 0
    		(2)user的修改
    			修改 User nobody 为 User 0
    	
    	[root@fengjunhui boa]:~$ ./boa
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我遇到的问题:

    [01/Jan/1970:00:23:10 +0000] boa.c:211 - getpwuid: Success
    [01/Jan/1970:00:00:39 +0000] boa.c:211 - getpwuid: No such file or directory
    解决:修改src/boa.c
    注释掉下面两句话:
    #if 0
        if (passwdbuf == NULL) {
                DIE(”getpwuid”);
                }
                if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
                DIE(”initgroups”);
                }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    就能够解决!!

    测试结果
    在这里插入图片描述


    总结

    到这里呢boa服务器的移植就完全移植完成啦,我遇到的问题我觉得还是比较少的,当然大家遇到问题也不要烦,我第一次移植的时候头也很大,觉得这是个啥呀,但后面做项目时间久了,知识点都沉淀下来了,对他的各个模块的功能清晰了以后,移植起来就相对简单了,就像我能写这篇博客,肯定是经过很长时间对这个东西有了解的,所以静下心来把每一步做好;下期带大家来移植CGI,把boa和CGI结合起来使用,哈哈哈!!!
    最后,各位小伙伴们如果有收获,可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

  • 相关阅读:
    【Hadoop快速入门】Hdfs、MapReduce、Yarn
    【C++】类和对象(上)
    湘南学院2023级成考新生课程学习安排及成绩评定标准
    五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
    Vue3中使用provide和inject依赖注入完成父组件和孙子组件之间参数传递
    在线虚拟机安装-云原生边缘计算KubeEdge安装配置(使用负载均衡器LoadBalancer)
    Numpy、Matplotlib and Pandas
    浅谈中小企业的供应商管理
    33:深入浅出x86中断机制
    java毕业设计钢材商贸公司网络购销管理系统Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/weixin_58016534/article/details/134072063