Instalación de PHP 5.3 en Debian Stretch (9)

8

Estoy migrando un servidor muy antiguo (Debian etch) a Debian Stretch y se esperaba que todas las aplicaciones desarrolladas tengan problemas de PHP. Algunos pueden repararse, otros no (como varios sitios de drupal 6). En el futuro, una sola aplicación se servirá con PHP7.0, pero hasta ese día necesito PHP5.3.

Sé que Debian stretch tiene algún tipo de soporte "nativo" para las versiones de PHP coinstalables, pero todos los ejemplos que he encontrado son con PHP5.6 (versión de Jessie): https://pehapkari.cz/blog/2017/03/27 / multiple-php-version-the-easy-way /

Además, he encontrado algunos ejemplos de PHP5.3 y PHP5.4 o PHP5.6 trabajando juntos en Debian Jessie, Wheezy, etc., pero no para Debian Stretch (PHP7.0): /superuser/913792 / php-5-3-10-on-debian-jessie

Entonces, primero, necesito saber si es posible tener PHP7.0 y PHP5.3 trabajando juntos en apache2 en Debian Stretch.

En segundo lugar, necesito averiguar cómo se puede hacer esto .

No soy administrador de sistemas, así que mi conocimiento de Debian está creciendo día a día desde cero.

Gracias.

raguchi
fuente
¿Existe un requisito específico para migrar a Stretch? Jessie todavía es compatible, podrías migrar a eso en su lugar.
Stephen Kitt
Tengo aquí un servidor interno que funciona con PHP 5 y 7. Estoy de acuerdo con Stephen, Jessie es un camino más fácil. ¿Estás dispuesto a vivir con los problemas de seguridad?
Rui F Ribeiro
Tristemente es un requisito, "recibo" al usuario raíz de un servidor virtual con SO instalado (debian 9), todo lo demás depende de mí. Soy consciente de los problemas de seguridad con PHP5.3, sería una solución temporal ya que puedo migrar todas las aplicaciones para que funcionen con PHP7.0
raguchi
Me doy por vencido con Debian Stretch, no hay forma de tener PHP 5.3. @RuiFRibeiro, su versión PHP5 es 5.6, ¿no? Tal vez podría tener PHP5.3 y PHP7.0 en Debian Jessie, pero no puedo ver una manera fácil como con 5.6 (apt-get install php7.0-fpm php5-fpm).
raguchi
5.6 exactamente. Es más un truco que cualquier otra cosa, no lo usaría en un servidor de Internet.
Rui F Ribeiro

Respuestas:

5

Me topé con un problema similar y logré hacerlo funcionar.

Tuve que instalar un servidor con Debian 9 / nginx / php5.4, por lo que si bien no coincide exactamente con sus requisitos previos, supongo que la solución es similar. Voy a enumerar los pasos que tomé que me resolvieron.

Básicamente, necesita instalar php desde las fuentes, y esto plantea un problema si necesita soporte para openssl (--with-openssl), porque las versiones antiguas de PHP (<7.0) no admiten openssl> = 1.1.0, que es el valor predeterminado en debian 9. Por lo tanto, debe crear una versión anterior de openssl (tomé 1.0.1u).

Pero primero instalemos algunas dependencias.

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

Entonces construiremos 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

Como reacción en cadena, tendrá que compilar libcurl y libc-client (para soporte de imap) con su openssl recién construido. Comenzaremos con 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

Entonces, libc-client. De hecho, utilicé las fuentes de Debian 8, ya que incluía algunos parches. La compilación en sí falló, pero todavía produjo c-client.a, que es todo lo que necesitaba.

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

Con esto, tenía todo lo que necesitaba para construir PHP5.4. Tenga en cuenta que tuve una advertencia para los enlaces postgresql en la compilación (debido a la falta de coincidencia de la versión de OpenSL local con el sistema), por lo que creo que tendrá que construir su propia libpq si desea utilizarlos.

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

Lo único que queda es la creación de archivos php.ini y php-fpm.conf, que son triviales, la configuración del socket php-fpm y la creación de un initscript (hay muchos ejemplos en línea, no puedo publicar el archivo completo aquí), y la configuración de su servidor web (fastcgi en socket).

Arza
fuente
Tengo problemas con la línea emake de la compilación uw-imap_2007f. Hay muchos problemas en la declaración principal /usr/local/imap-2007f/ipopd/ipop2d.c
Dubiš
Sí, esto se espera. Todavía debe generar un archivo c-client / c-client.a, que es todo lo que necesita para los próximos pasos.
Arza
A partir de 2020, uw-imap_2007f \ ~ dfsg-7.debian.tar.xz y uw-imap_2007f \ ~ dfsg-7.dsc son actuales (el parche 2 ya no está disponible). También tuve un conflicto con un /usr/lib/libc-client.a existente que no resolví. Elijo omitir imap.
Martin M
5

Una semana después logré hacerlo funcionar pero de una manera diferente. Dejé de jugar con el anfitrión y comencé a aprender cómo Docker puede salvarme la vida.

Esta publicación me dio la clave: Docker: ejecutar Apache en el host y el contenedor para diferentes sitios web

Mi lectura inicial sobre Docker fue esta: Desarrollo web PHP con Docker

En resumen, no necesito instalar apache2.2 y PHP5.3 en mi servidor host, puedo tener un contenedor aislado donde puedo instalar todo lo que necesito (generalmente un servicio) y olvidarme de posibles incompatibilidades con la versión del sistema operativo host. Docker lo maneja todo. Entonces puedo tener un contenedor con apache 2.2 + PHP 5.3 como lo estaría en un sistema operativo Debian Squeeze. Otro contenedor con apache 2.2 + PHP 5.4 como estaría en un Wheezy, otro con apache 2.4 + PHP7.0 como en estiramiento y así sucesivamente. Todos trabajando al mismo tiempo y sirviendo diferentes dominios. Para lograr esto último, haga que apache / nginx en el host funcione como proxy inverso que redirige cada dominio a un contenedor apache-php diferente gracias al mapeo de puertos docker. Ni siquiera necesita tener apache / nginx en el host, también puede estar en un contenedor.

La forma de acoplamiento es tener cada (micro) servicio en un contenedor, para que pueda tener mariaDB en otro contenedor, etc.

Mis pasos (resumidos): ( No puedo publicar más que en enlaces, cuando tenga suficiente reputación los editaré y los agregaré )

0 - Lea sobre Docker (cuanto más mejor): cómo construir imágenes con el Dockerfile , mejores prácticas , redes dentro de Docker, ...

1 - Instalar Docker: siga siempre la guía oficial .

2 - Cree un directorio con su futuro nombre de imagen (/ home / user / docker / images / apache22php53 eg), dentro cree su Dockerfile y configs (virtualhost conf en este caso) mi Dockerfile fue:

FROM debian:squeeze

LABEL maintainer="[email protected]"

# 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"]

Dentro del directorio, coloque su archivo conf virtualhost dentro de la ruta: conf / apache / virtualhosts /

3 - construye la imagen con (cd anterior dentro del directorio):

sudo docker build -t apache22php53 .

4 - inicie el contenedor con:

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

Docker asignará (-p) el puerto de host 2253 al puerto de 80 contenedores. Estamos montando (-v) también nuestra raíz del documento host (/ var / www / html) en la raíz del documento apache-container (en compresión es / var / www). También están configurando el nombre del contenedor (--name).

5 - ssh al contenedor con:

sudo docker exec -ti apache22php53 /bin/bash

e inicie apache si es necesario (como en mi caso). "salir" para volver al host cli.

6 - navegue a ... yourvhostdomain.com:2253 y debería ver su apache ejecutándose con PHP5.3 cargado.

Esto es lo básico. Después de eso, aprenderá cómo montar datos de host (www, bases de datos, etc.) dentro de contenedores, cómo los contenedores pueden comunicarse entre ellos y con el host (IP privadas en la red de acopladores), cómo usar docker-compose para configurar múltiples contenedores a la vez (web, base de datos, etc.), proxy inverso para servidores web de múltiples contenedores, etc.

raguchi
fuente
Marqué mi propia respuesta como aceptada porque es la única solución que he probado y funcionó para mí.
raguchi