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

文章目录

  • 前言
  • 一、boa服务器简介
  • 二、移植步骤
  • 三、测试结果
  • 四、A9平台移植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 							//进行编译

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

问题1: 	
目录: boa-0.94.13/src$ makeyacc  -d boa_grammar.ymake: yacc: Command not foundmake: *** [y.tab.c] Error 127
解决方法:/boa-0.94.13/src$ sudo apt-get install bison
问题2: yacc  -d boa_grammar.ygcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c......lex  boa_lexer.lmake: lex: Command not foundmake: *** [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 tokentime_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.c225     #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比依赖的文件时间靠后它就认为不需要编译
  • 步骤二
    建立安装目录,如果是在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
    
  • 步骤三
    返回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/  
    

三、测试结果

大家先不要着急看结果,这里先给大家说一个注意事项,如果大家是把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

(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]:~$ ./boaNo such user: nobody解决方法:sudo vi boa.conf(1)Group的修改修改 Group nogroup  为 Group 0(2)user的修改修改 User nobody 为 User 0[root@fengjunhui boa]:~$ ./boa

我遇到的问题:

[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 0if (passwdbuf == NULL) {DIE(”getpwuid”);}if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {DIE(”initgroups”);}
#endif

就能够解决!!

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


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Powershell脚本自动备份dhcp数据库

文章目录 为什么要备份DHCP数据库呢?在PowerShell中自动备份DHCP数据库1,创建备份目录2,判断备份路径是否存在3,备份DHCP数据库4,完整自动备份脚本5,安排定期备份 推荐阅读 为什么要备份DHCP数据库呢&#…

【AD9361 数字接口CMOS LVDSSPI】C 并行数据之LVDS

接上一部分,AD9361 数字接口CMOS &LVDS&SPI 目录 一、LVDS模式数据路径和时钟信号LVDS模式数据通路信号[1] DATA_CLK[2] FB_CLK[3] Rx_FRAME[4] Rx_D[5:0][5] Tx_FRAME[6]Tx_D[5:0][7] ENABLE[8] TXNRX系列 二、LVDS最大时钟速率和信…

N-130基于springboot,vue校园社团管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plus 本系…

【C++深入浅出】模版初识

目录 一. 前言 二. 泛型编程 三. 函数模版 3.1 函数模版的概念 3.2 函数模版的格式 3.3 函数模版的原理 3.4 函数模板的实例化 3.5 模板参数的匹配原则 四. 类模版 4.1 类模版的定义 4.2 类模版的实例化 一. 前言 本期我们要介绍的是C的又一大重要功能----模版。通…

【Unity ShaderGraph】| 制作一个 高级流体水球效果

前言 【Unity ShaderGraph】| 快速制作一个 流体水球效果一、效果展示二、简易流体水球效果三、进阶流体水球效果四、应用实例 前言 本文将使用ShaderGraph制作一个 高级流体水球 ,可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xf…

微服务初始和Nacos安装

一)初始微服务: 微服务是将一个大型的,单一的应用程序拆分成多个小型服务,每一个服务负责于特定的业务功能,并且可以通过网络来和其他服务进行通讯,是一个思想,将一个大的项目拆分成多个小的项目,多个小的项…

Go语言标准输入

文章目录 Go语言标准输入函数使用 Go语言标准输入 函数 Scan // 使用stdin读取内容,读取的内容以空白(换行也属于空白)分隔,赋值给函数参数。返回读取的个数和错误 func Scan(a ...interface{}) (n int, err error)Scanf // 和…

C++进阶篇3---二叉搜索树(Binary Search Tree)

一、二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的…

基于jquery+html开发的json格式校验工具

json简介 JSON是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族…

Django 尝试SSE报错 AssertionError: Hop-by-hop headers not allowed 的分析

情况描述 近期计划测试一下django对日志打印的支持,一般都是用websocket的方式,想测试一下SSE (Server-sent events)的服务端推送,发现过程中存在报错: Traceback (most recent call last):File "D:\Software\Anaconda3\li…

shell中的运算

目录 1.运算符号 2.运算指令 练习 1.运算符号 运算符号意义加法-减法*乘法/除法%除法后的余数**乘方自加一- -自减一<小于<小于等于>大于>大于等于等于ji ->jji*j*i->jj*i/j/i->jj/i%j%i->jj%i 2.运算指令 (()) //((a12))let //let a12 …

[动态规划] (一) LeetCode 1137.第N个泰波那契数

[动态规划] (一) LeetCode 1137.第N个泰波那契数 文章目录 [动态规划] (一) LeetCode 1137.第N个泰波那契数题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结空间优化代码实现 总结 1137. 第 N 个泰波那契数 题目解析 解题思路 状态表示 (1) 题目要…

正点原子嵌入式linux驱动开发——Linux 串口RS232/485/GPS 驱动

串口是很常用的一个外设&#xff0c;在Linux下通常通过串口和其他设备或传感器进行通信&#xff0c;根据 电平的不同&#xff0c;串口分为TTL和RS232。不管是什么样的接口电平&#xff0c;其驱动程序都是一样的&#xff0c;通过外接RS485这样的芯片就可以将串口转换为RS485信号…

97. 交错字符串

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a;动态规划。 如果s1.length()s2.length ! s3.length()&#xff0c;直接返回false&#xff0c;否则使用动态规划求解。定义状态&#xff1a;dp[i][i]&#xff…

解决找不到vcruntime140.dll,无法继续执行代码方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到vcruntime140.dll”。这个错误通常发生在运行某些程序或游戏时&#xff0c;它会导致程序无法正常启动或运行。那么&#xff0c;找不到vcruntime140.dll&#xff0c;无法继续执行代码…

word中批注内容显示设置

在修改他人word时&#xff0c;有时候保存为pdf需要有选择性的显示&#xff0c;如下图&#xff0c;原始修改方式包括三种&#xff1a;批注、格式修改、删除添加&#xff0c;如下图所示&#xff1a; 有时候不想要格式设置说明&#xff0c;则只需要进行在审阅--显示标志--不勾选设…

【Java 进阶篇】解决Java Web应用中请求参数中文乱码问题

在Java Web应用开发中&#xff0c;处理请求参数时经常会遇到中文乱码的问题。当浏览器向服务器发送包含中文字符的请求参数时&#xff0c;如果不正确处理&#xff0c;可能会导致乱码问题&#xff0c;使得参数无法正确解析和显示。本文将详细探讨Java Web应用中请求参数中文乱码…

qt高精度定时器的使用停止线程应用

##线程停止 //线程停止应用 public: explicit WorkerThread(QObject *parent 0) :QThread(parent), m_bStopped(false){qDebug() << "Worker Thread : " << QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop() {qDebug()…

共用体开发案例

有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来处理。 #include <stdio.h>struct Person {char name[32];int age;char zhiYe;char addr[32];union {int class;…

JDBC与MySql数据库

一、系统开发前的环境准备 1.下载Mysql 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 文件解压缩到本地 在此路径下新增my.ini文件以及新建data文件夹 编辑my.ini文件 配置环境变量 注意是编辑系统变量的Path 以管理员身份运行cmd 输入命令&#xff1a…