linux下的webserver BOA及CGIC库的使用指南转帖.docx
- 文档编号:29845827
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:35
- 大小:36.78KB
linux下的webserver BOA及CGIC库的使用指南转帖.docx
《linux下的webserver BOA及CGIC库的使用指南转帖.docx》由会员分享,可在线阅读,更多相关《linux下的webserver BOA及CGIC库的使用指南转帖.docx(35页珍藏版)》请在冰豆网上搜索。
linux下的webserverBOA及CGIC库的使用指南转帖
linux下的webserverBOA及CGIC库的使用指南(转帖)
我把网页挂载到nfs 下面的文件中(需要新建一个文件www ),不过这样很方便!
安装过程
==========================================================
1 )在www.boa.org 下载boa-0.94.13.tar.gz 并解压
#tar-zxvfboa-0.94.13.tar.gz
2 )在src 目录下运行./configure
3 )生成Makefile 文件,修改
CC=arm-linux-gcc
CPP=arm-linux-gcc–E
(1) 将boa.c 文件中以下几行判断去掉即可。
if ( setuid ( 0 ) !
= - 1 ) {
DIE ( "ickyLinuxkernelbug!
" );
}
(2)
修改文件compat.h P120
#defineTIMEZONE_OFFSET(foo)foo##->tm_gmtoff
修改成
#defineTIMEZONE_OFFSET(foo)(foo)->tm_gmtoff
(3)
把src 文件夹下的config.c 里的if(!
server_name){..........} (大概在266 行到286 行之间)注释掉
否则
Error :
./boa
gethostbyname:
:
Resourcetemporarilyunavailable
(4) 修改 src/log.c
注释掉
if(dup2(error_log,STDERR_FILENO)==-1){
DIE("unabletodup2theerrorlog");
}
否则会出现错误:
log.c:
73unabletodup2theerrorlog:
badfiledescriptor
改变板子的属性,为可写:
执行一个命令就可以变成可写的好象是chmod777
自动启动boa :
在/etc/profile 中启动boa 即可
4 )make
5 )执行arm-linux-stripboa
去掉调试信息,小很多,50 多k
可以编译出boa 可执行文件,下面是对文件系统的修改
(1 )建立/etc/boa/boa.conf 可以从boa 源码里拷贝boa.conf
(2 )修改boa.conf 文件,以下为转载
**********************************************************
# 监听的端口号,缺省都是80 ,一般无需修改
Port80
#bind 调用的IP 地址,一般注释掉,表明绑定到INADDR_ANY ,通配于服务器的所有IP 地址
#Listen192.68.0.5
User0
Group0
# 当服务器发生问题时发送报警的email 地址,目前未用,注释掉
#ServerAdmin root@localhost
# 错误日志文件。
如果没有以/ 开始,则表示从服务器的根路径开始。
如果不需要错误日志,则用#/dev/null 。
在下面设置时,注意一定要建立/var/log/boa 目录
ErrorLog/mnt/log/boa/error_log
# 访问日志文件。
如果没有以/ 开始,则表示从服务器的根路径开始。
如果不需要错误日志,则用#/dev/null 或直接注释掉。
在下面设置时,注意一定要建立/var/log/boa 目录
#AccessLog/var/log/boa/access_log
# 是否使用本地时间。
如果没有注释掉,则使用本地时间。
注释掉则使用UTC 时间
#UseLocaltime
# 是否记录CGI 运行信息,如果没有注释掉,则记录,注释掉则不记录
#VerboseCGILogs
# 服务器名字
ServerName
# 是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web 服
# 务器。
一般注释掉,即不需要启动
#VirtualHost
# 非常重要,HTML 文档的主目录。
如果没有以/ 开始,则表示从服务器的根路径开始。
DocumentRoot/var/www
# 如果收到一个用户请求的话,在用户主目录后再增加的目录名
UserDirpublic_html
#HTML 目录索引的文件名,也是没有用户只指明访问目录时返回的文件名
DirectoryIndexindex.html
# 当HTML 目录没有索引文件时,用户只指明访问目录时,boa 会调用该程序生成索引文件然后
# 返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML 目录加上#DirectoryIndex 指明的文件
#DirectoryMaker/usr/lib/boa/boa_indexer
# 如果DirectoryIndex 不存在,并且DirectoryMaker 被注释,那么就用Boa 自带的索引
# 生成程序来生成目录的索引文件并输出到下面目录,该目录必须是Boa 能读写
#DirectoryCache/var/spool/boa/dircache
# 一个连接所允许的HTTP 持续作用请求最大数目,注释或设为0 都将关闭HTTP 持续作用
KeepAliveMax1000
#HTTP 持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接
KeepAliveTimeout10
# 指明mime.types 文件位置。
如果没有以/ 开始,则表示从服务器的根路径开始。
可以注释掉
# 避免使用mime.types 文件,此时需要用AddType 在本文件里指明
MimeTypes/etc/mime.types
# 文件扩展名没有或未知的话,使用的缺省MIME 类型
DefaultTypetext/plain
# 提供CGI 程序的PATH 环境变量值
CGIPath/bin:
/usr/bin:
/usr/local/bin
# 将文件扩展名和MIME 类型关联起来,和mime.types 文件作用一样。
如果用mime.types
# 文件,则注释掉,如果不使用mime.types 文件,则必须使用
#AddTypeapplication/x-httpd-cgicgi
# 指明文档重定向路径
#Redirect/bar http:
//elsewhere/feh/bar
# 为路径加上别名
Alias/doc/usr/doc
# 非常重要,指明CGI 脚本的虚拟路径对应的实际路径。
一般所有的CGI 脚本都要放在实际路径
# 里,用户访问执行时输入站点+ 虚拟路径+CGI 脚本名
ScriptAlias/cgi-bin//mnt/www/cgi-bin/
用户可以根据自己需要,对boa.conf 进行修改,但必须要保证其他的辅助文件和设置必须和boa.conf 里的配置相符,不然Boa 就不能正常工作。
在上面的例子中,我们还需要创建日志文件所在目录/mnt/log/boa ,创建HTML 文档的主目录/mnt/www ,将mime.types 文件拷贝到/etc 目录,创建CGI 脚本所在目录/var/mnt/cgi-bin/ 。
mime.types 文件用来指明不同文件扩展名对应的MIME 类型,一般可以直接从Linux 主机上拷贝一个,大部分也都是在主机的/etc 目录下。
**********************************************************
我做的修改
DocumentRoot/mnt/www www 目录,需手动建立
ScriptAlias/cgi-bin//mnt/www/cgi-bin/ www/cgi-bin 目录,需手动建立
Group0
(3 )etc 目录里还要有passwdgroupmime.types 等文件
www 目录放index.html 文件
我把passwdgroupmime.types 放在/etc 下面,boa.conf 放在/etc/boa 文件夹下, 可执行文件boa 放在/bin 下面,文件系统新添加了mnt ,把www 和cgi-bin 放进去,编译文件系统CRAMFS ,烧录…
(注:
这样烧录的话,文件都是只读的,可以把1:
/bin/mkdir/tmp/fs
2:
/bin/mount-tyaffs/dev/mtdblock/3/tmp/fs;
这样就mount 上一个可读可写的文件,掉电还在;问题是:
我mount 出错,有badblock )
(4 )在板子上运行boa
(5 )pc 机用IE 访问 http:
//192.168.3.223/index.html
(2 )
编辑helloworld.c 程序测试cgi 的运行
#arm-linux-gcc-ohelloworld.cgihelloworld.c
#cphelloworld.cgi 到开发板的/var/www/cgi-bin 目录下
在pc 机的浏览器地址栏输入http:
//192.168.0.12/cgi-bin/helloworld.cgi ,可以看到相关页面,CGI 脚本测试通过。
10. 从CGIC 的主站点 下载源码,将其解压并进入源码目录
#tar-zxvfcgic205.tar.gz
#cdcgic205
11. 修改Makefile 文件
a. 找到CC=gcc ,将其改成CC=arm-linux-gcc ,
b. 找到AR=ar ,将其改成AR=arm-linux-ar ,
c. 找到RANLIB=ranlib ,将其改成RANLIB=arm-linux-ranlib 。
e. 找到gcccgictest.o-ocgictest.cgi${LIBS} ,
将其改成$(CC)$(CFLAGS)cgictest.o-ocgictest.cgi${LIBS} ,
f. 找到gcccapture.o-ocapture${LIBS} ,
将其改成$(CC)$(CFLAGS)capture.o-ocapture${LIBS} ,
保存退出。
12. 然后运行make 进行编译,得到的CGIC 库libcgic.a ,我们通过调试辅助程序capture 和测试程序cgictest.cgi ,来验证生成CGIC 库的正确性。
13. 将capture 和cgictest.cgi 拷贝到主机的/var/www/cgi-bin 目录下。
在工作站的浏览器地址栏输入http:
//192.168.0.12/cgi-bin/cgictest.cgi ,可以看到页面,CGIC 库和测试脚本都移植成功。
将.cgi 文件拷贝至目标板上后,必须改变其权限
chmod755*
否则,上位机浏览时会提示
502BadGateway
TheCGIwasnotCGI / 1 . 1compliant .
(2 )
不能上传的话,把GET 改成POST
把用户权限由 nobody 改成 root
用 C/C++ 写 CGI 程序
其实用 C/C++ 写 CGI 程序非常简单,主要是要清楚什么是 CGI 。
CGI 全称 CommonGatewayInterface (共同编程接口),是一种编程接口,不论什么语言,只要按照该接口的标准编写出来的程序,即可叫做 CGI 程序。
CGI 程序的输入 / 输出是使用编程语言的标准输入 / 标准输出,所以用 C/C++ 来写 CGI 程序就好象写普通程序一样,不过还有几样东西要注意的。
1 、 CGI 程序的通信方式
当 有数据从浏览器传到 Web 服务器后,该服务器会根据传送的类型(基本有二类:
GET/POST ),将这些接收到的数据传入 QUERY_STRING或 变量中, CGI 程序可以通过标准输入,在程序中接收这些数据。
当要向浏览器发送信息时,只要向 Web 服务器发送特定的文件头信息,即可通过标准输出将信息发往 Web 服务器, Web 服务器处理完这些由 CGI 程序发来的信息后就会将这些信息发送给浏览器。
这样就是 CGI 程序的通信方式了。
2 、接收数据
用 GET 方式接收到的数据保存在 Web 服务器的 QUERY_STRING 变量里,而通过 POST 方式接收到的数据是保存在 这个 Web 服务器变量里。
它们的唯一区别就是:
以 GET 方式接收的数据是有长度限制,而用 POST 方式接收的数据是没有长度限制的。
并且,以 GET 方式发送数据,可以通过 URL 的形式来发送,但 POST 方式发送的数据必须要通过 Form 才到发送。
好,现在让我们用 C 语言写一个神圣的 CGI 程序 --Hello,World!
vihello.c # 编辑源文件
// Begin
#include
main(){
printf("Content-type:
text/html\n\n");
printf("Hello,World!
");
}
// End
gcc-ohellohello.c # 编译
将该程序放在 Web 服务器的 cgi-bin 目录下,然后通过以下方式访问:
这将在浏览器里打印出 Hello,World!
这 就算得上是一个 CGI 程序了,是不是很简单?
^_^ 第一句 printf() 是打印头信息,让 Web 浏览器知道以下打印的数据是什么类型的数据,本例子中指定了 text/html 类型,即 html 文档,所以下面的那句 printf() 打印的内容就会像我们写网页内容一样在浏览器上显示出来。
用 C/C++ 写 CGI 的最难之处应算从浏览器接收数据!
不过,借助现成的源程序,从浏览器接收数据也只不过是小菜一碟而已。
我说的这个现成的源程序是用 FireBird 的 bbs2www 程序包里提取出来的。
在这里下载:
cgi.c-cgi.h
经 本人提取出来的源程序只有两个文件 cgi.c 和 cgi.h 。
当要用它们来写 CGI 程序时,只需在程序中加入 #include"cgi.c" 即可,现以例子说明一下使用方法。
假设要通过 GET 方式从浏览器接收用户的名字和 E-Mail 地址,源程序如下:
vitest.c# 编辑源文件
//Begin
#include
#include"cgi.c"
main(){
char*name,*email;
cgi_init();
cgi_html_head();
name=cgi_get("name");
email=cgi_get("email");
printf("name=%s",name);
printf("
");
printf("email=%s",email);
cgi_quit();
}
//End
首 先定义两个指针,然后调用 cgi_init() 来初始化 CGI 环境, cgi_html_head() 打印 HTML 文件类型信息,和 printf("Content-type:
text/html\n\n"); 基本一样,不过用 cgi_html_head() 打印的头信息会指定文件的字符编码为 gb2312 即中文字符。
调用 cgi_get() 方法取得指定关键字 (name 和 email) 的值。
当完成 CGI 部分的代码后,要通用调用 cgi_quit() 和释放 CGI 所点的系统资源。
最后就像以住一样去编译程序, gcc-O6-otesttest.c
gcc-Walltest.ccgic.c-otest.cgi 然后将该程序放到 cgi-bin 目录,接着通过以下方式调用该程序。
cgic:
为 C 语言编写 CGI 的 C 函数库
由 ThomasBoutell 开发
目录
CGIC 介绍
怎样写 CGIC 应用程序
怎样产生图片在 CGIC 中 ?
CGI 调试特征 :
利用捕获
cgic 函数参考
cgic 变量参考
cgic 结果编码参考
cgic 快速索引
一般的 UNIX 系统都支持 ANSIC, 增加相应的库函数 ( 和相应的 h 文件 ) 就可以实现 CGI 。
在此我向大家推荐一个用于 CGI 编程的 ANSIC 库 :
cgic 。
cgic 是用来生成基于 CGI 的 WWW 应用程序的 C 语言函数库 , 它有以下功能 :
* 对数据进行语法分析
* 接收以 GET 和 PSOT 两种方式发送的数据
* 把 FORM 中的不同域连接成连续的串
* 为检索 FORM 数据而提供字符串 , 整数 , 浮点以及单项和多项选择功能
* 为数字字段提供边界检测
* 把 CGI 环境变量加载到非空的 C 串中
* 为调试而捕捉 CGI 状态
* 提供相对安全的系统调用功能
用一般 ANSIC 或 C++ 编译器就可以编译 cgic 程序 , 不过与通常 C 程序不同的是 , 用 cgic 写的源码其主函数是 cgiMain(), 而不是通常的 main() 。
cgic 的函数库会自动把 cgiMain 连接到相应的 main() 上去。
--------------------------------------------------------------------------------
写 CGIC 程序
Note:
所有的 cgic 应用程序必须连接 cgic.c.
用 cgimain() 替代 main() 必须包含:
#include"cgic.h."
基本结构 cgictest.c:
intcgiMain(){
#ifDEBUG
/*LoadasavedCGIscenarioifwe'redebugging*/
cgiReadEnvironment("/path/to/capcgi.dat");
#endif
/*Important:
wemustindicatethetypeofdocument*/
cgiHeaderContentType("text/html");
/*Nowinvokeotherfunctionstohandleeachpartoftheform*/
fprintf(cgiOut,"
\n");fprintf(cgiOut,"
fprintf(cgiOut,"
cgictest
\n");Name();
Address();
Hungry();
Temperature();
Frogs();
Color();
Flavors();
NonExButtons();
RadioButtons();
fprintf(cgiOut,"\n");
/*Thisvaluewillbetheexitcodeoftheprogram;0
generallyindicatessuccessamongUnixandDOSprograms*/
return0;
}
capture
输出标头
cgiHeaderContentType() 在输出文挡之前简要说明 MIME 内型 , 如 "text/html" 。
cgiHeaderStatus() 代替输出错误代码 cgiHeaderLocation() 代替重新引导至其他页面。
在一个独立的应用程序中只能有一个 cgiHeader 函数。
重点 :
在 cgiHeader 函数组中, cgiHeaderContentType(), 在任何向浏览器输出之前被调用 . 否则将出错或浏览器不能识别。
cgiOut
接着 ,cgiMain() 调用不同的函数 . 当函数结束后 , 将返回 0
处理输入文本
voidName(){
charname[81];
cgiFormStringNoNewlines("name",name,81);
fprintf(cgiOut,"Name:
%s
\n",name);
}
这个函数的功能就是取的并显示由用户输入的 name.
处理输出
Important:
cgiOut 通常相当于 stdout
cgiFormString 确保断航
处理单一 Checkboxes 输入
这个 Hungry()function 确定用户是否选择 "hungry" 这个 checkbox:
voidHungry(){
if(cgiFormCheckboxSingle("hungry")==cgiFormSuccess){
fprintf(cgiOut,"I'mHungry!
\n");
}else{
fprintf(cgiOut,"I'mNotHungry!
\n");
}
}
这个函数依靠 cgiFormCheckboxSingle() 确定单一的 checkbox 被选择。
cgiFormCheckboxSingle() 接受 checkbox 名字的属性值,如果存在就返回 cgiFormSuccess ,否则返回 cgiFormNotFound 如果是多项 checkboxes ,就用 cgiFormCheckboxMultiple() 和 cgiFormStringMultiple() 函数 .
处理数字输入
Temperature() 返回浮点书的值确保在特定的返回内。
voidTemperature(){
doubletemperature;
cgi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux下的webserver BOA及CGIC库的使用指南转帖 linux webserver BOA CGIC 使用指南