本来想写成配置笔记,但仔细想了下没太多可写的内容。虽然最终配置成功确实花了不少功夫,但大多数时间都是在试错,实际性解决的问题并没有多少,所以浓缩成一个备忘录吧。
概念
CGI在不同的语境下可以指CGI程序(提供动态网页内容的程序),CGI协议,或CGI工具(比如php的php-cgi或apache自带的cgi模块)。
环境
- 操作系统:在virtualbox中安装的ubuntu server 12.04,主机系统ubuntu 12.10
- web服务器:Apache2.2.22
- php版本:php5.3.10
安装
- 因为使用Apache作为web服务器,所以应该下载mod_fastcgi的源码,而不是其它的;
- 编译mod_fastcgi需要使用gcc等工具,若没有安装则configure会失败;
- 复制Makefile.AP2并命名为Makefile,修改其中的top_dir为apache2安装目录,这个目录之下有一个build目录;
- make失败,提示找不到special.mk,需安装apache2-dev包(其他环境下或许需要安装httpd-devel包);
- 安装结束后apache2的模块目录中可以看到mod_fastcgi.so文件;
配置文件
安装中最头疼的问题就是缺包和版本问题,好在有google和apt-get解决起来还算顺手,相比之下配置文件更让我捉急。
Apache2.2.22的配置文件的结构:
- /etc/apache2/目录下有一个apache2.conf和httpd.conf,分别为全局配置文件和用户配置文件;
- /mods-enable/和/mods-available/目录中分别是已启用和可用的(包括可用但还没有启用的)模块的load文件和conf文件;
- /sites-enable/和/sites-available/目录中分别是已启用的和可用的(包括可用但还没有启用的)站点的conf文件;
为了不打乱目录和配置文件的结构,我没有在httpd.conf中添加FastCGI的配置信息,而是在/mods-available/下建立了fcgi.load和fcgi.conf,内容如下。
fcgi.load
#根据环境和使用包的不同fastcgi_module或许要改为mod_fastcgi
LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
fcgi.conf
<IfModule mod_fastcgi.c>#<-是.c不是.so
#cgi“程序”的目录映射
ScriptAlias /cgi/ "/usr/lib/cgi/"
#指定cgi“工具”
FastCGIExternalServer /usr/lib/cgi/php-cgi -host 127.0.0.1:9000
#让fastcgi来处理php文件的请求
AddHandler php-fastcgi .php
#Action指令属于Apache2的Actions模块,若没有开启改模块会在重启服务器时报错
Action php-fastcgi /cgi/php-cgi
</IfModule>
重启web服务器,运行php-cgi让其监听9000端口(我把php-cgi -b 127.0.0.1加入了ubuntu server的/etc/rc.loasl脚本,使其开机自动运行),然后通过浏览器访问cgi程序进行测试。