boa 移植文档(2011-08-04 20:36:12)
boa 版本:
操作系统平台:
Linux —— Fedora8 交叉编译器版本: arm-vfp-linux-gnu-gcc 开发板平台: YL-3250 <一>在x86平台上的移植 一> 1、下载源码程序boa-0.94.13.tar.gz 2、解压 #tar xzf boa-0.94.13.tar.gz 3、进入boa的源代码目录 #./configure 5、编译 #make 用2.95.3以上的版本编译时会出错: util.c:100:1: 错误:毗连“t”和“->”不能给出一个有效的预处理标识符 make: *** [util.o] 错误 1(中文版本) util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make:*** [util.o] Error 1(English version) 解决方法: 修改本目录下compat.h中的 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 为: #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff 再次编译,通过,会在当前目录(boa-0.94.13/src)下生成可执行文件boa。 二> 1、在/etc下建立boa目录,并复制/boa-0.94.13/boa.conf到/etc/boa目录下,因为在/src/defines.h源码中,宏SERVER_ROOT定义了服务器的根目录,如下: #ifndef SERVER_ROOT #define SERVER_ROOT "/etc/boa" #endif 当然也可以在运行命令时使用-c来指定根目录。 为 为 为 3、设定日志目录:boa日志有两部分,ErrorLog和AccessLog,可根据自己情况设置日志目录,也可以选择默认值: 下面是从网上找到的配置说明,其实就是boa.conf的中文翻译而已。 Port:boa服务器监听的端口,默认的端口是80。如果端口小于1024,则必须是 Listen:绑定的ip地址。不使用这个参数时,将绑定所有的地址。 User:连接到服务器的客户端的身份,可以是用户名或UID。 Group:连接到服务器的客户端的组,可以是组名或GID。 ServerAdmin:服务器出故障时要通知的邮箱地址。 ErrorLog:指定错误日志文件。如果路径没有以"/"开始,则相对于ServerRoot路径。没有配置时默认的文件是/dev/stderr。若不想记录日志,指定文件为/dev/null。 AccessLog:设置存取日志文件,与ErrorLog类似。 UseLocaltime:设置使用本地时间,使用UTC时注释这个参数。这个参数没有值。 VerboseCGILogs:在错误日志文件中记录CGI启动和停止时间,若不记录,注释这个参数。这个参数没有值。 ServerName:指定服务器的名称,当客户端使用gethostname + gethostbyname时返回给客户端。 VirtualHost:虚拟主机开关。使用此参数,则会在DocumentRoot设定的 目录添加一个ip地址作为新的DocumentRoot来 处理客户端的请求。如DocumentRoot设置为/var/www,则http://localhost/转换成/var/www/127.0.0.1/,若注释此参数,则为/var/www/。 DocumentRoot:HTML文件的根目录(也就是网站的目录)。 UserDir:指定用户目录。 DirectoryIndex:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker变量。这个变量也就是设置默认主页的文件名。 DirectoryMaker:指定用于生成目录的程序,注释此变量将不允许列目录。 DirectoryCache:当DirectoryIndex文件不存在,而DirecotryMaker又被注释掉时,将列出这个参数指定目录给客户端。 KeepAliveMax:每个连接允许的请求数量。如果将此值设为" 0 ",将不限制请求的数目。 KeepAliveTimeOut:在关闭持久连接前等待下一个请求的秒数。(秒)。 MimeTypes:设置包含mimetypes信息的文件,一般是/etc/mime.types。 DefaultType:默认的mimetype类型,一般是text/html。 CGIPath:相当于给CGI程序使用的$PATH变量。 SinglePostLimit:一次POST允许最大的字节数,默认是1MB。 AddType: 增加MimeType没有指定的类型,例: AddType type extension [extension ...]。要使用cgi,必须添加cgi类型:AddType application/x-httpd-cgi cgi Redirect:重定向文件。 Aliases:指定路径的别名。 ScriptAlias:指定脚本路径的虚拟路径。 4、根据boa.conf建立相应目录 并在其中存放html文件(包括默认主页index.html) 注意:这里/var/log/boa目录必须为可写,否则会出现错误:log.c:73 – Unable to dup2 the error log: Bad file r.) 5、关闭其它Web服务器 6、启动boa (使用普通用户无法启动boa,提示错误:[03/Aug/2011:09:04:45 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor) 若ps中没有看到boa进程,说明boa没有成功启动 查看/var/log/boa/error_log显示: [03/Aug/2011:00:46:33 +0000] boa.c:226 - icky Linux kernel bug!: Success 解决方法:将boa.c中的以下内容注释掉 重新make 7、将Windows与虚拟机的IP设在一个网段,在Windows浏览器中输入linux的IP地址,即可进入首页,即/var/www/index.html。 <二>移植到开发板 一>修改Makefile文件: 1、将:CC = gcc 改为: 注:根据安装的交叉编译工具进行更改 2、#make 二>拷贝虚拟机下/etc/mime.types文件到开发板/etc目录下 开发板上根据boa配置文件建立相关文件(夹)同X86中二>配置boa 4 将可执行文件boa复制到开发板,并运行~ 在Windows浏览器地址栏中输入开发板地址进行测试。 在板子上运行出现这个问题gethostbyname:: Resource temporarily unavailable。 解决方法:把src文件夹下的config.c里的if(!server_name){..........}(大概在266行到286行之间)注释掉,就能运行在板子上运行boa。 附录: 常见错误 这些错误内容可查看/var/log/boa/error_log文件 1>. 错误1: gethostbyname:: No such file or directory 解决办法: 修改boa.conf 2>. 错误1: util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o] 解决办法: 修改 src/compat.h 找到 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 修改成 #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff 3>. 错误2: boa.c:211 - getpwuid: No such file or directory 解决办法: 修改src/boa.c 注释掉下面这段程序: if (passwdbuf == NULL) { 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 4>. 错误3: boa.c:228 - icky Linux kernel bug!: No such file or directory 解决办法: 修改src/boa.c 注释掉下面语句: if (setuid(0) != -1) { DIE(”icky Linux kernel bug!”); } 即修改为: #if 0 if (setuid(0) != -1) { DIE(”icky Linux kernel bug!”); } #endif 5>. 错误4: log.c:73 unable to dup2 the error log:bad file descriptor 解决方法: 方法1> 确定日志目录对与所有用户都具有可读/写的权限 方法2> 修改src/log.c (建议采用方法1) 注释掉 if (dup2(error_log, STDERR_FILENO) == -1) { DIE("unable to dup2 the error log"); } 即修改为: #if 0 if (dup2(error_log, STDERR_FILENO) == -1) { DIE("unable to dup2 the error log"); } #endif 参考网址:http://www./Linux/2011-03/33485.htm http://hi.baidu.com/??x??/blog/item/63118b3d8b9f4fe63b87ce1f
boa测试实例在前面的文章里讲了如何安装、配置boa,这篇文章主要讲一下一些boa测试实例,主要涉及到html以及cgi程序的编写。 测试环境: html不用介绍了。cgi全称为Common Gate Interface,它不是一种具体的语言,它可以使用其它语言来实现,比如C、C++、Perl、shell,等等。我们使用C语言来编写cgi程序。 我们需要使用到两个文件,一个是用于页面显示的使用html语言编写的hello.html,该文件放到/var/www/html目录中。另一个是用于响应该页面的cgi程序hello.c,该程序使用C语言编写,编译方式为: $ gcc hello.c –o hello.cgi 编译后的可执行文件hello.cgi放到/var/www/cgi-bin目录中 完整的hello.html如下:
这个html文件分两部分,前半部分是一些常见的页面显示语句,这里包括了标题、图片显示、超链接。后半部分是我们真正的测试程序,主要设计了两个输入框,分别输入用户名和密码;两个按钮,分别是登陆和清除,这里的“登陆”并非实际中的登陆,它只是测试cgi程序的响应,结果是显示输入的信息。 它的action表明了由哪一个cgi程序来响应来自该页面的消息,而method为http响应的方法,常用的有两种,分别是“post”和“get”,这里非专业地介绍一下。post,顾名思义,就是“提交”,用于更新信息;而get,即“获取”,用于从服务器中获取、查询信息。在下文将会看到,这两者在地址栏中的区别,使用post方法时数据是不会在地址栏中显示的,而get方法则会显示。不过本文不介绍这两者的本质区别。 如果直接输入Linux的IP地址,则会显示Fedora Project的启动页面,而要访问我们的测试网页,还需要再添加一些目录才行。这里的实际地址应该是: 下面是响应的cgi程序hello.c完整代码: #include |