嵌入式web服务器Boa的移植

2023-11-10

Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。

下面给大家介绍一下Boa服务器移植的具体操作步骤,希望能够有帮助。

环境
       主机:ubuntu8.10
       交叉工具链:gcc-3.4.5-glibc-2.3.6
       目标:s3c2410开发板

结合网上一些文档,整理了一个比较完整的文档。

1.下载Boa源码

下载地址: http://www.boa.org/

最新发行版本: 0.94.13

下载 boa-0.94.13.tar.gz

解压:# tar xzf boa-0.94.13.tar.gz

2.安装需要工具bison,flex

sudo apt-get install bison flex

否则会出现如下错误

make: yacc:命令未找到
       make: *** [y.tab.c] 错误 127

make: lex:命令未找到
       make: *** [lex.yy.c] 错误 127

3.修改文件

(1)修改 src/compat.h

找到

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

修改成

#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

否则会出现错误:

util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o] 错误 1

(2)修改 src/log.c

注释掉

if (dup2(error_log, STDERR_FILENO) == -1) {
                         DIE("unable to dup2 the error log");
                   }

为:

/*if (dup2(error_log, STDERR_FILENO) == -1) {
                         DIE("unable to dup2 the error log");
                   }*/

否则会出现错误:

log.c:73 unable to dup2 the error log:bad file descriptor

(3)修改src/boa.c

注释掉下面两句话:

if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }

#if 0
        if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }
        #endif

否则会出现错误:boa.c:211 - getpwuid: No such file or directory

注释掉下面语句:

if (setuid(0) != -1) {
                        DIE(”icky Linux kernel bug!”);
        }

#if 0
         if (setuid(0) != -1) {
                        DIE(”icky Linux kernel bug!”);
                }

#endif

否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory

4、生成Makefile文件

执行:

#cd boa-0.94.13/src
         #./configure

5、修改Makefile

cd src
         vim Makefile

修改CC = gcc 为 CC = arm-linux-gcc

修改CPP = gcc -E 为 CC = arm-linux-gcc -E

6、编译

make

       ls -l boa
         -rwxr-xr-x 1 david david 189223 2009-05-31 13:44 boa

然后为生成的二进制文件boa瘦身

arm-linux-strip boa
      ls -l boa
         -rwxr-xr-x 1 david david 61052 2009-05-31 13:51 boa

可以发现boa的大小前后差距很大这为我们节省了很大的空间

7、Boa的配置

这一步的工作也在电脑主机上完成。

在boa-0.94.13目录下已有一个示例boa.conf,可以在其基础上进行修改。如下:

#vi boa.conf

(1)Group的修改

修改 Group nogroup

为 Group 0

(2)user的修改

修改 User nobody

为 User 0

(3)ScriptAlias的修改

修改ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

为 ScriptAlias /cgi-bin/ /var/www/cgi-bin/

(5)DoucmentRoot的修改

DoucmentRoot /var/www

(6)ServerName的设置

修改#ServerName www.your.org.here

为 ServerName www.your.org.here

否则会出现错误“gethostbyname::No such file or directory”

(7)AccessLog修改

修改AccessLog /var/log/boa/access_log

为#AccessLog /var/log/boa/access_log

否则会出现错误提示:“unable to dup2 the error log: Bad file descriptor”

(8)以下配置和boa.conf的配置有关,都是在ARM根文件系统中创建

以下步骤在开发板上进行:

创建目录/etc/boa并且把boa 和 boa.conf拷贝到这个目录下

mkdir /etc/boa

创建HTML文档的主目录/www

mkdir /var/www/cgi-bin

CGI脚本所在录 /var/www/cgi-bin

以下步骤在ubuntu下进行:

将boa.conf拷贝到开发板根文件系统的/etc/boa下

#cp boa.conf /source/rootfs/etc/boa

将boa拷贝到开发板根文件系统的/bin下

#cp src/boa /source/rootfs/bin

将ubuntu下/etc/mime.types拷贝到开发板根文件系统的/etc下

#cp /etc/mime.types /source/rootfs/etc

将你的主页index.html拷贝到 /var/www 目录下

8、测试

1)  HTML 脚本测试

如果我们要访问一个自己制作的网页(hello.html),可以在浏览器中输入http://192.168.184.100/hello.html,这里的IP地址就是开发板的IP地址。


2)  CGI脚本测试

还需配置CGI


1、编写Helloworld.c程序

在开始编写你自己的CGI程序之前,一定要先走通他的例子程序,免得后来程序出错的时候还不知道是配置有问题,还是你的程序代码有问题。
我们用他自带cgictest.c来实现自己的第一个C语言CGI程序。
你可以新建一个工作目录,用于存放你的CGI程序源代码,把cgic.h, cgic.c, cgictest.c三个文件拷贝到这个目录,然后建立一个Makefile文件,其内容为:
   1. test.cgi:cgictest.c cgic.h cgic.c
   2. gcc -wall cgictest.c cgic.c -o test.cgi
需要提醒的是,第二行开头一定是一个tab键(且仅有一个),不能使用空格。
保存好Makefile的内容之后,执行make命令:
make
我们看到,当前目录下应该多了一个test.cgi文件。
在你的网站根目录下建立一个cgi-bin目录(当然名字可以任意取,但作为习惯,一般叫做cgi-bin),然后在Apache的配置文件里赋予其执行CGI代码的权限,权限修改完之后要重启Apache。完成之后,把刚才生成的test.cgi放到cgi-bin目录中。此时我们可以在浏览器中输入以下地址进行访问:
http://127.0.0.1/cgi-bin/test.cgi
如果正常的话,应该看到一个网页被展示出来。这样,第一个C语言的CGI程序就运行起来了。
如果浏览器报错,那么多半是配置boa的时候有些操作没有正确完成。
3) 使用CGIC的基本思路
从cgic.c的代码可以看出,它定义了main函数,而在cgictest.c中定义了一个cgiMain函数。也就是说,对于使用CGIC编写的CGI程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用你的代码(从你定义的cgiMain进入)。
另外一点就是,cgi程序输出HTML页面的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码:
fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4 COLS=40>\n");
fprintf(cgiOut, "Default contents go here. \n");
fprintf(cgiOut, "</textarea>\n");
上面这段代码的运行结果就是在页面上输出一个textarea。 第一个参数cgiOut实际上就是stdin,所以我们可以直接使用printf,而不必使用fprintf。不过在调试的时候会用到fprintf来重定向输出。
这种方式与Java Servlet非常类似,Servlet也是通过调用打印语句System.out.println(…)来输出一个页面。(不过后来Java推出了JSP来克服这种不便。)
但是与Servlet不同的地方在于,使用C语言的我们还要自己输出HTML头部(声明文档类型):
cgiHeaderContentType("text/html");
这个语句的调用一定要在所有printf语句之前。而这个语句执行的任务实际上就是:
void cgiHeaderContentType(char *mimeType) {
    fprintf(cgiOut, "Content-type: %s\r\n\r\n", mimeType);
}
这个语句告诉浏览器,这次传来的数据是什么类型,是一个HTML文档,还是一个bin文件… 如果是个HTML文档,就通过浏览器窗口显示,如果是一个bin(二进制)文件,则打开下载窗口,让用户选择是否保存文件以及保存文件的路径。
理解了这几点之后,你就可以编写自己的CGIC程序了。新建一个文件test.c试试:
下载: test.c
   1. #include <stdio.h>
   2. #include "cgic.h"
   3. #include <string.h>
   4. #include <stdlib.h>
   5. int cgiMain() {
   6.     cgiHeaderContentType("text/html");
   7.     fprintf(cgiOut, "<HTML><HEAD>\n");
   8.     fprintf(cgiOut, "<TITLE>My First CGI</TITLE></HEAD>\n");
   9.     fprintf(cgiOut, "<BODY><H1>Hello CGIC</H1></BODY>\n");
  10.     fprintf(cgiOut, "</HTML>\n");
  11.     return 0;
  12. }
把Makefile文件中的cgitest.c全部换称test.c,保存,再执行make命令即可。
此时通过浏览器访问,会在页面上看到一个大大的“Hello CGIC”。

2、浏览

    将helloworld.cgi拷贝至/var/www/cgi-bin/下,浏览器输入

    http://192.168.0.126/cgi-bin/test.cgi


打开一个浏览器输入开发板ip看看效果

OK


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式web服务器Boa的移植 的相关文章

  • jdk-8u162 java安装

    linux下java环境配置 参照如下文章安装jdk https blog csdn net daerzei article details 80136457 1 上传jdk 8u162 文件 然后执行如下命令进行安装 安装完成之后设定环境
  • 边玩边学,15个学习Python 的编程游戏网站

    经常听到有朋友说 学习编程是一件非常枯燥无味的事情 其实 大家有没有认真想过 可能是我们的学习方法不对 比方说 你有没有想过 可以通过打游戏来学编程 今天我想跟大家分享几个网站 教你如何通过边打游戏边学编程 1 Coding Games 一
  • 力扣 289. 生命游戏

    虽然难度是中等但其实很简单 遍历矩阵判断每个点是死是活就可以了 进阶要求使用原地算法 即空间复杂度为O 1 所以我们不能简单的记录1是活 0是死 我规定 1 原来活 活变活 0 原来死 死变死 2 死变活 1 活变死 自己的 0ms cla
  • Windows Server 2012 R2 -DNS服务器安装与测试(VMware workstation环境)

    Windows Server 2012 R2 DNS服务器安装与测试 VMware workstation环境 搭建拓扑如下 DNS后缀名设置 DNS服务器 虚拟机 IP设置 DNS指向自己 物理机net8虚拟网卡IP设置 DNS指向DNS
  • Vivado 2018.3 安装步骤及 license 获取

    本文的主要内容是介绍 Vivado 2018 3 版本的安装步骤及其 license 的获取与加载 首先下载安装包 将其在没有中文的路径下解压 注意在解压前最好关闭电脑的杀毒软件 防止某些文件被拦截或者删除 解压完成后打开文件夹 在最底部双
  • Java多线程-并行处理以及事务控制

    1 为了提高我们接口的响应速度 我们可以开多个线程 并行处理 比如我们要大批量写入数据到数据库 Autowired private ThreadPoolExecutor executor Autowired private Platform
  • 六. HTTPS确保Web安全

    六 HTTPS确保Web安全 1 HTTP的缺点 通信使用明文 内容可能会被盗取 互连网中使用TCP IP协议族进行通信的过程中会经过非常多的通信载体 网关 路由器等 而这些主机并不可能完全是私人的 所以可能某个环节遭到恶意窥视 抓包 当然
  • Android 整合高德地图SDK实现 地图预览,定位,模拟导航

    一 准备工作 1 到高德地图官方网申请key 我的应用 高德控制台 2 申请key方法请参考 获取Key 创建工程 开发指南 Android 地图SDK 高德地图API 3 出现的问题 其中有一个获取SHA1的问题 E AmapErr 定位
  • Tracker 服务器地址大全 Tracker List

    https dns icoa cn tracker udp tracker tiny vps com 6969 announce https 1337 abcvg info announce https tracker fastdownlo
  • 【Linux系统编程(二)】Linux文件IO操作

    文章目录 Linux文件IO操作 1 系统调用 2 系统调用和库函数的区别 3 C库中IO函数工作流程 4 文件描述符 4 1 文件描述符表是如何管理文件描述符的呢 4 2 查看当前系统文件描述最大数量 5 文件IO的操作 5 1 open
  • 关于split(String agrex)

    split a b c 得到 a b c a b c 得到 a b c 前面的空格一个都不会省略 a b c 得到 a b c 中间空格省略一个 后缀的空格全部省略 不是以空格而是以某个String为划分依据时 现象相同 split a a
  • 2021-06-22安装docker-ce

    安装docker ce Docker 支持以下的 64 位 CentOS 版本 CentOS 7 CentOS 8 更高版本 使用官方安装脚本自动安装 安装命令如下 curl fsSL https get docker com bash s
  • VUE问题汇总(一)

    vue的起步教程与api https cn vuejs org v2 guide vue组件库 https element eleme cn zh CN component installation 1 解决vue中时间控件中获取时间少一天
  • 前端三大框架(vue、react、angular)对比(一)

    官网 vue https cn vuejs org react https react docschina org angular https angular cn 三者总体介绍 都是MVVM 从后端的MVC衍生 类型的框架 基本都用于构建
  • 时序数据库timescaleDB安装

    参考链接 时序数据库timescaleDB安装 http www lwops cn thread 300 1 1 html 本环境在Centos7 5采用编译安装的方式 主要介绍PostgreSQL 11 7 TimescaleDB 1 6
  • 机器学习理论笔记(一):初识机器学习

    文章目录 1 前言 蓝色是天的机器学习笔记专栏 1 1 专栏初衷与定位 1 2 本文主要内容 2 机器学习的定义 2 1 机器学习的本质 2 2 机器学习的分类 3 机器学习的基本术语 4 探索 没有免费的午餐 定理 NFL 5 结语 1
  • tkinter控件样式

    文章目录 以按钮为例 共有参数 动态属性 tkinter系列 GUI初步 布局 绑定变量 绑定事件 消息框 文件对话框 控件样式 扫雷小游戏 强行表白神器 以按钮为例 tkinter对控件的诸多属性提供了可定制的功能 下面以最常用的按钮作为
  • 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架 被开发者用于实施对应用程序的单元测试 加快程序编制速度 同时提高编码的质量 JUnit 测试框架具有以下重要特性 测试工具 测试套件 测试运行器 测试分类 了解 Junit 基础方法 加入依赖 在 po
  • Eclipse中的checkstyle插件

    一 Checkstyle工具 Checkstyle是一款检查Java程序源代码样式的工具 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准 官方地址 http checkstyle sourceforge net 二 在Eclipse

随机推荐

  • PPT模板

    http www officeplus cn List shtml cat PPT tag 1
  • CH3-Android常见界面控件

    目标 掌握简单控件的使用 能够独立搭建一个注册界面 掌握ListView控件与RecyclerView控件的使用 能独立搭建列表界面 掌握自定义控件的定义方式 能够自定义一个简单的控件 几乎每一个Android应用都是通过界面控件与用户交互
  • Linux--多线程(1)

    目录 一 概念 二 理解 三 创建 退出 合并进程 man pthread create Compile and link with pthread 1 为什么没有fun函数 2 加上sleep来改进 3 线程结束会不会影响主线程运行 4
  • Java应用调试利器——BTrace教程

    http www jianshu com p 26f19095d396 背景 生产环境中可能出现各种问题 但是这些问题又不是程序error导致的 可能是逻辑性错误 这时候需要获取程序运行时的数据信息 如方法参数 返回值来定位问题 通过传统的
  • ZRANGEBYSCORE

    ZRANGEBYSCORE key min max WITHSCORES LIMIT offset count 返回有序集 key 中 所有 score 值介于 min 和 max 之间 包括等于 min 或 max 的成员 有序集成员按
  • Python Tkinter详解 (四)文本输入框的使用

    同样的 我们先创建出一个最最最最最简单的输入框 我们在进行信息交互的时候 会经常使用输入框为我们的系统键入信息 那么他又有哪些属性呢 import tkinter as tk window tk Tk tk Entry window wid
  • STM32 基础系列教程 20 - RTC

    前言 学习stm32 RTC 实时时钟 的使用 学会用RTC实现钟表功能 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是 STM32F103c8t6 使用stm32cubemx 工具自动产生的配置工程 使用KE
  • 二叉树的相关列题!!

    对于二叉树 很难 很难 笔者也是感觉很难 虽然能听懂课程 但是 对于大部分的练习题并不能做出来 所以感觉很尴尬 因此 笔者经过先前的那篇博客 已经开启了大脑奇迹 现在还热乎着 刚刚的更文 二叉树讲解https blog csdn net w
  • OC学习篇之---类的延展

    前一篇文章我们介绍了类的类目概念和使用 http blog csdn net jiangwei0910410003 article details 41775329 那么这篇文章我们继续来介绍一下OC中的一个特性 延展 其实说白了 延展就是
  • 有关EMQX桥接的配置工作

    前言 桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式 不同于集群 工作在桥接模式下的节点之间不会复制主题树和路由表 桥接模式所做的是 按照规则把消息转发至桥接节点 从桥接节点订阅主题 并在收到消息后在本节点 集群中转发
  • Unity - 微信小游戏

    总参考 Unity WebGL 微信小游戏适配方案 公测 安装与使用 下载 Unity插件 并导入至游戏项目中 版本更新请查看更新日志 请查阅推荐引擎版本 安装时选择WebGL组件 最终选择Unity2021 2 5f1c1InstantG
  • 实战项目:图书管理系统介绍

    本文详细的介绍了实战项目之一的图书管理系统 下载后可以直接使用 也可以直接用于毕业设计 本系统前端使用的框架是vue2 elementUI 后端使用的框架为springboot mybatis maven 数据库使用的是myql数据库 安全
  • 【我不知道的css】巧用flex:0实现上方图片下方文字效果

    我不知道的css 巧用flex 0实现上方图片下方文字效果 要求 代码 原理 要求 要求使用flex布局实现下图所示的效果 容器内部左边为图片和文字 图片在上 文字在下 图片大小不一 文字长度不一 但要求文字根据图片的宽度自动换行 代码 d
  • java mysql教程基于_SpringBoot入门教程(五)Java基于MySQL实现附近的人

    附近的人 这个功能估计都不陌生 与之类似的功能最开始是在各大地图应用上接触过 比如搜附近的电影院 附近的超市等等 然而真正让附近的人火遍大江南北的应该是微信 附近的人 这个功能 记得微信刚出的时候 坊间还有一句 寂寞女聊玩微信 寂寞男人搜附
  • spring security 入门与理解

    1 pom加载
  • seo积分排名系统源码_SEO快速排名系统操作手法以及细节

    SEO快速排名是目前我国SEO行业最热门的话题之一 总之 所有的快速行都可以用两个词来解释 那就是点击 任何行业 包括SEO 都可以使用的原因也是一样的 例如 目前我国有大量的快速排序系统 这种快速排序系统由于百度的雷声算法而受到不同程度的
  • 使用阿里云服务器安装宝塔面板搭建网站教程(图文全流程)

    阿里云服务器安装宝塔面板教程 云服务器吧以阿里云Linux系统云服务器安装宝塔Linux面板为例 先配置云服务器安全组开放宝塔所需端口8888 888 80 443 20和21端口 然后执行安装宝塔面板命令脚本 最后登录宝塔后台安装LNMP
  • 6 款 超好用的 Python 时间库

    开源最前线 ID OpenSourceTop 链接 https opensource com article 18 4 python datetime libraries 写过Python程序的人都知道 Python日期和时间的处理非常繁琐
  • TIDB 详解

    TIDB是什么 TIDB 受谷歌Spanner和F1的论文启发的new sql数据库 这类数据库不仅具有NoSQL对海量数据的存储管理能力 还保持了传统数据库支持ACID和SQL等特性 同类数据库还包括巨杉数据库 TiDB的原理与实现 Ti
  • 嵌入式web服务器Boa的移植

    Boa是一种非常小巧的Web服务器 其可执行代码只有大约60KB左右 作为一种单任务Web服务器 Boa只能依次完成用户的请求 而不会fork出新的进程来处理并发连接请求 但Boa支持CGI 能够为CGI程序fork出一个进程来执行 Boa