我的目的是要研究 nginx->fastCGI-CGI,因爲nginx不支持CGI,所以測試CGI的時候搭建了一個lighttpd。
CGI是一個標準,與語言無關,包含三個部分:標準輸入、環境變量、標準輸出。
CGI程序可以用C/C++語言等需要編譯的語言寫,也可以用python、perl、ruby等直接解釋執行的語言寫,這兩種他們的執行方式是不同的:一個是程序直接可以被執行;一個是需要特定的語言解釋器來執行。這樣的話,web server配置時也會不同。
以lighttpd爲例,
- ## to get the old cgi-bin behavior of apache
- ##
- ## Note: make sure that mod_alias is loaded if you uncomment the
- ## next line. (see modules.conf)
- ##
- alias.url += ( "/cgi-bin" => server_root + "/cgi-bin" )
- $HTTP["url"] =~ "^/cgi-bin" {
- cgi.assign = ( "" => "" )
- }
以上配置了所有cgi-bin目錄下的程序,不需要語言解釋器(cgi.assign = ( "" => "" )),直接被執行,所有cgi-bin被alias到目錄server_root + "/cgi-bin"目錄,server_root 是之前定義的一個變量。
這樣所有編譯好的可執行程序都可以放到 server_root + "/cgi-bin" 目錄下。
python、perl、ruby等解釋語言也可以放在該目錄下被執行,但必須在第一行用#! /usr/bin/env python 的方式指定採用的解釋器,而且文件需要有可執行權限。
- ##
- ## Plain old CGI handling
- ##
- ## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
- ##
- cgi.assign = ( ".pl" => "/usr/bin/perl",
- ".cgi" => "/usr/bin/perl",
- ".rb" => "/usr/bin/ruby",
- ".erb" => "/usr/bin/eruby",
- ".py" => "/usr/bin/python" )
以上配置所有.pl .cgi .rb .erb .py後綴的文件,需要調用相應的解釋器來解釋執行。
除去以上兩種方式外,其他的程序(既不以特性的後綴結尾,也不放到指定目錄下),會被當成文件被下載。