Red Hat / CentOS Apache 2 FastCGI PHP 配置
FastCGI 是一种用于将交互式程序与 Web 服务器进行交互的协议。FastCGI 的主要目的是减少与 Web 服务器和 CGI 程序交互相关的开销,使服务器能够同时处理更多网页请求。
此外,由于性能原因,不建议将 PHP 与多线程 Apache2(工作 MPM)一起使用,并且某些第三方 PHP 扩展无法保证线程安全。
nginx和lighttpd内置了对 FastCGI 的支持。对于 Apache Web 服务器,您需要使用 mod_fastcgi 或 mod_fcgid。
为什么使用 mod_fastcgi 而不是 mod_perl / mod_php?
来自维基百科文章:
FastCGI 无需为每个请求创建一个新进程,而是可以使用单个持久进程在其生命周期内处理许多请求。通过使用具有内部多路复用的单个连接(即通过单个连接发送多个请求)和/或使用多个连接,可以同时处理多个请求。可以存在许多这样的进程,这可以提高稳定性和可扩展性。FastCGI 还允许程序在移交请求之前让 Web 服务器执行某些简单操作,例如读取文件。环境信息和页面请求通过 TCP 连接(对于远程进程)或 Unix 域套接字(对于本地进程)从 Web 服务器发送到进程。响应通过同一连接从进程返回到 Web 服务器。连接可能会在响应结束时关闭,但 Web 服务器和进程保持不变。
许多网站管理员和程序员发现,在 FastCGI(以及更简单的 SCGI)中将 Web 应用程序与 Web 服务器分离比嵌入式解释器(mod_perl、mod_php 等)具有许多理想的优势。这种分离允许服务器和应用程序进程独立重新启动 - 对于繁忙的网站来说,这是一个重要的考虑因素。它还促进了每个应用程序的安全策略 - 对于 ISP 和网络托管公司来说很重要。
在本快速教程中,您将了解 Red Hat Enterprise Linux / CentOS Linux 版本 5.x+ 下的 Apache 2 + mod_fastcgi + PHP 安装和配置。
安装 mod_fastcgi
确保安装了所需的软件包(编译 mod_fastcgi 所需的 httpd-devel 和 apr-devel),输入:
# yum install libtool httpd-devel apr-devel apr
接下来,获取最新的 mod_fastcgi 源代码,输入:
解压 tar ball,输入:
复制 Makefile.AP2,输入:为32 位系统
编译并安装 mod_fastcgi ,输入:为64 位系统
编译并安装 mod_fastcgi ,输入:
示例输出:
# cd /opt
# wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
# tar -zxvf mod_fastcgi-current.tar.gz
# cd mod_fastcgi-2.4.6/
# cp Makefile.AP2 Makefile
# make top_dir=/usr/lib/httpd
# make install top_dir=/usr/lib/httpd
# make top_dir=/usr/lib64/httpd
# make install top_dir=/usr/lib64/httpd
make install top_dir=/usr/lib64/httpd make[1]: Entering directory `/tmp/mod_fastcgi-2.4.6' /usr/lib64/apr-1/build/libtool --silent --mode=install cp mod_fastcgi.la /usr/lib64/httpd/modules/ make[1]: Leaving directory `/tmp/mod_fastcgi-2.4.6'
配置 mod_fastcgi
打开 /etc/httpd/conf.d/mod_fastcgi.conf 文件,
# vi /etc/httpd/conf.d/mod_fastcgi.conf
添加一个条目,如下所示:
LoadModule fastcgi_module modules/mod_fastcgi.so
保存并关闭文件。 重新启动 httpd,输入:
# service httpd restart
示例输出:
[Mon Dec 29 23:24:44 2008] [notice] caught SIGTERM, shutting down
[Mon Dec 29 23:24:44 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Dec 29 23:24:44 2008] [notice] Digest: generating secret for digest authentication ...
[Mon Dec 29 23:24:44 2008] [notice] Digest: done
[Mon Dec 29 23:24:44 2008] [notice] FastCGI: process manager initialized (pid 4785)
[Mon Dec 29 23:24:44 2008] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
如何在 RHEL / CentOS Linux 下将 PHP 配置为 FastCGI 进程?
首先需要禁用mod_php5,输入:
# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.disable
在 cgi-bin 目录中创建一个名为 php.fcgi 的 shell 脚本
在 /var/www/cgi-bin/php.fcgi 中创建如下脚本(或者放在你的虚拟域 cgi-bin 目录中)
#!/bin/bash # Shell Script To Run PHP5 using mod_fastcgi under Apache 2.x # Tested under Red Hat Enterprise Linux / CentOS 5.x ### Set PATH ### PHP_CGI=/usr/bin/php-cgi PHP_FCGI_CHILDREN=4 PHP_FCGI_MAX_REQUESTS=1000 ### no editing below ### export PHP_FCGI_CHILDREN export PHP_FCGI_MAX_REQUESTS exec $PHP_CGI
设置权限,输入:
# chmod +x /var/www/cgi-bin/php.fcgi
最后,修改documentroot目录权限如下。需要对mod_fastcgi使用AddHandler和Action指令:
<directory "/var/www/html">
Options -Indexes FollowSymLinks +ExecCGI
AllowOverride AuthConfig FileInfo
AddHandler php5-fastcgi .php
Action php5-fastcgi /cgi-bin/php.fcgi
DirectoryIndex index.php index.html
Order allow,deny
Allow from all
</directory>
在哪里,
- AddHandler php5-fastcgi .php:配置 Apache 将具有指定扩展名的 php 文件(在指令范围内)作为 FastCGI 应用程序处理。
- Action php5-fastcgi /cgi-bin/php.fcgi:此指令添加一个操作,当请求触发操作类型时,它将激活 cgi-script。cgi-script 是已使用 ScriptAlias 配置为 CGI 脚本的资源的 URL 路径。在我们的例子中,对文件扩展名为 .php 的文件的请求由指定的 cgi 脚本 /cgi-bin/php.fcgi 处理。
保存并关闭文件。重新启动 httpd:
# service httpd restart
mod_fastcgi 虚拟主机配置
- 域名:example.com
- DocumentRoot:/websites/home/example.com/http
- cgi-bin 目录:/websites/home/example.com/cgi-bin
- php.fcgi 路径:/websites/home/example.com/cgi-bin/php.fcgi
- 日志文件目录:/websites/home/example.com/logs
根据以上设置,example.com 域的虚拟主机配置应如下所示:
<virtualHost *:80> ServerAdmin webmaster@example.com DocumentRoot "/websites/home/example.com/http" ServerName example.com ServerAlias www.example.com ErrorLog "/websites/home/example.com/logs/error.log" CustomLog "/websites/home/example.com/logs/access.log" common ScriptAlias /cgi-bin/ "/websites/home/example.com/cgi-bin/" <directory "/websites/home/example.com/http"> Options -Indexes FollowSymLinks +ExecCGI AllowOverride AuthConfig FileInfo AddHandler php5-fastcgi .php Action php5-fastcgi /cgi-bin/php.fcgi Order allow,deny Allow from all </directory> <directory "/websites/home/example.com/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </directory> </virtualHost>
创建一个/websites/home/example.com/cgi-bin/php.fcgi,如下所示:
#!/bin/bash PHP_CGI=/usr/bin/php-cgi PHP_FCGI_CHILDREN=4 PHP_FCGI_MAX_REQUESTS=1000 export PHP_FCGI_CHILDREN export PHP_FCGI_MAX_REQUESTS exec $PHP_CGI
设置权限并重启httpd:
# chmod +x /websites/home/example.com/cgi-bin/php.fcgi
# service httpd restart