BOA服务器移植到ARM板

BOA服务器的移植

1、 boa 简介:

其可执行代码只有大约 60KB 左右,Boa 是一个单任务的 HTTP 服务器,Boa 只能依次完成用户的请求,而不会 fork 出新的进程来处理并发连接请求。Boa 支持 CGI。
Boa 的设计目标是速度和安全。(CGI 只是一个进程,用来提供接口),Boa 的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。
特点:可靠性和可移植性,Boa 不是作为功能强大的服务器。

2、虚拟机linux搭建boa

源码下载boa-0.94.13

解压

tar -xvf boa-0.94.13.tar.gz

在src源码目录下配置与编译、执行

cd boa-0.94.13/src/

chmod 755 configure

./configure

安装依赖包

sudo apt-get install bison

sudo apt-get install flex -f

make 编译源码

make

报错1:缺少bison

linux@linux:~/boa/boa-0.94.13/src$ make
yacc  -d boa_grammar.y
make: yacc: Command not found
make: *** [y.tab.c] Error 127

报错2:缺少 flex

y.tab.c:1189:7: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration]
       yychar = yylex ();
       ^
lex  boa_lexer.l
make: lex: Command not found
make: *** [lex.yy.c] Error 127

报错3:在 compat.h 文件中的宏定义问题

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

vi compat.h +120

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

vi boa.c +225

225 #if 0 //把下面内容屏蔽
226 if (setuid(0) != -1) {
227 DIE("icky Linux kernel bug!");
228 }
229 #endif

重新编译

make clean 清除之前编译的内容

make

建立安装目录

sudo mkdir -p /boa /boa/www /boa/cgi-bin /boa/log

修改服务器根目录

vi defines.h

#define SERVER_ROOT "/etc/boa" 
改为
#define SERVER_ROOT "/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

也可以不执行)

将/etc/mime.types 复制到/boa 目录下

sudo cp /etc/mime.types /boa

进入安装目录

cd /boa

arm-linux-strip boa(去掉 boa 中的调试信息,减小文件大小,可以不执行)

修改配置文件,更改路径,方便管理

vi boa.conf

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/ 

创建日志文件

sudo mkdir /boa/log

sudo touch log/error_log log/access_log

建立测试页面

cd /boa/www

如缺少权限获取超级用户权限

su

vi index.html

可以添加一张图片到当前的目录下测试

<html>  
    <body>  
        <h3>this is a test!</h3><br/>  
            <img src="image.jpg"/>  
        <h3>tree picture</h3><br/>  
        <a href="/cgi-bin/test.cgi">to cgi page</a>  
    </body>  
</html> 

vi test.c

int main()
{ 
    printf("Content-type:text/html\n\n");

    printf("<html><body>");
    printf("<font style=\"color:red; font-size:30px;\">Hello,CGI!</font><br/>");
    printf("<a href=\"/index.html\">return index.html</a>");
    printf("</body></html>");

    return 0;
} 

使用 gcc -o test.cgi test.c,将 test.c 编译生成 test.cgi,后缀为 cgi 的类型, 编译后得到的 test.cgi 放在/boa/cgi-bin 目录下

gcc -o test.cgi test.c

sudo cp test.cgi /boa/cgi-bin/

查看/boa目录下所有的文件

需安装 tree

sudo apt-get install tree

tree -a

在这里插入图片描述

运行测试

sudo ./boa

打开浏览器,使用本机回环地址或IP地址加端口号访问页面

127.0.0.1:80 //回环地址

ifconfig //查看本机IP

index.html 页面

在这里插入图片描述

test.cgi页面

在这里插入图片描述

关闭 boa 服务器

ps -axj | grep "boa"

kill -9 进程号

3、移植到ARM开发板

更改交叉编译工具链

在boa源码路径下/boa-0.94.13/src

./configure

生成 Makefile 后将 Makefile 中的编译命令改成ARM的

vi Makefile +31

CC = arm-linux-gcc
CPP = arm-linux-gcc -E

保存退出,删除之前生成的文件,重新编译

make clean

make
在这里插入图片描述

拷贝文件到ARM板上

可以用scp、tftp、nfs等工具

将 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 目录下

eg:

sudo scp -r oba_arm @192.168.9.9:/boa

拷贝完成后修改配置文件boa.conf

sudo vi boa.conf

修改 Group nogroup 为 Group 0
修改 User nobody 为 User 0
 
#修改日志路径
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/ 

移植完成

打开浏览输入ARMip+端口号

在这里插入图片描述

可能遇到的错误

问题描述:

[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

(2)移植 boa 到嵌入式 linux 后,在启动时若出现“gethostbyname:: Success

"然后程序退出,则需在原 boa.conf 文件中增加一行:

ServerName www.your.org.here

然后重新运行 boa,然后在主机浏览器输入开发板网址(http://开发板 ip:port)

[root@fengjunhui ]:~$ cd boa

[root@fengjunhui boa]:~$ ls

boa boa_indexer log www

boa.conf cgi-bin mime.types

[root@fengjunhui boa]:~$ ./boa

[01/Jan/1970:00:00:24 +0000] boa: server version Boa/0.94.13

[01/Jan/1970:00:00:24 +0000] boa: server built Jul 19 2017 at 23:07:48.

[01/Jan/1970:00:00:24 +0000] boa: starting server pid=1185, port 80

[root@fengjunhui boa]:~$ [01/Jan/1970:00:01:30 +0000] request from 192.168.8.223 

"GET /favicon.ico HTTP/1.1" ("/boa/www/favicon.ico"): document open: No such file 

or directory

[01/Jan/1970:00:01:30 +0000] request from 192.168.8.223 "GET /favicon.ico 

HTTP/1.1" ("/boa/www/favicon.ico"): document open: No such file or directory

这个问题不影响使用:

问题描述:

[01/Jan/1970:00:01:34 +0000] cgi_header: unable to find LFLF

出错位置

 cgi_procee_header()

对于错误 cgi_header: unable to find LFLF 的补充浏览器中显示 502 Bad Gateway

The CGI was not CGI/1.1 compliant.

解决方法:在 Ubuntu 端和 A9 端的交叉编译环境不一样,最好链接为静态库,这样不用单独提供库的支持

<3>编译方式:arm-linux-gcc -static -o xxx.cgi xxx.c

可能的原因:

<1>输出 MIME 格式错误,结尾一定要有两个换行符

printf("Content-Type:text/html\n\n")

<2>权限错误chmod 777 var/www/cgi-bin/xxx.cgi

<3>编译方式:arm-linux-gcc -static -o xxx.cgi xxx.c

<4>备用方案:代码本身错误也会引起这个问题。实践中这个问题困扰了很久,一个字符串数组的处理有了问题, 提示的错误信息却是这个,开始一直郁闷于格式和权限,也可能是调用的一个小函数有些问题而导致的。所以在遇到这个问题时,如果输出格式和权限都正确的情况下,检查代码是个很好的选择

boa.conf内容详解

boa.conf 内容详解:
25 Port 80
监听的端口号,缺省都是 80,一般无需修改。注意,如果你的 httpd 服务器已经开启,那么你必须关掉或
者重新设定端口号,
当你修改了模式 http 端口那么访问的时候要加上端口号,如 http://localhostip:port
作为哪个用户运行,即它拥有该用户的权限,一般都是 nobody,需 要 /etc/passwd 中有 nobody 用户
User nobody
查看: vi /etc/passwd 18 nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
作为哪个用户组运行,即它拥有该用户组的权限,一般都是 nogroup,需要在/etc/group 文件中有 nogroup
组
Group nogroup
查看: vi /etc/group 39 nogroup:x:65534:
是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用 UTC 时间
UseLocaltime
是否记录 CGI 运行信息,如果没有注释掉,则记录,注释掉则不记录
VerboseCGILogs
服务器名字
ServerName www.chad.com
是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的 Web 服务器。一般
注释掉,即不需要启动
VirtualHost
非常重要,HTML 文档的主目录。如果没有以/开始,则表示从服务器的根路径开始。注意,如果此处设置
不正确,将不能打开网页
DocumentRoot /var/www
如果收到一个用户请求的话,在用户主目录后再增加的目录名
UserDir public_html
HTML 目录索引的文件名,也是没有用户只指明访问目录时返回的文件名
DirectoryIndex index.html
当 HTML 目录没有索引文件时,用户只指明访问目录时,boa 会调用该程序生成索引文件然后返回给用户,
因为该过程比较慢最好不执行,
可以注释掉或者给每个 HTML 目录加上 DirectoryIndex 指明的文件
DirectoryMaker /usr/lib/boa/boa_indexer
如果 DirectoryIndex 不存在,并且 DirectoryMaker 被注释,那么就用 Boa 自带的索引生成程序来生成
目录的索引文件并输出到下面目录,
该目录必须是 Boa 能读写
DirectoryCache /var/spool/boa/dircache
一个连接所允许的 HTTP 持续作用请求最大数目,注释或设为 0 都将关闭 HTTP 持续作用
KeepAliveMax 1000
HTTP 持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接KeepAliveTimeout 10
指明 mime.types 文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉避免使用
mime.types 文件,此时需要用 AddType 在本文件里指明
MimeTypes /etc/mime.types
文件扩展名没有或未知的话,使用的缺省 MIME 类型
DefaultType text/plain
提供 CGI 程序的 PATH 环境变量值
CGIPath /bin:/usr/bin:/usr/local/bin
将文件扩展名和 MIME 类型关联起来,和 mime.types 文件作用一样。如果用 mime.types 文件,则注释掉,
如果不使用 mime.types 文件,则必须使用
AddType application/x-httpd-cgi cgi
指明文档重定向路径
Redirect /bar http://elsewhere/feh/bar
为路径加上别名
Alias /doc /usr/doc
非常重要,指明 CGI 脚本的虚拟路径对应的实际路径。一般所有的 CGI 脚本都要放在实际路径里,用户访
问执行时输入站点+虚拟路径+CGI 脚本名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
用户可以根据自己需要,对 boa.conf 进行修改,但必须要保证其他的辅助文件和设置必须和 boaconf 里
的配置相符,不然 Boa 就不能正常工作。
最后将修改好的 boa.conf 放在开发板上的/etc/boa 目录下。
在上面的例子中,我们还需要创建日志文件所在目录/var/log/boa,
创建 HTML 文档的主目录/var/www,将 mime.types 文件拷贝到/etc 目录,
创建 CGI 脚本所在目录/var/www/cgi-bin/。
mime.types 文件用来指明不同文件扩展名对应的 MIME 类型,一般可以直接从 Linux 主机上拷贝一个,
大部分也都是在主机的/etc 目录下,同样,将主机的 mime.types 文件拷贝到开发板上的/etc 目录下。

arm_boa代码

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值