设为首页 收藏本站
查看: 842|回复: 0

[经验分享] Apache2.2+fastCGI+(多版本)PHP配置

[复制链接]

尚未签到

发表于 2015-8-25 09:58:26 | 显示全部楼层 |阅读模式
DSC0000.png
  最近因为项目需要(项目主管希望能让项目在多版本PHP【5.1.0以上】中都能保证正常运行,实话说,要在一个Apache(我用的是Apache)中加载多个版本的Php 进行测试,还真的没有试过,也不知道到底怎么样,也担心把自己ubuntu环境给搞坏了(修复麻烦啊),所以就在虚拟机xp里做测试,所以,以下都是我在XP系统下的配置情况。
  思考:拿到这个任务我首先思考的问题是,我要怎么样将apache中装上多个版本的php而又让自己使用的时候方便,而不用每次使用都去更改配置之后重启apache;其次我想,我肯定不愿意通过多装几种服务器(比如Apache,IIS等)来完成我的任务,如果通过这种情况才能解决问题,我觉得是非常不能容忍的事,更何况我需要在测试完成之后将ubuntu也安装上多版本php;最后,众所周知php在apache中的加载方式可以是fastcgi和模块加载(loadmodule)两种方式,loadmodule这种方式是我一直在用的方式,我也不知道这种方式能否支持多版本的php,但是经过网上的搜索发现其也是可以为之,不过我选择的是fastcgi,来完成,一来想试试一直未用过的方式,二来想看看fastcgi和loadmodule两者到底在使用上给我带来什么不一样的感受。
  fastcgi的安装方式我goole了下,出来很多,但是仔细看完之后发现,这些可以总结为如下模式:



#下载fastcgi(http://www.fastcgi.com/dist)将mod_fastcig.xxx.dll放到apache安装目录下的#modules文件夹下
#加载mod_fastcgi模块
LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll  
#设置FastCGI运行路径和进程数量,前面路径为php安装路径
FastCgiServer "E:/PHP/PHP5/php-cgi.exe" -processes 3
#将php-cgi.exe所在的路径定义别名为fcgi-php5,
ScriptAlias /fcgi-php5/ "E:/PHP/PHP5/"
#将以php后缀的文件定义类型为application/x-httpd-php
AddType application/x-httpd-php .php
#使用php-cgi.exe来执行php文件
Action application/x-httpd-php "/fcgi-php5/php-cgi.exe"

  经过我的测试(apache版本为2.2.14和2.2.18)按照以上方法配置,完全不行,查看启动日志发现fastcgi没有起来:FastCGI: server "E:/PHP/PHP5/php-cgi.exe" (pid 1600) terminated with exit with status '0' ,后来继续google发现,和apache版本有关(http://blog.iyunv.com/networkwx/article/details/5970604 该文也有说到这点)。
  既然fastcgi不行,难道就没有别的办法了么,果然在下载apache2.2.14的时候(http://www.apache.org/dist/httpd/  习惯性先去官网查找apache版本),发现mod_fcgid/ 这个东西,于是搜索之,才知道,原来可以用这个来配置fastcgi,并且发现此文(http://www.javatang.com/archives/2010/01/07/3629356.html),详细描述了众多fastcgi版本的区别。一下是我用mod_fcgid安装的全过程:
  1、下载mod_fcgid,  http://httpd.apache.org/download.cgi   我这里下载的是2.3.6
  2、解压之,得到mod_fcgid.so,将它移至apache安装目录下的modules下,我这里是(C:\Program Files\Apache Software Foundation\Apache2.2\modules)
  3、打开httpd.conf  添加如下:
  



#load
LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .fcgi .php
# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess
# to prevent php-cgi process from exiting before all requests completed
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
# Maximum requests a process should handle before it is terminated
FcgidMaxRequestsPerProcess 1000
# Maximum number of PHP processes
FcgidMaxProcesses 15
# Number of seconds of idle time before a php-cgi process is terminated
FcgidIOTimeout  120
FcgidIdleTimeout  120
# Define the MIME-Type for ".php" files
AddType application/x-httpd-php .php

# Where to look for the php.ini file?
FcgidInitialEnv PHPRC "C:/php/php-5.3.8"
#Path to php-cgi
FcgidWrapper "D:/Server/php5/php-cgi.exe" .php

  4、配置好fcgid模块之后,还需要做一个处理:   找到配置运行目录属性的地方,在option中添加一个属性ExecCGI
  5、重启apache,运行localhost,就能看到刚刚配置的信息(我在php运行目录下设置了一个index.php中输出phpinfo【需要apache认的index.php这样的默认执行文件,需要同样配置DirectoryIndex】):

  第二点:配置多版本支持
  为了解决使用方便的问题,我打算采用虚拟机的配置来分别配置,每个虚拟机一个php版本,这样我使用的时候只要访问需要的php版本的虚拟机即可,而不需要设置配置文件。同时也为了减少代码拷贝上的问题,我将所有的虚拟机都配置在同一个目录下,每个虚拟机都配置一个监听端口,这样也解决了代码在不同目录的共享问题。
  1和2如上面一致,就不说了。不一样从第三步开始
  3、在httpd.conf中,我加载fastcgi并且配置项只有如下:



#load
LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .fcgi .php
# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess
# to prevent php-cgi process from exiting before all requests completed
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
# Maximum requests a process should handle before it is terminated
FcgidMaxRequestsPerProcess 1000
# Maximum number of PHP processes
FcgidMaxProcesses 15
# Number of seconds of idle time before a php-cgi process is terminated
FcgidIOTimeout  120
FcgidIdleTimeout  120
# Define the MIME-Type for ".php" files
AddType application/x-httpd-php .php


  同时查找该文件中的:
  # Virtual hosts
    #Include conf/extra/httpd-vhosts.conf
  将Include ....一行前面的#号去掉,同时,打开conf/extra/httpd-vhosts.conf文件进行虚拟主机配置(当然如果不使用该文件,也可以将虚拟主机的配置直接放置在httpd.conf文件的末尾)
  4、虚拟主机的配置:
  打开的文件中有一份默认的配置,我们更改如下:


Listen localhost:80
NameVirtualHost *:80
<VirtualHost *:80>
    #load php.ini
    FcgidInitialEnv PHPRC "C:/php/php-5.3.8/"
    FcgidWrapper "C:/php/php-5.3.8/php-cgi.exe" .php
    ServerAdmin webmaster@dummy-host.hz.ali.com
    DocumentRoot "C:/www"
    ServerName localhost
    ServerAlias www.dummy-host.hz.ali.com
    ErrorLog "logs/localhost"
    CustomLog "logs/localhost.log" common
</VirtualHost>  对了,就是将FcgidInitialEnv  和FcgidWrapper两个的配置转移到虚拟机中,这样每个虚拟机都有自己的配置,我这里默认是执行5.3.8版本,所以给他的端口号是80,如下,我还配置了5.2.17和5.2.4两个版本分别给的端口号是217和24:



Listen localhost:217
NameVirtualHost *:217
<VirtualHost *:217>
#load php.ini
FcgidInitialEnv PHPRC "C:/php/php-5.2.17"
FcgidWrapper "C:/php/php-5.2.17/php-cgi.exe" .php
ServerAdmin webmaster@dummy-host.hz.ali.com
DocumentRoot "C:/www"
ServerName localhost
ServerAlias www.dummy-host.hz.ali.com
ErrorLog "logs/217"
CustomLog "logs/217.log" common
</VirtualHost>
Listen localhost:24
NameVirtualHost *:24
<VirtualHost *:24>
#load php.ini
FcgidInitialEnv PHPRC "C:/php/php-5.2.4"
FcgidWrapper "C:/php/php-5.2.4/php-cgi.exe" .php
ServerAdmin webmaster@dummy-host.hz.ali.com
DocumentRoot "C:/www"
ServerName localhost
ServerAlias www.dummy-host.hz.ali.com
ErrorLog "logs/24"
CustomLog "logs/24.log" common
</VirtualHost>

  由配置可以看见,我给每一个虚拟主机都配置了不同的php版本,及各自的log文件,同时我将所有的虚拟主机目录都设置在了c:\www下,访问如下:
DSC0001.png
  图1:默认的80端口访问的是我的5.3.8版本
DSC0002.png
  图2:端口217访问的是我的5.2.17版本
DSC0003.png
  图3:端口24访问的是我的5.2.4版本。
  
  这样就可以了,我测试的时候只需要将我的待测试代码放到c:\www目录下,就可以通过端口的不同分别测试各个版本下的差异了。
  
  总结:
  fastcgi的方式配置起来了,但是不知道真实情况是否如此,总感觉用这种方式运行的php程序比loadModule方式慢了些。呵呵,关于fastcgi的相关文档http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html官网给了,英文的~,特此纪念
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103901-1-1.html 上篇帖子: php文件操作【转】 下篇帖子: 文件上传组件(Flash,JQuery,asp,php,js,AJAX)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表