我如何告诉Apache2,默认运行mod_php5,但在CGI模式下运行这个VH?

问题描述:

服务器我如何告诉Apache2,默认运行mod_php5,但在CGI模式下运行这个VH?

我有我使用主机我目前的项目开发服务器。这里有一些数据:

[email protected]:/usr/bin $ cat /etc/*-release 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=10.10 
DISTRIB_CODENAME=maverick 
DISTRIB_DESCRIPTION="Ubuntu 10.10" 
[email protected]:/usr/bin $ apache2 -v 
Server version: Apache/2.2.16 (Ubuntu) 
Server built: Nov 18 2010 21:17:43 
[email protected]:/usr/bin $ php --version 
PHP 5.3.3-1ubuntu9.1 with Suhosin-Patch (cli) (built: Oct 15 2010 14:00:18) 
Copyright (c) 1997-2009 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 
[email protected]:/usr/bin $ uname -r 
2.6.35-22-server 

的问题

我使用mod_php5运行PHP 5.3.3,它的工作太棒了。但是我需要在服务器上运行一个VH 5.2.11,所以我用phpfarm来编译PHP 5.2.11。我想配置Apache使用mod_php5除了这个VH之外的服务器上的所有内容。我将通过FastCGI为这一个VH运行PHP 5.2.11。

我的测试

作为一个测试,我使用的Apache的默认站点/var/www。我设置以下目录中的文件报告PHP版本对我说:

  • /var/www/phpinfo.php
  • /var/www/php-5.2.11/phpinfo.php

我的目标是让/var/www/phpinfo.php给我看5.3.3版本(mod_php5)并且让/var/www/php-5.2.11/phpinfo.php给我看看5.2.11(CGI)。这还没有工作。

我插入下面的代码/etc/apache2/httpd.conf

FastCgiServer /var/www/cgi-bin/php-cgi-5.2.11 
ScriptAlias /cgi-bin-php/ /var/www/cgi-bin/ 

我插入下面的代码到默认网站的VH定义:

<Directory /var/www/php-5.2.11/> 
    AddHandler php-cgi .php 
    Action php-cgi /cgi-bin-php/php-cgi-5.2.11 
</Directory> 

结果

随着mod_php5启用:

  • /var/www/phpinfo.php ---> 5.3.3(mod_php5
  • /var/www/php-5.2.11/phpinfo.php ---> 5.3.3(mod_php5

随着mod_php5禁用:

  • /var/www/phpinfo.php --->无处理程序; Firefox的尝试下载PHP文件
  • /var/www/php-5.2.11/phpinfo.php ---> 5.2.11(CGI)

文件所涉

http://files.mattalexander.me/apacheconfig.tgz

+0

它是否必须是mod_php,或者它足以运行X不同版本的PHP? – 2010-12-15 17:42:34

+0

如果可能的话,我希望它是'mod_php'。你是否会建议我只设置一个默认CGI处理程序并关闭'mod_php'好? – mattalxndr 2010-12-15 17:43:46

+0

或多或少。有'su_php'这是1)灵活,因为你可以安装gazillion处理程序和2)更安全。 – 2010-12-15 17:46:52

一个很好的选择是suPHP

如果设置正确,您可以拥有尽可能多的处理程序;即使对于虚拟主机中的不同目录。

为了增加安全性,suPHP的“偏执”模式将Unix用户和组分配给虚拟主机,脚本将以该用户身份运行。

我suPHP的配置看起来像这样:

... 

[handlers] 
;Handler for php-scripts 
x-httpd-php=php:/usr/bin/php4-cgi 
x-httpd-php5=php:/usr/bin/php5-cgi 

;Handler for CGI-scripts 
x-suphp-cgi=execute:!self 

... 

在一个简单的.htaccess文件,可以有脚本,以使用不同版本的PHP运行:

<FilesMatch \.php$> 
    SetHandler x-httpd-php 
</FilesMatch> 

<FilesMatch \.php5$> 
    SetHandler x-httpd-php5 
</FilesMatch> 

# etc... 

希望有所帮助。

问题是mod_php仍处理.php文件,即使CGI处理程序设置为虚拟主机。

为了解决这个问题,在虚拟主机的<Directory>需要有一个SetHandler指令:

Action php-cgi /cgi-bin-php/php-cgi-5.2.11 
    <FilesMatch \.php$> 
    SetHandler php-cgi 
    </FilesMatch> 
</Directory> 

我已经更新了tutorial