CentOS下与Apache连接的PHP多版本共存方案实现详解


Posted in PHP onDecember 19, 2015

在apache下整合fastCGI模式运行的php-fpm,似乎网上很少相关材料,就连英文版材料也少。只要是php-fpm,基本上都是与nginx搭配。查了一大批相关资料,写本文总结一下。

apache下有多个fastCGI的支持方案:至少有mod_fcgi、mod_fastcgi(git)、mod_proxy_fcgi等。这两个模块都有点老,尤其mod_fastcgi自从2007年以来就没有更新,略掉不谈,事实上没用过用。mod_proxy_fcgi模块是httpd 2.4+的版本正式引入,通过简洁的一行 ProxyPassMatch 指令即可。

mod_fcgi

mod_fcgi模块本身是做fastCGI进程管理的,使用它就不需要使用php-fpm管理进程了。核心配置参数

LoadModule fcgid_module modules/mod_fcgid.so
<VirtualHost *:80>
  DocumentRoot "/var/www/html/site_1"
  ServerName "www.yourhost.com"
  DirectoryIndex index.html index.php
  #php.ini的存放目录,Linux下通常不需要
  #FcgidInitialEnv PHPRC "D:/php"
  # 设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出
  FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
  #php-cgi每个进程的最大请求数
  FcgidMaxRequestsPerProcess 1000
  #php-cgi最大的进程数
  FcgidMaxProcesses 3
  #最大执行时间
  FcgidIOTimeout 600
  FcgidIdleTimeout 600
  #php-cgi的路径
  FcgidWrapper /usr/local/php7/bin/php-cgi .php
  AddHandler fcgid-script .php
  FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
  <Directory "/var/www/html/site_1">
    Options +ExecCGI
  </Directory>
</VirtualHost>

几个Fcgid*指令,是优化之用,这里仅示例,要按实际情况调整数值。具体参看mod_fcgi官方文档

使用mod_fcgid的几个特点
php-fgi进程是由apache模块启动并管理,不需要配置php-fpm
在php-cig进程以apache用户身份运行,php程序写的文件,其权限为apache用户(而不像php-fpm下写文件为php-fpm用户所有,默认是nobody),这样在目录权限管理方面一致性高些。
mod_fastcgi

虽然CentOS 6.x下是apache 2.2,但所幸已经有人成功移植: https://github.com/ceph/mod-proxy-fcgi 我们可以直接使用;更幸运的是它已经进入epel源,直接yum安装即可;不想匹配epel源的,直接下载rpm包安装也可以(示例 http://mirrors.ustc.edu.cn/epel/6/x86_64/)

当然可以重新编译安装apache 2.4, 这样直接有mod_proxy_fcgi可以使用,但这里还是保持原版本不变,省掉编译的工作量。

参考mod_proxy_fcgi官方文档,整合php-fpm的配置指令

ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/"
语法很简单,跟配置反向代理类似,可以按实际需要做修改。事实上与mod_proxy模块语法一致的,不同处是将http协议改成fcig协议。

以上是apache整合php-fpm模式运行的fastCGI,接下来要对yum安装的php做下配置修改。

yum安装的php配置文件 /etc/httpd/conf.d/php.conf ,其中有如下一行

AddHandler php5-script .php

我们要对不同的站点启用不同的php,上面一行是对全局的.php文件分配给php模块处理,我们把这一行注释掉。而是在每个站点启用不同的php运行模式。

以上即是处理方式。

[已知问题]:裸目录地址转发
有一个困扰的问题没有解决,感觉有点像模块bug:

对于配置了DirectoryIndex index.php的目录,如果其子目录没有index.php,上述ProxyPassMatch还是会做fastCGI转发,这时会看到php-fpm的404响应,而不是apache的响应403页面。但前面的规则并不转发这裸空目录的url,所以感觉像bug

再者就是,对于ProxyPassMatch匹配的目录,apache自动索引功能失效。(当然如果不开启autoindex就无所谓了。生产环境下通常不开启的)

其它,似乎也没有什么严重后果,或者我没还意识到(?)。

解决方法:每个目录下,都放置一个index.html,避免fpm-php处理空请求

PHP 相关文章推荐
php 特殊字符处理函数
Sep 05 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
PHP 代码规范小结
Mar 08 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
php 启动报错如何解决
Jan 17 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
Feb 25 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 #PHP
php实现面包屑导航例子分享
Dec 19 #PHP
php实现倒计时效果
Dec 19 #PHP
Thinkphp实现自动验证和自动完成
Dec 19 #PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 #PHP
基于ThinkPHP实现批量删除
Dec 18 #PHP
thinkphp实现163、QQ邮箱收发邮件的方法
Dec 18 #PHP
You might like
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
php 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
PHP使用数组实现队列
2012/02/05 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python函数式编程指南(四):生成器详解
2015/06/24 Python
详解Django中的过滤器
2015/07/16 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
办公自动化专业大学生职业规划书
2014/03/06 职场文书
品德评语大全
2014/05/05 职场文书