原文: http://blog.csdn.net/lenky0401/article/details/4201713
对于Lighttpd中CGI执行流程的多余文字不用过多说明,图片里已经基本说的很清楚了。
从图中,我们可以看到对于客户端的每一个请求(动态页面,也就是需要CGI处理的),Lighttpd进程都是先fork一个CGI进程,然后将请求头(通过环境参数)和请求体(通过管道)传递给CGI程序,等待CGI处理并将从CGI进程那接收到的处理结果再响应给客户端,然后将CGI终止(通过发送SIGTERM信号)。
CGI的处理有一些缺点,先不说其它的,单从图中可以看到的就有:首先,对于客户端的每一个请求都需要fork一个CGI进程,然后在该请求处理结束后又将该CGI进程kill掉,性能自然是不高的。其次,Web Server(这里指Lighttpd)和CGI之间通信采用无名管道(PIPE)进行通信,因此具有无名管道的所有缺点(比如:Web Server进程和CGI必须具有亲缘关系;管道是半双工的,数据只能向一个方向流动,因此为了使Web Server和CGI进行双方通信,必须建立起两个管道等等)。由这两个缺点就衍生出很多其它的缺点,比如基本无法进行分布式部署和在CGI侧进行负载均衡等。
所以Lighttpd里除了提供CGI外,还有另外两个选择SCGI和FASTCGI,将陆续会有Lighttpd里的SCGI,FASTCGI等模块的分析内容发出,感兴趣的网友可以关注,:)。
转载保留本博客地址连接[http://blog.csdn.net/lenky0401]。
CGI的相关信息可以查看地址:http://www.w3.org/CGI/
============================一个实践的栗子============================
一个lighttpd、CGI的例子
http://www.acmesystems.it/foxg20_cgi
其中,c语言的程序也可以换成脚本语言来写,如WIKIPedia上的例子:
#!/usr/bin/perl =head1 DESCRIPTION printenv — a CGI program that just prints its environment =cut print "Content-type: text/plain\n\n"; for my $var ( sort keys %ENV ) { printf "%s = \"%s\"\n", $var, $ENV{$var}; }
Save this "Hello world !" source code example in /var/www/cgi-bin (create this directory if it not exists).
#include "stdio.h" int main(void) { printf( "Content-Type: text/plain\n\n" ); printf("Hello world !\n"); return 0; }
Compile it typing:
debarm:~# gcc hello.c -o hello.cgi
Change the server.modules list inside /etc/lighttpd/lighttpd.conf in:
server.modules = ( "mod_access", "mod_cgi", "mod_alias", "mod_accesslog", "mod_compress", )
and add these lines:
$HTTP["url"] =~ "/cgi-bin/" { cgi.assign = ( "" => "" ) } cgi.assign = ( ".cgi" => "" )
Restart lighttpd typing:
debarm:~# /etc/init.d/lighttpd restart
Access with your browser to the FOX Board web page using this URL:
http:///cgi-bin/hello.cgi