我的目的是要研究 nginx->fastCGI-CGI,因为nginx不支持CGI,所以测试CGI的时候搭建了一个lighttpd。

CGI是一个标准,与语言无关,包含三个部分:标准输入、环境变量、标准输出。

CGI程序可以用C/C++语言等需要编译的语言写,也可以用python、perl、ruby等直接解释执行的语言写,这两种他们的执行方式是不同的:一个是程序直接可以被执行;一个是需要特定的语言解释器来执行。这样的话,web server配置时也会不同。

以lighttpd为例,

 

 

  1. ## to get the old cgi-bin behavior of apache 
  2.  
  3. ## 
  4.  
  5. ## Note: make sure that mod_alias is loaded if you uncomment the 
  6.  
  7. ##       next line. (see modules.conf) 
  8.  
  9. ## 
  10.  
  11. alias.url += ( "/cgi-bin" => server_root + "/cgi-bin" ) 
  12.  
  13. $HTTP["url"] =~ "^/cgi-bin" {                                                                                           
  14.  
  15.    cgi.assign = ( "" => "" ) 
  16.  

以上配置了所有cgi-bin目录下的程序,不需要语言解释器(cgi.assign = ( "" => "" )),直接被执行,所有cgi-bin被alias到目录server_root + "/cgi-bin"目录,server_root 是之前定义的一个变量。

这样所有编译好的可执行程序都可以放到 server_root + "/cgi-bin" 目录下。

python、perl、ruby等解释语言也可以放在该目录下被执行,但必须在第一行用#! /usr/bin/env python   的方式指定采用的解释器,而且文件需要有可执行权限。

 

 

  1. ## 
  2.  
  3. ## Plain old CGI handling 
  4.  
  5. ## 
  6.  
  7. ## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini. 
  8.  
  9. ## 
  10.  
  11. cgi.assign                 = ( ".pl"  => "/usr/bin/perl", 
  12.  
  13.                                ".cgi" => "/usr/bin/perl", 
  14.  
  15.                                ".rb"  => "/usr/bin/ruby", 
  16.  
  17.                                ".erb" => "/usr/bin/eruby", 
  18.  
  19.                                ".py"  => "/usr/bin/python" )  

以上配置所有.pl  .cgi  .rb  .erb  .py后缀的文件,需要调用相应的解释器来解释执行。

 

除去以上两种方式外,其他的程序(既不以特性的后缀结尾,也不放到指定目录下),会被当成文件被下载。