【问题标题】:How can I tell Apache2, run mod_php5 by default but run this VH in CGI mode?我如何告诉 Apache2,默认运行 mod_php5 但在 CGI 模式下运行此 VH?
【发布时间】:2011-05-26 01:58:26
【问题描述】:

服务器

我有一个开发服务器,用于托管我当前的项目。以下是一些统计数据:

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就足够了?
  • 如果可能的话,我希望它是mod_php。你会建议我设置一个默认的 CGI 处理程序并永久关闭 mod_php 吗?
  • 或多或少。 su_php 1) 灵活,因为您可以安装大量处理程序,2) 更安全。

标签: php linux apache cgi mod-php


【解决方案1】:

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

要解决这个问题,vhost 中的 &lt;Directory&gt; 需要有一个 SetHandler 指令:

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

我已经更新了tutorial

【讨论】:

    【解决方案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...
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2011-06-02
      • 2020-04-07
      • 2018-05-13
      • 2020-10-31
      • 2013-05-05
      • 2011-07-09
      相关资源
      最近更新 更多