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

在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
apache
nginx apache 共存、iis和apache共存、apache php多版本共存、apache与iis共存、centos php多版本共存,以便于您获取更多的相关知识。

时间: 2024-10-31 07:49:11

CentOS下与Apache连接的PHP多版本共存方案实现详解_php实例的相关文章

Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解_php实例

一.下载地址Apache 5.4 -- httpd-2.4.4-win32.zipPHP 5.4 -- php-5.4.15-Win32-VC9-x86.zip注意,VC9 线程安全版本中已经包含了 PHP 和 Apache connector DLL,因此无需下载此DLL.二.配置1. Apache使用任意编辑器打开 apache2.4/conf/httpd.conf 文件开始配置.1.1 设置 Apache 位置 复制代码 代码如下: ServerRoot "D:/Program Files

ubuntu下配置nginx+php+mysql详解_php实例

1.更新 www.jb51.net 复制代码 代码如下: sudo apt-get update 2.安装nginx 复制代码 代码如下: sudo apt-get intsall nginx Ubuntu安装之后的文件结构大致为: * 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下  www.jb51.net  *程序文件在/usr/sbin/nginx * 日志放在了/var/log/nginx中 *并已经在/et

Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解_php实例

选择在PhpStorm集成apache服务器,下面是我自己的亲测的步骤. 1.如何修改apache默认端口 xampp apache默认的http访问端口是80 修改完成后在xampp中重启apache. 2.配置流程 打开Settings / Preferences 找到 Build, Execution, Deployment 选项,点击 Deployment 添加如下: 因为我们修改了默认端口80,所以这里一定要指明端口号.目录是/Applications/XAMPP/xamppfiles

php判断是否连接上网络的方法实例详解_php实例

本文实例讲述了PHP判断是否连接上网络的方法.分享给大家供大家参考.具体实现方法如下: 首先写个函数 function varify_url($url){ $check = @fopen($url,"r"); if($check){ $status = true; }else{ $status = false; } return $status; }  接着在需要的地方直接调用即可 $url = "http://www.baidu.com"; if(varify_u

thinkPHP下ueditor的使用方法详解_php实例

本文实例讲述了thinkPHP下ueditor的使用方法.分享给大家供大家参考,具体如下: 1.首先需要下载ueditor,下载地址:http://ueditor.baidu.com/website/download.html 2.下载对应的php版的,下载后重命名为ueditor,根据需要放到对应的项目目录中.我放的位置为Public/admin文件夹下,admin为后台的访问入口文件目录. 3.在项目中的使用 首先需要引入核心的js文件: <script type="text/java

yii2带搜索功能的下拉框实例详解_php实例

简单的小功能,但是用起来还是蛮爽的.分享出来让更多的人有更快的开发效率,开开心心快乐编程. 如果你还没有使用过composer,你可就out了,看我的教程分享,composer简直就是必备神奇有木有.都说到这个点上了,我们赶紧使用composer进行安装吧. 先给大家展示下效果图: 下面给大家说下具体实现思路: composer require kartik-v/yii2-widget-select2 "@dev" #特别说明,因为这里安装的dev版本,也就是开发版本,不稳定版本,如果

CentOS下搭建PHP环境与WordPress博客程序的全流程总结_php实例

环境 服务器操作系统:CentOS 7.0 博客部署服务器:Apache 后台语言:PHP 数据库:MySql 前端框架:WordPress 步骤 一.安装Apache 安装 Apache 很简单,只需要在终端输入以下命令就可以了: sudo yum install httpd sudo 的意思是用 root 用户做什么操作,yum install 是在线安装:然后输入 yes 就确认下载安装了. 安装完毕之后我们需要启动服务: sudo service httpd start 当启动服务器完成

Centos下升级php5.2到php5.4全记录(编译安装)_php实例

升级 目前php最新版虽然是php5.5,但出于各种考虑,还是先升到php5.4比较靠谱. 原php使用的是php5.2.10,已经运行了4~5年了,是时候升级了. 5.4最新稳定版是5.4.21(14 Nov 2013发布了5.4.22...) 复制代码 代码如下: wget http://cn2.php.net/get/php-5.4.21.tar.gz/from/this/mirror tar zxf php-5.4.21.tar.gz cd php-5.4.21 修改源码,如果程序编码是

ECMall支持SSL连接邮件服务器的配置方法详解_php实例

首先,主要是ecmall使用的phpmailer版本太低,不支持加密连接. 然后,得对相应代码做一定调整. 1. 覆盖phpmailer 请从附件进行下载: 复制代码 代码如下: http://cywl.jb51.net:81/201405/yuanma/ecmall_phpmailer_lib(jb51.net).zip 2. 改造lib 涉及到两个lib:mail.lib.php .mail_quequ.lib.php 在这两个类的构造函数中,增加一个参数传递.如Mailer 复制代码 代码