Apache httpd 2.4.16以FastCGI的方式连接PHP5.4.13

apache httpd 2.4.16以FastCGI的方式连接PHP5.4.13
此种方式下httpd只能以prefork的方式工作所以要编辑/etc/httpd/httpd.conf文件
#LoadModule mpm_event_module modules/mod_mpm_event.so(关闭)
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so(开启)

重启httpd服务 /usr/local/apache/bin/apachectl restart
/usr/local/apache/bin/apachectl -M
可以看到加载的MPM模块为mpm_prefork_module (shared)

第一步./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockts --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-scan-dir=/etc/php.d --with-bz2
第二步:make

第三步:make install
第四步:配置PHP-FPM
cp php.ini-production /etc/php.ini(php的配置文件)
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig --add /etc/init.d/php-fpm

为php-fpm提供配置文件
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

编辑php-fpm的配置文件
vim /usr/local/php/etc/php-fpm.conf修改参数如下:
pid = /usr/local/php/var/run/php-fpm.pid
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2

第五步:启动php-fpm
/etc/init.d/php-fpm start

netstat -antlp
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 29680/php-fpm

上面信息证实php-fpm启动了并正在监听tcp9000端口
现在访问www.a.com是可以访问的,因为只有静态的内容。如果有动态内容是访问不了的,日志报错信息如下:
[Wed Oct 07 00:48:09.808060 2015] [autoindex:error] [pid 29699] [client 192.168.88.3:56082] AH01276: Cannot serve directory /www/a.com/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
下面解决这个问题

第六步:配置httpd 2.4.16
1、启用httpd相关模块
在httpd2.4以后已经专门有一个模块针对fastcgi的实现,此模块为mod_proxy_fcgi.so,它其实是mod_proxy.so模块的扩充,因此,这两个模块都要加载。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

2、配置虚拟主机支持使用fcgi
在相应虚拟主机配置文件中添加以下两行
ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/Document-Root/$1

例如:

<VirtualHost *:80>
DocumentRoot "/www/a.com"
ServerName www.a.com
ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/www/a.com/$1
<Directory "/www/a.com">
Options none
AllowOverride none
Require all granted
</Directory>
ErrorLog "/www/a.com/logs/www.a.com-error_log"
CustomLog "/www/a.com/logs/www.a.com-access_log" combined
</VirtualHost>

ProxyPassMatch:支持正则表达式,反向代理到什么位置。
把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少要知道运行的目录和URI,所以这里直接在fcgi://127.0.0.1后指明了这两个参数,其它的参数的传递已经被mod-proxy-fcgi.so进行了封装,不需要手动指定。

注意:Apache httpd 2.4以前版本中,要么php作为apache的模块运行,要么添加一个第三方模块支持php-fpm实现。
现在在访问www.a.com,如果有动态内容就是正常的了。
phpfcgi

此条目发表在linux分类目录,贴了, , 标签。将固定链接加入收藏夹。