LV11-01-BOA服务器-01-移植过程

本文主要是BOA服务器移植的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
Linux开发板 华清远见 底板: FS4412_DEV_V5 核心板: FS4412 V2
u-boot 2013.01
linux内核 linuz-3.14
点击查看本文参考资料
参考方向参考原文
华清远见课程华清远见课程
驱动开发指南i.MX6ULL Linux阿尔法开发板资料
BOA官网Boa Webserver
点击查看相关文件下载
文件下载链接
------

一、 BOA 简介

BOA是一个小型高效的Web服务器,它可以运行于 unix 或 linux 下,支持CGI ( CGI 只是一个进程,用来提供接口,完成HTML与C语言之间的数据通信),它也是一个适合于嵌入式系统的单任务 http 服务器。

其可执行代码只有大约 60KB 左右, BOA 只能依次完成用户的请求,而不会 fork 出新的进程来处理并发连接请求。BOA 的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。

BOA的特点:可靠性和可移植性,他并不作为一个功能强大的服务器,它使用 GNU/Linux作为开发平台。

image-20220921081532905

如上图所示,A9平台作为一个客户端,网页也作为一个客户端,他们使用的编程语言是不一样的,A9平台使用的是C语言,web网页端使用的是HTML语言,我们的数据要想从A9到 web,或者从web到A9的话,他们之间需要一个“桥梁”,通过这个桥梁打通两种语言之间的数据通信,这个桥梁就是CGI,这是一个进程,它提供了C语言和HTML之间的接口,可以实现两者之间数据的交互。

但是有了沟通的桥梁还不够,CGI和HTML是不同的文件吗,他们怎么知道对方在哪里呢?而且我们要将数据发送出去,又要接收数据,他们怎么知道数据是发给谁的呢?怎么知道数据来自哪里呢?这些问题都是依赖于BOA服务器,BOA服务器可以完成数据的封装和转发,可以让HTML找到CGI文件在哪,CGI文件也可以找到HTML文件在哪,这样就保证了他们之间的通信,这样我们便实现了web网页与A9平台的一个通信了。

二、文件准备

1. BOA 源码

1.1 源码获取途径

关于 BOA 的官方源码我们可以从这里获取:Boa Webserver——Latest Released Version (0.94.13)

image-20220905065851391

1.2 获取源码文件

我下载的是 boa-0.94.13.tar.gz 这个压缩包并将其存放于 ubuntu 下的共享文件夹下,路径为:

1
/mnt/hgfs/Sharedfiles/

1.3 拷贝解压

然后我们可以将这个源码文件拷贝解压到 ubuntu 中,方便后边编译,我们可以在终端执行以下命令:

1
2
3
cp /mnt/hgfs/Sharedfiles/boa-0.94.13.tar.gz ~/6temp/    # 拷贝压缩包
cd ~/6temp/
tar -xvf boa-0.94.13.tar.gz # 解压

然后我们可以得到下边这些文件(通过 ls 命令查看):

1
2
boa.conf   contrib  docs      extras       README
ChangeLog CREDITS examples Gnu_License src

三、 BOA 移植到 Ubuntu

1. 配置源码

我们进入 boa 源码中的 src 目录:

1
cd ~/6temp/cd ~/6temp/boa-0.94.13/src/

然后执行以下命令:

1
./configure

之后便会根据 configure.in 文件进行一系列的配置,生成 config.status 、 configure ,和 Makefile 文件,后续我们才能进行源码编译,如果无法执行这个命令,可以修改一下文件权限:

1
suod chmod 755 configure

2. 源码修改

这部分是移植完,启动 boa 服务器可能遇到的问题。

2.1 服务器根目录

我们在后边安装完成后,启动 boa 服务器时,会遇到这样一个问题:

1
Could not chdir to "/etc/boa": aborting

我们打开 boa 服务器源码中 src 目录下的 defines.h 文件:

1
vim ~/6temp/boa-0.94.13/src/defines.h

我们找到下边的语句:

1
#define SERVER_ROOT "/etc/boa"

将其修改为:

1
#define SERVER_ROOT "/home/hk/6temp/boa"

然后保存退出,这样 boa 程序启动时会在 /home/hk/6temp/boa 目录下寻找 boa.conf 配置文件,并且将 /home/hk/6temp/boa 目录作为服务器的根目录。

2.2 boa.c

boa 启动时会可能出现:

1
boa.c:226 - icky linux kernel bug!: No suchfile or directory

我们使用 vim 打开 boa.c 这个文件:

1
2
# 文件路径:boa-0.94.13/src/boa.c
vim ~/6temp/boa-0.94.13/src/boa.c +225 # 这个版本的话应该是在225行

打开文件后,我们找到以下内容:

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

将其修改为:

1
2
3
4
5
#if 0
if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
#endif

2.3 log.c

boa 启动时,即便已经设置了对的 log 文件和路径,也创建了 error_log 和 access_log 文件,但是依然可能出现:

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

这个时候我们可以修改源码文件:

1
vim ~/6temp/boa-0.94.13/src/log.c +73     # 这个版本的话应该是在225行

我们找到以下语句:

1
2
3
4
5
/* redirect stderr to error_log */
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
close(error_log);

将其注释掉:

1
2
3
4
5
6
7
#if 0
/* redirect stderr to error_log */
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
close(error_log);
#endif

dup2 函数是用于复制文件描述符。

3. 编译源码

3.1 编译命令

我们直接在 boa 源码顶层目录的 src 目录下执行 make 指令:

1
make

首次进行移植的时候可能会报很多的问题,期间会报一些警告,这些警告目前好像问题不大,主要报的 error 问题及解决方法可以看后边。

3.2 问题一

1
2
3
4
yacc  -d boa_grammar.y
make: yacc:命令未找到
Makefile:59: recipe for target 'y.tab.c' failed
make: *** [y.tab.c] Error 127

解决方法就是安装 bison :

1
2
3
sudo apt-get install bison
make clean # 清空之前编译的文件
make # 重新编译

3.3 问题二

1
2
3
4
5
6
7
8
9
10
yacc  -d boa_grammar.y
gcc -g -O2 -pipe -Wall -I. -c -o y.tab.o y.tab.c
y.tab.c: In function ‘yyparse’:
y.tab.c:1191:16: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration]
yychar = yylex ();
^
lex boa_lexer.l
make: lex:命令未找到
Makefile:62: recipe for target 'lex.yy.c' failed
make: *** [lex.yy.c] Error 127

解决方法就是安装 flex :

1
2
3
sudo apt-get install flex
make clean # 清空之前编译的文件
make # 重新编译
点击查看安装 flex 可能出现的问题
1
2
3
4
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 参数,让其在安装的时候自动搜索依赖:

1
sudo  apt-get install flex -f

3.4 问题三

1
2
3
4
5
6
7
8
9
10
11
gcc  -g -O2 -pipe -Wall -I.   -c -o util.o util.c
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
^
<builtin>: recipe for target 'util.o' failed

解决方法如下:

  • 修改 compat.h 文件
1
2
# 文件路径:boa-0.94.13/src/compat.h
vim compat.h +120 # 这个版本的话应该是在120行

打开文件后,我们找到以下内容:

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

将其修改为:

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

4. 安装 BOA

后来发现这里其实直接创建到 / 根目录下的话,会很方便后边往开发板中一移植,但是这里创建在其他目录的话,后边替换一下到根目录其实就可以了。

4.1 创建相关目录

接下来就是创建安装的目录了:

1
2
3
cd ~/6temp/
mkdir -p boa boa/www boa/cgi-bin boa/log
cd ~/6temp/boa

4.2 复制相关文件

(1)将 boa-0.94.13/src 目录下生成的 boa 、 boa_indexer 二进制文件复制到 boa 目录下:

1
2
cp ~/6temp/boa-0.94.13/src/boa .
cp ~/6temp/boa-0.94.13/src/boa_indexer .

(2)将 boa-0.94.13 目录下的 boa.conf 文件复制到 boa 下:

1
cp ~/6temp/boa-0.94.13/boa.conf .

(3)将 /etc/mime.types ( Ubuntu 根目录中的文件)复制到 boa 目录下:

1
sudo cp /etc/mime.types .

mime.types 文件用来指明不同文件扩展名对应的 MIME 类型,一般可以直接从 Linux 主机上拷贝一个,大部分也都是在主机的 /etc 目录下,同样,将主机的 mime.types 文件拷贝到开发板上的 /etc 目录下。

4.3 文件“瘦身”

我们可以执行以下命令来删除 boa 可执行文件中的调试信息,只是减小文件大小,可有可无:

1
strip boa

5. 修改配置文件

我们回到 boa 的安装目录下:

1
cd ~/6temp/boa/

然后打开 boa.conf 文件:

1
vim boa.conf

接下来就是重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于 boa 服务器的工作机制。

5.1 修改内容

5.1.1 Port

1
Port 80

端口保持默认即可。

5.1.2 User 和 Group

1
2
User nobody
Group nogroup

将以上两句改为:

1
2
User 0
Group 0

5.1.3 ErrorLog 和 AccessLog

error_log 和 access_log 会自动生成,只要指定生成路径就可以了。

1
2
ErrorLog /var/log/boa/error_log
AccessLog /var/log/boa/access_log

将以上两句路径修改为:

1
2
ErrorLog /home/hk/6temp/boa/log/error_log
AccessLog /home/hk/6temp/boa/log/access_log

5.1.4 DocumentRoot

存放 HTML 文件的根路径

1
DocumentRoot /var/www

将路径修改为:

1
DocumentRoot /home/hk/6temp/boa/www

5.1.5 DirectoryIndex

若在浏览器地址栏输入http://127.0.0.1/,则会自动返回给浏览器默认页面 index.html

1
DirectoryIndex index.html                # 保持默认

保持默认即可。

5.1.6 DirectoryMaker

1
DirectoryMaker /usr/lib/boa/boa_indexer

修改为

1
DirectoryMaker /home/hk/6temp/boa/boa_indexer

5.1.7 MimeTypes

1
MimeTypes /etc/mime.types

修改为

1
MimeTypes /home/hk/6temp/boa/mime.types

5.1.8 CGIPath

指定传给 cgi 程序的 PATH 环境变量

1
CGIPath /bin:/usr/bin:/usr/local/bin

保持默认。

5.1.9 ScriptAlias

如果输入http://127.0.0.1/cgi-bin/test.cgi, 则 boa 服务器会到 /usr/lib/cgi-bin/ 中寻找 test.cgi 程序。

1
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

修改为

1
ScriptAlias /cgi-bin/ /home/hk/6temp/boa/cgi-bin/

5.2 最终文件内容

点击查看详情
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# Boa v0.94 configuration file
# File format has not changed from 0.93
# File format has changed little from 0.92
# version changes are noted in the comments
#
# The Boa configuration file is parsed with a lex/yacc or flex/bison
# generated parser. If it reports an error, the line number will be
# provided; it should be easy to spot. The syntax of each of these
# rules is very simple, and they can occur in any order. Where possible
# these directives mimic those of NCSA httpd 1.3; I saw no reason to
# introduce gratuitous differences.

# $Id: boa.conf,v 1.25 2002/03/22 04:33:09 jnelson Exp $

# The "ServerRoot" is not in this configuration file. It can be compiled
# into the server (see defines.h) or specified on the command line with
# the -c option, for example:
#
# boa -c /usr/local/boa


# Port: The port Boa runs on. The default port for http servers is 80.
# If it is less than 1024, the server must be started as root.

Port 80

# Listen: the Internet address to bind(2) to. If you leave it out,
# it takes the behavior before 0.93.17.2, which is to bind to all
# addresses (INADDR_ANY). You only get one "Listen" directive,
# if you want service on multiple IP addresses, you have three choices:
# 1. Run boa without a "Listen" directive
# a. All addresses are treated the same; makes sense if the addresses
# are localhost, ppp, and eth0.
# b. Use the VirtualHost directive below to point requests to different
# files. Should be good for a very large number of addresses (web
# hosting clients).
# 2. Run one copy of boa per IP address, each has its own configuration
# with a "Listen" directive. No big deal up to a few tens of addresses.
# Nice separation between clients.
# The name you provide gets run through inet_aton(3), so you have to use dotted
# quad notation. This configuration is too important to trust some DNS.

#Listen 192.68.0.5

# User: The name or UID the server should run as.
# Group: The group name or GID the server should run as.

User 0
Group 0

# ServerAdmin: The email address where server problems should be sent.
# Note: this is not currently used, except as an environment variable
# for CGIs.

#ServerAdmin root@localhost

# ErrorLog: The location of the error log file. If this does not start
# with /, it is considered relative to the server root.
# Set to /dev/null if you don't want errors logged.
# If unset, defaults to /dev/stderr

ErrorLog /home/hk/6temp/boa/log/error_log
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#ErrorLog "|/usr/sbin/cronolog --symlink=/var/log/boa/error_log /var/log/boa/error-%Y%m%d.log"

# AccessLog: The location of the access log file. If this does not
# start with /, it is considered relative to the server root.
# Comment out or set to /dev/null (less effective) to disable
# Access logging.

AccessLog /home/hk/6temp/boa/log/access_log
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#AccessLog "|/usr/sbin/cronolog --symlink=/var/log/boa/access_log /var/log/boa/access-%Y%m%d.log"

# UseLocaltime: Logical switch. Uncomment to use localtime
# instead of UTC time
#UseLocaltime

# VerboseCGILogs: this is just a logical switch.
# It simply notes the start and stop times of cgis in the error log
# Comment out to disable.

#VerboseCGILogs

# ServerName: the name of this server that should be sent back to
# clients if different than that returned by gethostname + gethostbyname

#ServerName www.your.org.here

# VirtualHost: a logical switch.
# Comment out to disable.
# Given DocumentRoot /var/www, requests on interface 'A' or IP 'IP-A'
# become /var/www/IP-A.
# Example: http://localhost/ becomes /var/www/127.0.0.1
#
# Not used until version 0.93.17.2. This "feature" also breaks commonlog
# output rules, it prepends the interface number to each access_log line.
# You are expected to fix that problem with a postprocessing script.

#VirtualHost

# DocumentRoot: The root directory of the HTML documents.
# Comment out to disable server non user files.

DocumentRoot /home/hk/6temp/boa/www

# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is recieved.

UserDir public_html

# DirectoryIndex: Name of the file to use as a pre-written HTML
# directory index. Please MAKE AND USE THESE FILES. On the
# fly creation of directory indexes can be _slow_.
# Comment out to always use DirectoryMaker

DirectoryIndex index.html

# DirectoryMaker: Name of program used to create a directory listing.
# Comment out to disable directory listings. If both this and
# DirectoryIndex are commented out, accessing a directory will give
# an error (though accessing files in the directory are still ok).

DirectoryMaker /home/hk/6temp/boa/boa_indexer

# DirectoryCache: If DirectoryIndex doesn't exist, and DirectoryMaker
# has been commented out, the the on-the-fly indexing of Boa can be used
# to generate indexes of directories. Be warned that the output is
# extremely minimal and can cause delays when slow disks are used.
# Note: The DirectoryCache must be writable by the same user/group that
# Boa runs as.

# DirectoryCache /var/spool/boa/dircache

# KeepAliveMax: Number of KeepAlive requests to allow per connection
# Comment out, or set to 0 to disable keepalive processing

KeepAliveMax 1000

# KeepAliveTimeout: seconds to wait before keepalive connection times out

KeepAliveTimeout 10

# MimeTypes: This is the file that is used to generate mime type pairs
# and Content-Type fields for boa.
# Set to /dev/null if you do not want to load a mime types file.
# Do *not* comment out (better use AddType!)

MimeTypes /home/hk/6temp/boa/mime.types

# DefaultType: MIME type used if the file extension is unknown, or there
# is no file extension.

DefaultType text/plain

# CGIPath: The value of the $PATH environment variable given to CGI progs.

CGIPath /bin:/usr/bin:/usr/local/bin

# SinglePostLimit: The maximum allowable number of bytes in
# a single POST. Default is normally 1MB.

# AddType: adds types without editing mime.types
# Example: AddType type extension [extension ...]

# Uncomment the next line if you want .cgi files to execute from anywhere
#AddType application/x-httpd-cgi cgi

# Redirect, Alias, and ScriptAlias all have the same semantics -- they
# match the beginning of a request and take appropriate action. Use
# Redirect for other servers, Alias for the same server, and ScriptAlias
# to enable directories for script execution.

# Redirect allows you to tell clients about documents which used to exist in
# your server's namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
# Example: Redirect /bar http://elsewhere/feh/bar

# Aliases: Aliases one path to another.
# Example: Alias /path1/bar /path2/foo

Alias /doc /usr/doc

# ScriptAlias: Maps a virtual path to a directory for serving scripts
# Example: ScriptAlias /htbin/ /www/htbin/

ScriptAlias /cgi-bin/ /home/hk/6temp/boa/cgi-bin/

6. 测试文件添加

6.1 index.html

我们在 boa 的安装目录下的子目录 www 中,也就是 boa/www 目录中新建 index.html 文件,并输入以下内容:

1
2
3
4
5
6
7
8
9
<html>  
<body>
<h3>this is a test!</h3><br/>
<img src="image.jpg"/>
<h3>tree picture</h3><br/>
<!-- 指定了cgi可执行文件存放的路径,默认从/boa的根目录开始查找 -->
<a href="/cgi-bin/test.cgi">to cgi page</a>
</body>
</html>

最后保存为 utf-8 格式。

6.2 image.jpg

准备一张图片放在 ~/6temp/boa 目录下,用于图片显示测试。

6.3 test.c

在 ~/6temp/boa/www 目录下新建 test.c 测试文件,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(int argc, const char *argv[])
{
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 编译器将其编译为 .cgi 为后缀的可执行文件:

1
gcc test.c -o test.cgi -Wall

然后我们便会得到一个 test.cgi 可执行文件,我们将其拷贝到 ~/6temp/boa/cgi-bin 目录下:

1
cp ~/6temp/boa/www/test.cgi ~/6temp/boa/cgi-bin/

6.4 access_log 与 error_log

首次运行前,我们在 ~/6temp/boa/log 目录下新建 access_log 文件和 error_log 文件:

1
2
touch ~/6temp/boa/log/access_log
touch ~/6temp/boa/log/error_log

不创建的话可能在启动 boa 的时候会报以下错误:

1
log.c:73 - unable to dup2 the error log: Bad file descriptor

7. 文件组成

移植安装完成后,我们看一下这个 boa 目录的组成:

1
2
cd ~/6temp/boa
tree

然后我们可以看到目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── boa
├── boa.conf
├── boa_indexer
├── cgi-bin
│   └── test.cgi
├── log
│   ├── access_log
│   └── error_log
├── mime.types
└── www
├── image.jpg
├── index.html
├── test.c
└── test.cgi

3 directories, 11 files

8. 效果测试

8.1 启动 boa

我们在 ~/6temp/boa 目录下执行以下命令即可启动 boa 服务器:

1
2
cd ~/6temp/boa
sudo ./boa
点击查看可能出现的问题
  • 问题一
1
Could not chdir to "/etc/boa": aborting

解决方法看 BOA 移植到 Ubuntu 这部分的 2.1 节。

  • 问题二
1
boa.c:226 - icky linux kernel bug!: No suchfile or directory

解决方法看 BOA 移植到 Ubuntu 这部分的 2.2 节。

  • 问题三
1
[05/Sep/2022:01:40:11 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor

解决方法看 BOA 移植到 Ubuntu 这部分的 6.4 节。

  • 问题四
1
[05/Sep/2022:02:13:47 +0000] boa.c:194 - unable to bind: Address already in use

原因就是之前已经启动过 boa 服务器,解决办法就是杀掉这个进程:

1
2
ps -axj  | grep boa # 查看进程PID
sudo kill -9 PID # 杀掉整个进程

启动成功则会有以下提示信息:

1
2
3
[05/Sep/2022:02:16:04 +0000] boa: server version Boa/0.94.13
[05/Sep/2022:02:16:04 +0000] boa: server built Sep 5 2022 at 10:04:15.
[05/Sep/2022:02:16:04 +0000] boa: starting server pid=119253, port 80

然后整个进程就运行在后台了。

8.2 本地测试

我们打开 Ubuntu 的浏览器,然后输入:

1
2
3
4
5
http://127.0.0.1

# 或者 http://localhostip:port 即
http://192.168.10.101:80

然后便会弹出这样一个页面:

image-20220905101822394

这就说明我们的 boa 服务器已经在正常运行了,我们再点击 return ro cgi page 会跳转到这样一个页面:

image-20220905101918395

这便说明我们的 boa 服务器已经可以正常在 Ubuntu 上运行了。

四、 BOA 移植到开发板

1. 移植过程

其实移植到开发板上的步骤与移植到 Ubuntu 的步骤是一模一样的,只是需要修改一下执行完 .configure 后生成的 makefile 文件,我们找到以下语句:

1
2
CC = gcc 
CPP = gcc -E

将其修改为:

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

然后重新编译生成相关文件,其他的步骤就和移植到 ubuntu 步骤一样了,另外要

【注意】

(1)在编译 test.c 的时候也需要换成交叉编译器。

(2)拷贝 mime.types 的时候也是拷贝主机下的,开发板的文件系统应该没有这文件。

2. 启动问题

2.1 问题一

1
2
[root@farsightboa]#./boa
[01/Jan/1970:00:20:49 +0000] boa.c:211 - getpwuid: No such file or directory

【解决方法】修改 ~/6temp/boa-0.94.13/src/boa.c 文件

找到如下语句(应该在 211 行):

1
2
3
4
5
6
if (passwdbuf == NULL) {
DIE("getpwuid");
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE("initgroups");
}

将其注释掉:

1
2
3
4
5
6
7
8
#if 0
if (passwdbuf == NULL) {
DIE("getpwuid");
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE("initgroups");
}
#endi

2.2 问题二

在启动的时候有以下提示,然后程序直接退出了:

1
gethostbyname:: Success

【解决方法】

在开发板中 /boa 目录下打开 boa.conf 文件,添加如下语句:

1
ServerName  www.your.org.here

3. 主机访问

开发板中没有图形界面,也没有浏览器,我们可以借助主机来进行,我们的主机 ubuntu 需要能与开发板 ping 通,然后在浏览器地址栏输入:

1
2
3
4
http://<开发板ip>:port

或者直接输入:
<开发板ip>:port

五、 boa.conf 文件详解

1. Port

1
Port 80

监听的端口号,缺省都是 80 ,一般无需修改。注意,如果我们的 httpd 服务器已经开启,那么必须关掉或者重新设定端口号,当修改了模式 http 端口,那么访问的时候要加上端口号,如: http://localhostip:port

2. User

1
User nobody

作为哪个用户运行,即它拥有该用户的权限,一般都是 nobody ,需要 /etc/passwd 中有 nobody 用户。

3. Group

1
Group nogroup

作为哪个用户组运行,即它拥有该用户组的权限,一般都是 nogroup ,需要在 /etc/group 文件中有 nogroup 组。

4. UseLocaltime

1
# UseLocaltime: Logical switch.  Uncomment to use localtime

是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用 UTC 时间。

5. VerboseCGILogs

1
# VerboseCGILogs: this is just a logical switch.

是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录。

6. ServerName

1
2
#ServerName www.your.org.here
ServerName www.chad.com

服务器名字。

7. VirtualHost

1
# VirtualHost: a logical switch.

是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的 Web 服务器。一般注释掉,即不需要启动。

8. DocumentRoot

1
DocumentRoot /var/www

非常重要, HTML 文档的主目录。如果没有以 / 开始,则表示从服务器的根路径开始。注意,如果此处设置不正确,将不能打开网页。

9. UserDir

1
UserDir public_html

如果收到一个用户请求的话,在用户主目录后再增加的目录名。

10. DirectoryIndex

1
DirectoryIndex index.html

HTML 目录索引的文件名,也是没有用户只指明访问目录时返回的文件名。

11. DirectoryMaker

1
DirectoryMaker /usr/lib/boa/boa_indexer

当 HTML 目录没有索引文件时,用户只指明访问目录时, boa 会调用该程序生成索引文件然后返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个 HTML 目录加上 DirectoryIndex 指明的文件。

12. DirectoryCache

1
2
# DirectoryCache /var/spool/boa/dircache
DirectoryCache /var/spool/boa/dircache

如果 DirectoryIndex 不存在,并且 DirectoryMaker 被注释,那么就用 BOA 自带的索引生成程序来生成目录的索引文件并输出到 DirectoryCache 目录,该目录必须是 BOA 能读写。

13. KeepAliveMax

1
KeepAliveMax 1000

一个连接所允许的 HTTP 持续作用请求最大数目,注释或设为 0 都将关闭 HTTP 持续作用。

14. KeepAliveTimeout

1
KeepAliveTimeout 10

HTTP 持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接。

15. MimeTypes

1
MimeTypes /etc/mime.types

指明 mime.types 文件位置。如果没有以 / 开始,则表示从服务器的根路径开始。可以注释掉避免使用 mime.types 文件,此时需要用 AddType 在本文件里指明。

16. DefaultType

1
DefaultType text/plain

文件扩展名没有或未知的话,使用的缺省 MIME 类型。

17. CGIPath

1
CGIPath /bin:/usr/bin:/usr/local/bin

提供 CGI 程序的 PATH 环境变量值。

18. AddType

1
2
# AddType: adds types without editing mime.types
AddType application/x-httpd-cgi cgi

将文件扩展名和 MIME 类型关联起来,和 mime.types 文件作用一样。如果用 mime.types 文件,则注释掉,如果不使用 mime.types 文件,则必须使用。

19. Redirect

1
Redirect /bar http://elsewhere/feh/bar

指明文档重定向路径。

20. Alias

1
Alias /doc /usr/doc

为路径加上别名。

21. ScriptAlias

1
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

非常重要,指明 CGI 脚本的虚拟路径对应的实际路径。一般所有的 CGI 脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+ CGI 脚本名。