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