Как я могу указать Apache2 запускать mod_php5 по умолчанию, но запускать этот VH в режиме CGI?

Сервер

У меня есть сервер разработки, который я использую для размещения своих текущих проектов. Вот некоторые статистические данные:

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

Проблема

Я использую PHP 5.3.3, используя mod_php5, и он отлично работает. Но мне нужно запустить PHP 5.2.11 только для одного VH на сервере, поэтому я использовал phpfarm для компиляции PHP 5.2.11. Я хочу настроить Apache для использования mod_php5 для всего на сервере, кроме этого VH. Я запущу PHP 5.2.11 для этого VH через FastCGI.

Мой тест

В качестве теста я использую сайт 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


person mattalxndr    schedule 15.12.2010    source источник
comment
Должен ли он быть mod_php или достаточно, если вы можете запускать X разных версий PHP?   -  person Linus Kleen    schedule 15.12.2010
comment
Я бы хотел, чтобы это было mod_php, если это вообще возможно. Вы собирались предложить мне просто установить обработчик CGI по умолчанию и отключить mod_php навсегда?   -  person mattalxndr    schedule 15.12.2010
comment
Более менее. Есть su_php, который 1) гибок, так как вы можете установить огромное количество обработчиков и 2) более безопасен.   -  person Linus Kleen    schedule 15.12.2010


Ответы (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...

Надеюсь, это поможет.

person Linus Kleen    schedule 15.12.2010

Проблема в том, что mod_php по-прежнему обрабатывает файлы .php, даже если обработчик CGI установлен для виртуального хоста.

Чтобы это исправить, <Directory> в виртуальном хосте должна иметь директиву SetHandler:

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

Я обновил руководство.

person cweiske    schedule 12.08.2011