您的位置:首页 > 运维架构 > Linux

linux Web服务器--Boa实验笔记

2009-02-24 18:37 197 查看
Web服务器--Boa实验笔记《嵌入式Linux系统开发详解——基于EP93XX系列ARM》一书和boa自带的文档等对该内容有比较详细的介绍,但在实验过程中,仍可能会出现一些问题。下面是我在MIZI
Linux SDK for S3C2410平台实验时记录下的实验步骤和出现的问题及解决方法,欢迎讨论。

13.WEB服务器实验

13.1 Boa移植

13.1.1
Boa移植步骤第一步:从www.boa.org下载Boa源码,将其解压并进入源码目录的src子目录。

#
tar  xzf  boa-0.94.13.tar.gz

# cd  boa-0.94.13/src生成Makefile文件

#
./configure修改Makefile文件,找到CC=gcc和CPP=gcc-E,分别将其改为交叉编译器安装的路径CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc和CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
-E并保存退出。

然后运行make进行编译,得到可执行程序boa

# make

#
/opt/host/armv4l/bin/armv4l-unknown-linux-strip
boa

第二步:Boa的配置。

Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改。

1.    GROUP
nogroup修改成GROUP0,由于在/etc/group文件中没有nogroup组,所以设成0另外在/etc/passwd中有nobody用户,所以User
nobody不用修改。

2.    ScriptAlias/cgi-bin/  /usr/lib/cgi-bin/ 修改成
ScriptAlias/cgi-bin/  /var/www/cgi-bin/其它默认设置即可。还需要创建日志文件所在目录/var/log/boa,创建HTML文档的主目录/var/www,将静态网页存入该目录下(可以将主机/usr/share/doc/HTML/目录下的index.html文件和img目录复制到/var/www目录下),创建CGI脚本所在目录/var/www/cgi-bin,将cgi的脚本存放在该目录下。另外还要将mime.types文件复制/etc目录下,通常可以从linux主机的/etc目录下直接复制即可。

第三步:测试1.静态HTML网页在目标板上运行boa程序,将主机与目标机的ip设成同一网段,然后打开任一个浏览器(linux或window下都可),输入目标板的ip地址(http://10.10.10.2)即可打开/var/www/index.html网页2.CGI脚本测试boa源码中有cgi-bin测试脚本(boa-0.94.13/examples/cgi-test.cgi),但由于它不是在我们目标平台下编译的,所以不能将它复制到/var/www/cgi-bin目录下进行测试。

下面是一个简单的hello,
world!程序,代码如下:

#include <stdio.h>

void main(){    

printf("Content-type:
text/html/n/n");    

printf("<html>/n");    

printf("<HEAD><title>CGIOUTPUT</title></HEAD>/n");    

printf("<body>/n");    

printf("<hl>Hello,
world.</hl>/n");    

printf("<body>/n");    

printf("</html>/n");    

exit(0);

}

13.1.2
Boa移植时出现的问题

1.    当运行boa程序时出现错误,如下:

# ./boa[27/Nov/1990:13:22:25 +
0000]boa.c:266.icky Linux kernel bug!:No suchfile将 User 0修改成 User
nobody

2.    打开网页时,网页中的图片无法显示就将存放图片的子目录/var/www/images修改成/var/www/img3.    

在测试cgi脚本时,当在浏览器地址中输入“http//10.10.10.2/cgi-bin/helloworld.cgi”时,浏览输出下述错误:502
Bad GatewayThe CGI was not CGI/1.1 compliant在目标板的调试终端中输出下述错误:……cgi_HEADer:unable
to find LFIF上述错误是在boa原码中的cgi_HEADer .c文件中的process_cgi_HEADer函数产生,如下:    

buf =
req->HEADer_line;    

c = strstr(buf, "/n/r/n");    

if (c == NULL) {        

c
= strstr(buf,"/n/n");        

if (c == NULL)
{            

log_error_time();            

fputs("cgi_HEADer:unable to find
LFLF/n", stderr);  //出错信息#ifdef
FASCIST_LOGGING            

log_error_time();            

fprintf(stderr,"/"%s/"/n",
buf);

#endif            

send_r_bad_gateway(req);            

return0;        

}}

我们可以定义FASCIST_LOGGING,使产生该错误时将buf内容打印出来,结果如下:……cgi_HEADer:unable
to find LFIFContent-type: text/html<html><HEAD><title>CGI
OUTPUT</title></HEAD><body><hl>Hello,
world.</hl><body></html>

原来buf中的内容就是helloworld.c中输出的内容,查看输出结果,再看process_cgi_HEADer函数中的语句:c
=
strstr(buf,"/n/n"),很明显buf中没有两个连续的换行符"/n/n",所以是helloworld.c文件中的语句:printf("Content-type:
text/html/n/n");

错写成了printf("Content-type:
text/html/n");

上述行通过标准输出将字符串″Contenttype:text/plain/n/n″传送给Web服务器。它是一个MIME头信息,告诉Web服务器随后的输出是以纯ASCII文本的形式。在这个头信息中有两个新行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。

13.2
WEB应用开发

13.2.1 CGIC库的移植从CGIC的主站点http://www.boutell.com/cgic/上下载源码,将其解压并进入源码目录。#
tar  –zxvf  cgic.tar.gz

#
cd  cgic205修改Makefile文件,找到CC=gcc,将其改为CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc,找到AR=ar,将其改为AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar,找到RANLIB=ranlib,将其改为RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib。找到gcc
cgictest.o –o cgictest.cgi ${LIBS},将其改为$(CC) $(CFLAGS) cgictest.o–o cgictest.cgi
${LIBS},找到gcc capture.o –o capture
${LIBS},并保存退出。

然后输入make进行编译,可以将生成的capture和cgictest.cgi文件复制到目标板目录/var/www/cgi-bin/下,以测试正确性。

13.3.2
基于CGIC库的例程参考《嵌入式Linux系统开发详解——基于EP93XX系列ARM》一书中的list.html和list.c13.3.3例程出现的问题1
>  点击submit(提交)按钮后,终端输出错误信息:…mkstemp:Permission
denied   

浏览器弹出错误对话框:此文档中无数据   原因:是在boa源代码目录下的util.c文件中,用mkstemp()函数创建一个临时文件时出现权限错误。

这是由于在boa.conf文件设置了user:nobody,使其运行boa服务器时以nobody为用户(可以用ps命令查看),所以在创建临时文件是没有足够的权限,可以在boa.conf中将运行boa的用户为root身份(user:root)。

2
> 当上述设置user:root时,运行boa时,在终端会输出错误信息:boa.c:266.icky Linux kernelbug!:No such
file原因:boa.c文件中的下述语句出现问题,可以将boa.c文件中的该行屏蔽掉。

if (setuid(0) != -1)
{            

DIE("ickyLinux kernel bug!");        

}

3
>点击例程中的submit(提交)按钮后浏览器出现下述错误:

地址变为:http://10.10.10.2/var/www/cgi-bin/list.cgi

内容:400
Bad Request Your client has issued a malfarned or
illegalrequest原因是list.html中<form NAME="SystemCont"
method="post"action="/cgi-bin/list.cgi" onSubmit="return
checkform()">写成了<formNAME="SystemCont" method="post"
action="/var/www/cgi-bin/list.cgi"onSubmit="return checkform()">

4
>在查看目录项输入目录如:/var/www/cgi-bin/,然后点击submit(提交)按钮后,浏览器恢复原样,而没有在文本框中显示ls/var/www/cgi-bin的内容。

原因是在list.html文件中的<!--Dir-->和<!--Files-->的前面有空格,使list.c文件中下述语句出错,所以在list.html中的上面两个注释一定要写在行的开头。

if
(strcmp(buf,”<!--Dir-->”)==0)

{……}

if
(strcmp(buf,”<!--Files-->”)==0)

{……}

 

From: http://blog.csdn.net/xzdwfwt111/archive/2008/05/20/2462162.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息