THTTPD CGI 使用手册

THTTPD CGI 使用手册
1.THTTPD介绍
thttpd是一个非常小巧的轻量级web server,它非常非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Zeus等)的对比图+Benchmark,可以参考参考。此外,thttpd 也类似于lighttpd,对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现。因此效能很好。
Thttpd支持多种平台,如FreeBSD, SunOS, Solaris, BSD, Linux, OSF等。对于小型web server而言,速度快似乎是一个代名词,通过官方站提供的Benchmark,可以这样认为:thttpd至少和主流的web server一样快,在高负载下更快,因为其资源占用小的缘故。
Thttpd还有一个较为引人注目的特点:基于URL的文件流量限制,这对于下载的流量控制而言是非常方便的。象Apache就必须使用插件实现,效率较thttpd低。
2.CGI介绍
CGI is not a language. It's a simple protocol that can be used to communicate between Web forms and your program. A CGI script can be written in any language that can read STDIN, write to STDOUT, and read environment variables, i.e. virtually any programming language, including C, Perl, or even shell scripting.
Structure of a CGI Script
Here's the typical sequence of steps for a CGI script:
Read the user's form input.
Do what you want with the data.
Write the HTML response to STDOUT.
具体参考网络文章。CGI Made Really Easyhttp://www.jmarshall.com/easy/cgi/
公共网关界面(CGI)是一种编程标准,它规定了Web服务器调用其它可执行程序(CGI程序)的接口协议标准。CGI程序通过Web服务器与运行Web服务器调用其它可执行程序交互,它接受Web浏览器发送给Web服务器的信息,并进行处理,然后将结果再送给Web服务器及Web浏览器。CGI程序可以用任何程序设计语言编写,如Shell、perl、C、Java等,用C语言编写的CGI程序具有速度快、安全性高等特点。
CGI程序通常用于加入查询机制、搜索机制、交互式应用及其它一些应用。CGI接口标准包括输入、环境变量、标准输出三部分,CGI程序可以通过标准输入stdin)从Web服务器得到输入信息,例如从FORM中得到数据,这就是常用的POST方法。由于不同的操作系统采用了不同的信息交换机制,其参数传递的处理过程也有别,在Unix与DOS中,环境信息反映着本级程序运行时的某些系统状况,可用于父序与子程序间的信息传递,CGI正是通过设量环境变量在服务器与客户机间传递数据的,各操作系统都提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口也设置了一些环境变量用以传递一些重要的参数。CGI程序通过标准输出(stdout)将输出信息传送给Web服务器,传送给服务器的信息可以是HTML文本也可以是纯文本。本文将利用C语言编写一个CGI应用程序--学生成绩查询系统,并分析了CGI程序设计的方法、过程、技巧。

3.THTTPD 安装
1)下载安装包thttpd-2.25b.tar.gz
2)tar-xzvf thttpd-2.25b.tar.gz
3)cd thttpd-2.25b
4)./configure
5)make
6)make install 将thttpdcopy到/usr/local/sbin目录下
7)thttpd启动可以采用脚本方式 thttpd -D -C /home/www/ thttpd.config
8)脚本的编写参考网络文章UseTheThttpdWebserver
THTTPD 支持将配置信息写入thttpd可执行文件,此时需要在./configure 添加编译选项,THTTPD也支持将配置信息通过执行参数输入到执行环境。最好用配置文件。

4.困难
1)chroot
什么是chroot?chroot基本上重定义了一个程序的运行环境。更确切地说,它重定义了一个程序(或登录会话)的"ROOT"目录或"/"。也就是说,对于chroot了的程序或shell来说,chroot环境之外的目录是不存在的。
那这样又有什么用呢?如果入侵者入侵了你的电脑,他们就不能看见你系统里所有的文件了。这样,就限制了入侵者可能执行的命令,从而禁止了他们溢出不安全文件的机会。但唯一的缺点是,我认为这不能阻止他们察看网络连接和其他资料。因此,你应做一些本文未深入涉及的事情:
l保护网络端口。
l察看是否所有的服务都以非root权限运行。另外,是否所有的服务都进行了chroot?
l把系统日志转移到其他电脑。
l分析日志文件。
l分析那些试图探测你的计算机的随机端口的人们。
l限制服务所占用的cpu和内存资源。

Chroot功能保证系统安全性,但是对于CGI程序的执行环境进行限制,比如.c程序必须编译成-static。而perl 等解释语言的解释器同样必须放在chroot 目录.下面以sh脚本解释器为例说明此解决办法:
参考 Lightweight Web Serving with thttpd
# cd /home/www
# mkdir bin
# cp /bin/sh bin
# ldd bin/sh
bin/sh:
-ledit.2 => /lib/libedit.so.2
-ltermcap.0 => /lib/libtermcap.so.0
-lc.12 => /lib/libc.so.12
# mkdir lib
# cp /lib/libedit.so.2 lib
# cp /lib/libtermcap.so.0 lib
# cp /lib/libc.so.12 lib
# mkdir libexec
# cp /libexec/ld.elf_so libexec
# chown -R root:wheel bin lib libexec
Depending on the applications you need inside the chroot, things will get more complicated: you may need to create device files, a user database, pipes, and so on.

2)gcc -static 选项
-static
On systems that support dynamic linking, this prevents linking with the shared libraries.On othersystems, this option has no effect.
把一些函数都静态的编译到程序中,而无需动态链接了。
3)thttp.config
# dir=/usr/local/www/
#chroot
#cgipat=/cgi-bin/*
#logfile=/usr/local/www/logs/thttpd_log
#pidfile=/var/run/thttpd.pid

5.Thttpd代码分析
核心部分如何将web的get/post与 CGI程序 的stdin 关联,以及web的内容和stdout关联。

你可能感兴趣的:(shell,c/c++,数据库)