Установка нескольких независимых версий PHP на одном веб-сервере Apache на FreeBSD

(не доработано) Речь в заметке пойдёт о модуле PHP7, покдлюченном как модуль апача на всём сервере, и PHP5.6, подключенном как PHP-CGI у нужных сайтов.

И речь пойдёт не о быстрой смене версии php на всём сервере, а именно о том, чтобы, например, все сайты на сервере работали с PHP7, а один или несколько, например с PHP5.

Скачиваем исходники PHP нужной версии, распаковываем и переходим в папку с ними
$ cd /tmp

$ wget -O php-5.6.16.tar.bz2 http://php.net/get/php-5.6.16.tar.bz2/from/this/mirror

$ tar -xvf php-5.6.16.tar.bz2

$ cd php-5.6.16

Собираем нужную версию php

Компилируем php тремя коммандами:

1.
./configure \
—enable-pdo \
—with-pdo-mysql \
—with-mysql \
—with-mysqli \
—enable-mbstring \
—with-curl \
—with-gd \
—with-mcrypt \
—with-vpx-dir \
—with-jpeg-dir \
—with-png-dir \
—with-freetype-dir \
—with-xpm-dir \
—with-zlib-dir \
—with-openssl \
—with-pear

Во время конфигурирования скорее всего будут ошибки. Они по большей части свидетельствуют о отсутствующих пакетах на сервере. Названия недостающих легко гугляться.

2.
$ make

3.
$ make install

Копируем получившийся бинарник

Файл /usr/local/bin/php-cgi надо переименовать и положить по пути /usr/lib/cgi-bin/php5

Настраиваем нужный VirtualHost апача для работы с нашим бинарником

Ну и самое главное — это заставить нужный хост не работать как модуль апача. Скажу честно, на поиск решения я потратил не мало времени.

Эти строчки нужно добавить в нужный VirtualHost
<FilesMatch \.php$>
SetHandler application/x-httpd-php5
</FilesMatch>

AddHandler application/x-httpd-php5 .php

Action application/x-httpd-php5 /cgi-bin/php5

Нюансы и возможные проблемы

  1. Ошибка: Invalid command ‘Action’, perhaps misspelled or defined by a module not included in the server configuration

Не включен модуль апача actions. Включаем:
$ a2enmod actions
$ service apache2 restart

  1. Файл php.ini будет погдружаться из папки /usr/local/lib/. Изменить это можно опцией —with-config-file-path с выбором при компиляции.
  2. Также должен быть включен конфиг апача serve-cgi-bin
$ a2enconf serve-cgi-bin

$ service apache2 restar

Эта статья описывает метод установки произвольного количества версий PHP на один сервер. При этом все версии будут работать параллельно и обрабатываться одним скриптом.

Суть метода состоит в использовании CGI-обработчиков, которые привязываются по расширению к php-файлам. К примеру, файлы .php449 будут обрабатываться четвёртым PHP, а файлы .php600 шестой версией, и т.д.

Для реализации данного метода требуется уже настроенный веб-сервер Apache, а также доступ в Интернет. Способ установки веб-сервера описан в статье Установка web-сервера (FAMP).

Внимание! CGI-обработчики могут быть «дырой» в безопасности. Если сервер находится под «нагрузкой», то позаботьтесь о дополнительных мерах безопасности. Более подробная информация находится по адресу http://php.net/security.cgi-bin.

------------------ I. Подготовка системы  -----------------

Создём папку, где будут лежать архивы с дистрибутивами пхп
zg# mkdir /usr/local/php-dist

Сами архивы можно скачать по следующим адресам
 - текущие релизы        http://www.php.net/downloads.php
 - релиз-кандидаты       http://qa.php.net/
 - устаревшие релизы     http://www.php.net/releases/
 - сборки разработчиков  http://snaps.php.net/ 
 -

php-5.6.10.tar.bz2

Будте внимательны! Те ссылки, которые приведены здесь, могут не работать.
Это связано с тем, что актуальность некоторых сборок с течением времени
становится крайне мала. Только релизы, как правило, имеют постоянное место
размещения. Девелоперские сборки и релиз-кандидаты устаревают очень быстро.

------------------ II. Установка PHP 4.4.9  -----------------

Переходим в папку с дистрибутивами пхп
zg# cd /usr/local/php-dist/

Скачиваем исходный код нужной версии пхп
zg# fetch -o php-4.4.9.tar.bz2 http://ru2.php.net/get/php-4.4.9.tar.bz2/from/this/mirror

Распаковываем архив в текущую апаку
zg# tar xf php-4.4.9.tar.bz2

Переходим в папку с исходным кодом
zg# cd php-4.4.9

Конфигурируем пхп с нужными параметрами (опция --disable-cli обязательна!)
zg# ./configure --prefix=/usr/local/php/4.4.9 --disable-cli

Устанавливаем пхп
zg# make install clean

Устанавливаем конфиг php.ini
zg# cp php.ini-dist /usr/local/php/4.4.9/lib/php.ini

------------------ III. Установка PHP 5.3.1RC1 -----------------

Переходим в папку с дистрибутивами пхп
zg# cd /usr/local/php-dist/

Качаем нужную версию пхп
zg# fetch -o php-5.3.1RC1.tar.bz2  http://downloads.php.net/johannes/php-5.3.1RC1.tar.bz2

Распаковываем архив
zg# tar xf php-5.3.1RC1.tar.bz2

Переходим в папку с исходным кодом
zg# cd php-5.3.1RC1

Конфигурируем пхп
zg# ./configure --prefix=/usr/local/php/5.3.1RC1

Устанавливаем пхп
zg# make install clean

Устанавливаем конфиг
zg# cp php.ini-production /usr/local/php/5.3.1RC1/lib/php.ini

------------------ IV. Установка PHP 6 -----------------

Для шестого пхп требуется ICU. У меня его в системе не было, поэтому я его устанавливаю 
перед установкой пхп.
zg# pkg_add -r icu

Переходим в папку с дистрибутивами пхп
zg# cd /usr/local/php-dist/

Качаем девелоперскую сборку пхп 6
zg# fetch http://snaps.php.net/php6.0-200909050830.tar.bz2

Распаковываем архим
zg# tar xf php6.0-200909050830.tar.bz2

Переходим в папку с исходным кодом
zg# cd php6.0-200909050830/

Конфигурируем
zg# ./configure --prefix=/usr/local/php/6.0.0

Устанавливаем
zg# make install clean

Устанавливаем конфиг
zg# cp php.ini-production /usr/local/php/6.0.0/lib/php.ini

------------------ IV. Настройка папки cgi-bin -----------------

Определяем текущее положение папки cgi-bin
zg# grep "ScriptAlias /cgi-bin" /usr/local/etc/apache24/httpd.conf
    ScriptAlias /cgi-bin/ "/usr/local/www/apache24/cgi-bin/"

Переходим в папку cgi-bin
zg# cd /usr/local/www/apache24/cgi-bin/

Создаём символические ссылки на CGI-исполняемые файлы пхп
zg# ln -s /usr/local/php/4.4.9/bin/php php449
zg# ln -s /usr/local/php/5.3.1RC1/bin/php-cgi php531RC1
zg# ln -s /usr/local/php/6.0.0/bin/php-cgi php600
zg# ln -s /usr/local/bin/php-cgi phpLOCAL

Редактируем конфиг апача, чтобы разрешить символические ссылки в cgi-bin
zg# ee /usr/local/etc/apache24/httpd.conf

Находим секцию <Directory "/usr/local/www/apache24/cgi-bin">. 
И заменяем (или добавляем) Options None на Options FollowSymLinks.
У меня конфиг получился таким:

<Directory "/usr/local/www/apache24/cgi-bin">
    AllowOverride None
    Options FollowSymLinks
    Require all granted
</Directory> 

Сохраняем файл и выходим из редактора.
 
------------------ V. Настройка папки с несколькими версиями PHP ----------------- 

Создаём конфиг для папки, в которой будет работать несколько версий пхп 
zg# ee /usr/local/etc/apache24/Includes/multi-php.conf Alias /multi-php/ "/usr/local/www/multi-php/" 

<Directory "/usr/local/www/multi-php/"> 

# Привязываем разные расширения файлов к разным типам AddType x-httpd-php-449 .php449 
AddType x-httpd-php-531rc1 .php531rc1 
AddType x-httpd-php-600 .php600 
AddType x-httpd-php-local .phplocal 

# Для каждого типа создаём соответствующий CGI-обработчик 
Action x-httpd-php-449 /cgi-bin/php449 
Action x-httpd-php-531rc1 /cgi-bin/php531RC1 
Action x-httpd-php-600 /cgi-bin/php600 
Action x-httpd-php-local /cgi-bin/phpLOCAL 

 Require all granted

</Directory> 

Создаём папку 
zg# mkdir -p /usr/local/www/multi-php/ 

Переходим в папку zg# cd /usr/local/www/multi-php/

Качаем

небольшую формочку для более удобного запуска пхп кода
zg# fetch //anton-pribora.ru/files/multi-php-eval-form.tar.bz2

Распаковываем архив
zg# tar xf multi-php-eval-form.tar.bz2

Создаём ссылки разных типов на единый файл запуска
zg# ln -s run.php run.php449
zg# ln -s run.php run.php531rc1
zg# ln -s run.php run.php600
zg# ln -s run.php run.phplocal

Перезапускаем апач
zg# apachectl graceful

Теперь можно зайти на http://ваш_адрес/multi-php/ , там должна отобразиться формочка 
с возможностью выбора, в какой версии PHP выполнять код.

Дата публикации: 6 сентября 2009 года.

Дополнительно

Скриншоты рабочей формы

Скриншот рабочей формы

 

Скриншот рабочей формы

 

Скриншот рабочей формы

Источник: https://anton-pribora.ru/articles/os/freebsd/freebsd-apache-multi-php/

 

 


Автор: Электроник

Системный администратор широкого профиля. От ИТ до Маркетинга. Мастер на все руки.

Добавить комментарий

Ваш адрес email не будет опубликован.