[cgi]
web server收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作相应处理,然后输出标准的html语句返回给web
server,web server再返回给客户端,这就是普通cgi的工作原理。
从上面看,cgi所要实现的不过是动态网页而已,这种处理方式的特点就是每接到一个请求,web
server都要fork出一个单独的cgi程序的进程来处理,这种方式的好处是把web
server和具体的程序处理独立开来,结构清晰,可控性强,同时缺点就是如果在高访问需求的情况下,cgi的进程fork就会成为很大的服务器负担,想象一下数百个并发请求导致服务器fork出数百个进程就明白了。这也是为什么cgi一直背负性能低下,高资源消耗的恶名的原因。
[fast-cgi]
1. FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。
2. FastCGI 可在任何平台上使用,Netscape Enterprise 及 IIS 都有 FastCGI 的模块可供使用,阿帕契 (Apache,以及利用 Apache 衍生出做的服务器) 上也有 mod_fastcgi 可用。
3. FastCGI 支持 C/C++、Java、PHP、Python、Ruby、Perl,Tcl 等程序语言。
4. FastCGI 的应用程序亦兼容于 CGI。即 FastCGI 的应用程序也可以当成 CGI 来执行。
5. 现有的 CGI 程序要改写成 FastCGI 非常简单,最少可能只需要多加入三行程序代码。
6. FastCGI 的侦错方式与 CGI 大同小异,只要带入程序所需的环境变量及参数,即可在命令列模式执行或侦错。
7. FastCGI 应用程序的写作方式与 CGI 类似,除了几项原则要特别注意外,FastCGI 的写作方式跟 CGI 几乎一样,与学习 Web Server API 比较起来, FastCGI 简单多了。
8. FastCGI 支持分布式运算 (distributed computing),即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
[配置]
1.编译安装php,不能带–with-apxs2=,带上--enable-fastcgi
2.安装mod_fcgid
wgethttp://jaist.dl.sourceforge.net/sourceforge/mod-fcgid/mod_fcgid.2.2.tgz
tar zxvf mod_fcgid.2.2.tgz
cd mod_fcgid.2.2
make
make install
( /****** 或者可以选择安装mod_fastcgi
wgethttp://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
tar zxvf mod_fastcgi-2.4.6.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
vi Makefile,编辑top_dir = /usr/local/apache2
make
make install
*****/ )
vi /usr/local/apache2/conf/httpd.conf,加入:
### fastcgi ###
LoadModule fcgid_module modules/mod_fcgid.so
ScriptAlias /fcgi-bin/ "/usr/local/php/bin/"
AddHandler php-fastcgi .php
Action php-fastcgi /fcgi-bin/php-cgi
AddType application/x-httpd-php .php
<IfModule mod_fcgid.c>
# AddHandler fcgid-script. .php .py .pl .fcgi
AddHandler fcgid-script. .php .fcgi ### 暂时只配置支持.php
IdleTimeout 300
ProcessLifeTime 1800
MaxProcessCount 100
DefaultMinClassProcessCount 3
DefaultMaxClassProcessCount 8
IPCConnectTimeout 15
IPCCommTimeout 300
MaxRequestsPerProcess 100
# RewriteCond %{REQUEST_URI} ^/fcgi-bin/.* [NC]
# RewriteRule .*/php$ /nonexistent.file [L]
</IfModule>
# <Files ~ (/.php)>
# SetHandler fcgid-script
# FCGIWrapper /usr/local/php/bin/php .php
# Options +ExecCGI
# allow from all
#</Files>
### fastcgi ###
把:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
改成:
<Directory />
Options FollowSymLinks +ExecCGI
AllowOverride None
Order allow,deny
allow from all
</Directory>
( /****** 参数解释 ****
IdleTimeout 发呆时限
ProcessLifeTime 一个进程的最长生命周期,过期之后无条件kill
MaxProcessCount 最大进程个数
DefaultMinClassProcessCount 每个程序启动的最小进程个数
DefaultMaxClassProcessCount 每个程序启动的最大进程个数
IPCConnectTimeout 程序响应超时时间
IPCCommTimeout 与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的
MaxRequestsPerProcess 每个进程最多完成处理个数,达成后自杀
*****/ )
把具体VirtualHost对应的Directory做修改如下:
<Directory PATH>
Options FollowSymLinks
AllowOverride FileInfo Options All
Order allow,deny
Allow from all
</Directory>
改成:
<Directory PATH>
FCGIWrapper /var/www/php/bin/php .php
Options FollowSymLinks +ExecCGI
AllowOverride FileInfo Options All
Order allow,deny
Allow from all
</Directory>
/usr/local/php/bin/php -v 如果看不到类似于PHP 5.2.11 (cgi-fcgi) (built:的话,则可以:mv php php-cli
cp php-cgi php
重启Apache