如何告诉Apache2默认运行mod_php5但在CGI模式下运行此虚拟主机?

4

服务器

我有一台开发用的服务器,用来托管我的当前项目。以下是一些统计信息:

root@myserver:/usr/bin $ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.10
DISTRIB_CODENAME=maverick
DISTRIB_DESCRIPTION="Ubuntu 10.10"
root@myserver:/usr/bin $ apache2 -v
Server version: Apache/2.2.16 (Ubuntu)
Server built:   Nov 18 2010 21:17:43
root@myserver:/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
root@myserver:/usr/bin $ uname -r
2.6.35-22-server
问题 我正在使用mod_php5运行PHP 5.3.3,效果很好。但是我需要为服务器上的一个虚拟主机(VH)运行PHP 5.2.11,因此我使用phpfarm编译了PHP 5.2.11。我想配置Apache在服务器上除了这个VH外,其他所有地方都使用mod_php5。我将在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


它必须是mod_php吗?还是只要能运行X个不同版本的PHP就足够了? - Linus Kleen
如果可能的话,我希望使用mod_php。你是不是要建议我设置一个默认的CGI处理程序并永久关闭mod_php - mattalxndr
多少而已。有一个名为 su_php 的东西,它 1) 非常灵活,因为您可以安装无数的处理程序,2) 更加安全。 - Linus Kleen
2个回答

2

一个很好的选择是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...

希望这有所帮助。

1
问题在于,即使为虚拟主机设置了CGI处理程序,mod_php仍然处理.php文件。
要解决这个问题,需要在虚拟主机的<Directory>中添加SetHandler指令:
  Action php-cgi /cgi-bin-php/php-cgi-5.2.11
  <FilesMatch \.php$>
    SetHandler php-cgi
  </FilesMatch>
</Directory>

我已经更新了教程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接