Установка PHP 5.3 на Debian Stretch (9)

8

Я перевожу очень старый сервер (Debian etch) на Debian Stretch, и каждое разработанное приложение имеет проблемы с PHP, как и ожидалось. Некоторые могут быть исправлены, некоторые не могут (как несколько сайтов drupal 6). В будущем когда-нибудь одно приложение будет обслуживаться под PHP7.0, но до этого дня мне нужен PHP5.3, обслуживающий их.

Я знаю, что в Debian stretch есть какая-то «нативная» поддержка совместно устанавливаемых версий PHP, но все примеры, которые я нашел, относятся к PHP5.6 (версия Jessie): https://pehapkari.cz/blog/2017/03/27 / множественная-PHP-версия самого простой путь /

Кроме того, я нашел несколько примеров работы PHP5.3 и PHP5.4 или PHP5.6 вместе с Debian Jessie, Wheezy и т. Д., Но не над Debian Stretch (PHP7.0): /superuser/913792 / PHP-5-3-10-на-Debian-Jessie

Итак, во-первых, мне нужно знать, возможно ли совместное использование PHP7.0 и PHP5.3 для apache2 в Debian Stretch.

Во-вторых, мне нужно выяснить, как это можно сделать .

Я не являюсь системным администратором, поэтому мои знания по Debian растут день ото дня с нуля.

Спасибо.

raguchi
источник
Есть ли особые требования для перехода на Stretch? Джесси по-прежнему поддерживается, вы можете перейти на это вместо.
Стивен Китт
У меня есть внутренний сервер, работающий с PHP 5 и 7. Я согласен со Стивеном, Джесси - более легкий путь. Готовы ли вы жить с проблемами безопасности?
Руи Ф. Рибейро
К сожалению, требуется растяжка, я "получаю" пользователя root виртуального сервера с установленным SO (debian 9), все остальное зависит от меня. Я знаю о проблемах безопасности с PHP5.3, это было бы временным решением, так как я могу перенести все приложения для работы с PHP7.0
raguchi
Я отказался от Debian Stretch, нет способа получить PHP 5.3. @RuiFRibeiro, ваша версия PHP5 5.6, не так ли? Возможно, у меня может быть PHP5.3 и PHP7.0 в Debian Jessie, но я не могу найти простой способ, как с 5.6 (apt-get install php7.0-fpm php5-fpm).
рагути
5,6 точно. Это больше взломать, чем что-либо еще, не будет использовать его на интернет-сервере.
Руи Ф Рибейро

Ответы:

5

Я наткнулся на похожую проблему и сумел заставить ее работать.

Мне пришлось установить сервер с Debian 9 / nginx / php5.4, поэтому, хотя он не совсем соответствует вашим требованиям, я предполагаю, что решение аналогично. Я перечислю шаги, которые я сделал, который решил это для меня.

По сути, вам нужно установить php из исходников, и это создает проблему, если вам нужна поддержка openssl (--with-openssl), потому что старые версии PHP (<7.0) не поддерживают openssl> = 1.1.0, что по умолчанию в Debian 9. Поэтому вы должны собрать более старую версию openssl (я взял 1.0.1u).

Но давайте сначала установим некоторые зависимости.

apt install build-essential checkinstall zip autoconf
apt install libfcgi-dev libfcgi0ldbl libmcrypt-dev libssl-dev libc-client2007e-dev libkrb5-dev libcurl4-openssl-dev
apt install libxml2-dev libcurl4-openssl-dev libpcre3-dev libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libmcrypt-dev libmhash-dev freetds-dev libmariadbclient-dev-compat unixodbc-dev libxslt1-dev

Тогда мы будем строить openssl.

cd /opt/
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
tar xzf openssl-1.0.1u.tar.gz
cd openssl-1.0.1u
./config shared --openssldir=/usr/local/openssl/ enable-ec_nistp_64_gcc_128
make depend
make
make install
ln -s /usr/local/openssl/lib /usr/local/openssl/lib/x86_64-linux-gnu

В качестве цепной реакции вам придется собрать libcurl и libc-client (для поддержки imap) с помощью только что созданного openssl. Начнем с libcurl.

cd /opt/
wget https://curl.haxx.se/download/curl-7.26.0.tar.gz
tar xzf curl-7.26.0.tar.gz
cd curl-7.26.0
env PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig LDFLAGS=-Wl,-rpath=/usr/local/openssl/lib ./configure --with-ssl=/usr/local/openssl --with-zlib --prefix=/usr/local/curl
make
make install

Затем libc-клиент. Я на самом деле использовал исходники Debian 8, так как он включал некоторые патчи. Сама сборка не удалась, но все равно выдала c-client.a, и это все, что мне было нужно

cd /tmp/
wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f\~dfsg-2.dsc
wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f\~dfsg.orig.tar.gz
wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f\~dfsg-2.debian.tar.gz
dpkg-source -x uw-imap_2007f\~dfsg-2.dsc imap-2007f
mv imap-2007f /usr/local/
cd /usr/local/imap-2007f/
touch {ipv6,lnxok}
make slx SSLINCLUDE=/usr/local/openssl/include/ SSLLIB=/usr/local/openssl/lib EXTRAAUTHENTICATORS=gss
mkdir lib include
cp c-client/*.c lib/
cp c-client/*.h include/
cp c-client/c-client.a lib/libc-client.a
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

С этим у меня было все, что мне нужно для сборки PHP5.4. Обратите внимание, что у меня было предупреждение о привязках postgresql при компиляции (из-за несоответствия версий локальной и системной версий openssl), поэтому я думаю, что вам придется создать свой собственный libpq, если вы хотите их использовать.

cd /opt/
PHP_VER=5.4.45
wget http://museum.php.net/php5/php-${PHP_VER}.tar.gz
tar xzf php-${PHP_VER}.tar.gz
cd php-${PHP_VER}
LDFLAGS="-Wl,-rpath=/usr/local/openssl/lib,-rpath=/usr/local/curl/lib" './configure'  --prefix=/usr/local/php-${PHP_VER} '--with-zlib-dir' '--with-freetype-dir' '--enable-fpm' '--enable-mbstring' '--with-libxml-dir=/usr' '--enable-soap' '--enable-calendar' '--with-curl=/usr/local/curl' '--with-mcrypt' '--with-zlib' '--with-gd' '--disable-rpath' '--enable-inline-optimization' '--with-bz2' '--with-zlib' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-mbregex' '--with-mhash' '--enable-zip' '--with-pcre-regex' '--with-mysql' '--with-pdo-mysql' '--with-mysqli' '--with-jpeg-dir=/usr' '--with-png-dir=/usr' '--enable-gd-native-ttf' '--enable-cgi' '--with-pear' '--enable-memcache' '--with-openssl=/usr/local/openssl' '--with-imap=/usr/local/imap-2007f' '--with-kerberos' '--with-imap-ssl' '--with-libdir=lib/x86_64-linux-gnu'
LDFLAGS="-Wl,-rpath=/usr/local/openssl/lib,-rpath=/usr/local/curl/lib" make
make install

Осталось только создание файлов php.ini и php-fpm.conf, которые являются тривиальными, настройка сокета php-fpm и создание начального сценария (есть много примеров в Интернете, я не могу опубликовать полный файл здесь) и конфигурации вашего веб-сервера (fastcgi on socket).

Арза
источник
У меня проблема с строкой emake из компиляции uw-imap_2007f. Есть много проблем в основной декларации /usr/local/imap-2007f/ipopd/ipop2d.c
Дубис
Да, это ожидается. Он все равно должен сгенерировать файл c-client / c-client.a, который является всем необходимым для следующих шагов.
Арза
Начиная с 2020 года uw-imap_2007f \ ~ dfsg-7.debian.tar.xz и uw-imap_2007f \ ~ dfsg-7.dsc являются текущими (исправление 2 больше не доступно). У меня также был конфликт с существующим /usr/lib/libc-client.a, который я не решил. Я решил пропустить IMAP.
Мартин М
5

Через неделю мне удалось заставить его работать, но по-другому. Я перестал возиться с хозяином и начал изучать, как Docker может спасти мою жизнь.

Этот пост дал мне ключ: Docker - Запустите Apache на хосте и контейнере для разных сайтов.

Мое начальное чтение о докере было таким: PHP Web Development с Docker

Подводя итог, мне не нужно устанавливать apache2.2 и PHP5.3 на моем хост-сервере, у меня может быть изолированный контейнер, в который я могу установить все, что мне нужно (обычно один сервис), и забыть о возможных несовместимостях с версией хост-ОС. Докер управляет всем этим. Таким образом, я могу иметь один контейнер с apache 2.2 + PHP 5.3, как это было бы в операционной системе Debian Squeeze. Другой контейнер с apache 2.2 + PHP 5.4, как это было бы в Wheezy, другой с apache 2.4 + PHP7.0 как в растяжке и так далее. Все работают одновременно и обслуживают разные домены. Чтобы добиться последнего, сделайте на хосте apache / nginx, чтобы он работал в качестве обратного прокси-сервера, перенаправляя каждый домен в отдельный контейнер apache-php благодаря сопоставлению портов докера. Вам даже не нужно иметь apache / nginx на хосте, он также может быть в контейнере.

Способ докера состоит в том, чтобы каждая (микро) служба была в контейнере, чтобы вы могли иметь mariaDB в другом контейнере и т. Д.

Мои шаги (кратко): ( Я не могу публиковать больше, чем ссылки, когда я наберу достаточно репутации, я буду редактировать и добавлять их )

0 - Узнайте о докере (чем больше, тем лучше): как создавать образы с помощью Dockerfile , лучшие практики , работа в сети в Docker, ...

1 - Установите Docker: всегда следуйте официальному руководству .

2 - Создайте каталог с вашим будущим именем образа (например, / home / user / docker / images / apache22php53), внутри создайте ваш Dockerfile и конфиги (в данном случае - virtualhost conf), мой Dockerfile был:

FROM debian:squeeze

LABEL maintainer="raguchi@gmail.com"

# squeeze new mirrors
RUN echo "deb http://archive.debian.org/debian/ squeeze contrib main non-free" > /etc/apt/sources.list

RUN apt-get update
# Common packages
RUN apt-get update && \
    apt-get install -y --force-yes curl wget

RUN apt-get update && \
    apt-get install -y --force-yes \
            apache2 \
            libapache2-mod-php5 \
            ntp \
        php5 \
        php5-curl \
        php5-gd \
        php5-ldap \
        php5-mcrypt \
        php5-mysql \
        vim

RUN a2enmod \
            php5 \
        rewrite \
        ssl


ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP    www-data
ENV APACHE_LOG_DIR  /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
# RUN     chown -R www-data:www-data /var/www
COPY     conf/apache/virtualhosts /etc/apache2/sites-enabled

# disable default virtualhost
RUN a2dissite 000-default

EXPOSE 80
EXPOSE 443

CMD     ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

В директории поместите файл conf вашего виртуального хоста в путь: conf / apache / virtualhosts /

3 - построить изображение с помощью (предыдущий компакт-диск внутри директории):

sudo docker build -t apache22php53 .

4 - запустить контейнер с:

sudo docker run -ti -d -p 2253:80 -v /var/www/html:/var/www --name apache22php53 apache22php53 /bin/bash

Docker отобразит (-p) хост-порт 2253 на 80 контейнерный порт. Мы монтируем (-v) также наш корневой каталог хоста (/ var / www / html) в корневой каталог документа apache-контейнера (в squeeze это / var / www). Устанавливаются также имя контейнера (--name).

5 - SSH в контейнер с:

sudo docker exec -ti apache22php53 /bin/bash

и при необходимости запустите apache (как в моем случае). "выход", чтобы вернуться к хозяину кли.

6 - перейдите к ... yourvhostdomain.com:2253, и вы должны увидеть, что ваш apache работает с загруженным PHP5.3.

Это основы. После этого вы узнаете, как монтировать данные хоста (www, базы данных и т. Д.) Внутри контейнеров, как контейнеры могут взаимодействовать между ними и с хостом (приватные IP-адреса в сети Docker), как использовать docker-compose для настройки нескольких контейнеров. сразу (веб, база данных и т. д.), обратный прокси-сервер для нескольких контейнерных веб-серверов и т. д.

raguchi
источник
Я отметил свой ответ как принятый, потому что это единственное решение, которое я попробовал, и оно сработало для меня.
Рагути