Ставим древнюю версию php 5.2 на Ubuntu 14.04 (nginx/apache+php_fastcgi)

zombie-iconВ этом посте я расскажу, как на современный веб-сервер можно поставить такую древнюю версию php, как 5.2.17 Зачем это может понадобиться – даже не спрашивайте 🙂 В качестве примера можно представить ситуацию, когда необходимо развернуть какой-нибудь стародавний скрипт и отдебажить его или посмотреть вживую. В общем всех некрофилов – велкам под кат.

old_computer

Тестовый стенд

Операционка – Ubuntu 14.04 LTS За основу возьмем мой конфиг из статьи Настройка nginx для хостинга. Там как раз реализована схема “nginx+php_fpm”. Итак на машине уже стоит nginx, mysql, php_fpm.

Часть 1: Nginx+Apache+php_fpm+php_fcgi

Сначала мы попробуем организовать следующую схему работы.
Nginx (port 80) работает в качестве reverse-proxy и принимает все запросы. Если запрос идёт с определенным hostname (vhost nginx -> server_name) – он отправляет его на Apache (к которому подключен старый ламповый php5.2), если на все остальные сайты (другой vhost nginx) – то запрос идёт на новый php_fpm.

Установка второго php в систему (php 5.2.17)

Наша задача в этой части – скачать, установить и настроить древний php 5.2.17 так, чтобы он мирно сосуществовал с текущим и не мешал ему. Поехали.
Первым делом доставим необходимые для сборки пакеты:

Теперь нам надо сделать символические ссылки на библиотечки, т.к. скрипт конфигурации php будет искать их именно в этих местах.
Я делел симлинки на простые so-шники (без версий).

Для 64-bit систем

Для 32-bit систем  Мне вас очень жаль (:

Теперь качаем исходники нужной нам версии php из Музея PHP.

Определимся с путями. Наш новый старый php будет лежать вот тут: /opt/php5.2 так что запускаем скрипт конфигурации:

Если он будет материться – доставляйте необходимые библиотеки. Если всё ок – идем дальше. Перед тем, как приступить к компиляции нам надо наложить патч (иначе не скомпилится). Патчим и собираем.

Чтобы не замусоривать систему соберем deb-пакет из исходников с помощью checkinstall.

Параметры для пакета я выставил вот такие:

Теперь запускаем процесс установки.

Отлично, теперь сразу видно что куда поставилось.

Проверяем версию консольного php

Выставляем права на директорию:

Дальше, если вам не нужен Apache и вы хотете подключить эту версию php напрямую к nginx – переходите ко второй части статьи.

Устаналививаем Apache

Веб-сервер ставим из пакетов нашего дистрибьютива.

Т.к. 80 порт занят nginx-ом – вываливаются сообщения об ошибках:

Надо перенести Apache на порт 8080.
В /etc/apache2/ports.conf изменяем номер порта в Listen 80 на 8080 и пробуем запустить веб-сервер.

Доставляем модуль fcgi.

Создаем файлик-обертку для php /var/www/cgi-bin/php52.fcgi вот такого вида:

Далее в файле /etc/apache2/sites-enabled/000-default.conf (описание vhost-а по-умолчанию) пишем вверху новый порт:

Кладем phpinfo.php в /var/www/html, потом заходим по ip на сайт и смотрим результат:
http://192.168.0.xx:8080/phpinfo.php

Настойка Vhost в Apache

Тепеь создаём файлик /etc/apache2/sites-avaliable/sitename.conf со следующим содержанием:

Делаем симлинк из sites-avaliable на него.
Теперь у нас работает Apache+php5.2. Дальше будем подключать к этой конструкции nginx.

Настройка Vhost в nginx

Создаем файлик sitename в /etc/nginx/sites-avaliable вот такого вида

Значит при попадании запроса с этим site.org nginx будет проксировать его на apache. Делаем симлинк в sites-enable, перезагружам nginx и смотрим, ушел ли запрос на apache.

Часть 2: Nginx + php_fpm + php_fcgi

После того, как всё завелось я задался резонным вопросом – а зачем собственно нужен Apache. Может выкинуть его нафиг? Приступим!
Ставим пакет для службы.

Nginx будет смотреть заголовок host (server_name) и проксировать запрос либо на php5.2 в режиме fcgi – port 9020, либо на новый php_fpm (основной) – port 9010.
Для этого сделаем вторую обертку для nginx.

Создаём каталог для pid-файла:

Делаем саму обертку.
/var/www/cgi-bin/php52tcp.fcgi

Теперь делаем файл службы.

/etc/init.d/php52-fastcgi

Скачать можно тут. А то на страничке пробелы похерятся.

Ставим бит исполнения и проверяем нашу новую службу.

Должны работать сразу и php-fpm и древний php52 через fcgi.

Смотрим процессы – новая служба должна убиться. Этим мы проверим корректность работы с pid-файлом.
Отлично, теперь можно добавить её в систему.

Теперь осталось добавить vhost для nginx с новой службой.

 

Донастройка Joomla

Т.к. mysql у меня вообще говоря в utf-8, а старый движок в cp1251 нужно принудительно в нем (joomla) настроить кодировку соединения с БД. Для этого в Index.php после события onStart добавляем выполнение запроса SET NAMES.

index.php

 

Потом повторяем процедуру для файла /administrator/index2.php

Перезагружаем страницу, смотрим – вопросики исчезли.

Ссылки

http://iantonov.me/page/ustanovka-php-52-v-debian-78-sobiraem-staryj-php-iz-ishodnikov https://habrahabr.ru/sandbox/56953/ https://www.litespeedtech.com/support/forum/threads/solved-compile-php-5-2.6887/ PHP Музей (старые версии) Зеркало патча из статьи: https://tokarchuk.ru/wp-content/uploads/2016/03/php-5.2.17-patch.txt
https://habrahabr.ru/sandbox/56953/
https://www.linode.com/docs/websites/nginx/install-nginx-and-php-via-fastcgi-on-ubuntu-12-04-precise-pangolin/

http://www.x83.net/nginx-php-5-2-17-php-fpm/

http://blog.soros.org.ua/2014/10/recompile-php-5-3-x-client-libs-mariadb/

https://github.com/phpbrew/phpbrew/issues/492