Ставим древнюю версию 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

 

18 Comments

  1. ошбочка, пропущен пробел
    “ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so.62.0.0/usr/lib/libjpeg.so”
    “ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so.62.0.0 /usr/lib/libjpeg.so”

  2. еще одна
    “patch -p0 -b < txtbgxGXAvz4N.txt”
    “patch -p0 -b < txtbgxGXAvz4N.txt"
    тут может парсер вмешался 🙂

    1. Да, нажимаете на иконку справа от кода – открывается чистый валидный.

      1. Сейчас всё исправлено, что в комментах. Если насли что-то еще – пишите, тут парсер может код портить.

  3. еще опечатка.
    вместо
    “Создаем файлик-обертку для php /var/www/cgi-bin/php52.cgi вот такого вида:”
    надо
    “Создаем файлик-обертку для php /var/www/cgi-bin/php52.fcgi вот такого вида:”

    1. Спасибо, действительно были опечатки!!

      1. Шел 2018 год. А ошибки в статье до сих пор присутствуют не смотря на то, что в комментариях они описаны и автором прочитаны =)

        1. В /etc/apache2/sites-enabled/000-default.conf
          ты забыл про
          AddType application/x-httpd-php .php

          без ниго ничерта не работает! а я столько времени убил.
          + надо врубить модуль апача который за связку с пхп отвечает, забыл уже как называется, типа pache2-php-fcgi

    1. Когда тебе достался адово древний проект, который ни под чем другим ну просто не запускается, а ты палатся это сделать раз 10, твои глаза кровоточат то впомнишь этот пост))

      1. Всем доброго дня. Или как у меня сайты зашифрованы исходников нет. Базы данных по 4 гига… + сдохло железо и нет ни одного дампа… спасибо за статью. Буду пытаться установить

  4. ААА!!! СЛООЖНА!! 😀
    По-моему уже проще завести Docker… Ну или VirtualBox на крайняк…

  5. eswww@expertnegotiator:/etc/apache2/sites-available$ sudo service apache2 restart
    * Restarting web server apache2 [fail]
    * The apache2 configtest failed.
    Output of config test was:
    AH00526: Syntax error on line 4 of /etc/apache2/sites-enabled/000-default.conf:
    Invalid command ‘Action’, perhaps misspelled or defined by a module not included in the server configuration
    Action ‘configtest’ failed.
    The Apache error log may have more information.

      1. Андрей, добрый день, мне нужно развернуть веб сервер
        на ubuntu 16 или 18 php5.2 b mysql на apache . Пытался делать как у вас написано, но не вышло на этапе make…делаю в AWS. также там минимальная версия mysql 5.6. в итоге сервер не пошел..я не сильный специалист в backend…тот инстанс уже терминировал…могу все попробовать заново, с учетом ошибок которые описаны в комментариях, если они не учтены конечно.

Leave a Reply to Alex Cancel reply