Installer PHP 5.3 sur Debian Stretch (9)

8

Je migre un très vieux serveur (Debian etch) vers Debian Stretch et chaque application développée a des problèmes PHP, c'était prévu. Certains peuvent être corrigés, d'autres non (comme plusieurs sites drupal 6). À l'avenir, une seule application sera servie sous PHP7.0 mais jusqu'à ce jour, j'ai besoin de PHP5.3 pour les servir.

Je sais que Debian stretch a une sorte de support "natif" pour les versions PHP co-installables mais tous les exemples que j'ai trouvés sont avec PHP5.6 (version de Jessie): https://pehapkari.cz/blog/2017/03/27 / plusieurs-versions-php-the-easy-way /

J'ai également trouvé quelques exemples de PHP5.3 et PHP5.4 ou PHP5.6 fonctionnant ensemble sur Debian Jessie, Wheezy, etc. mais pas pour Debian Stretch (PHP7.0): /superuser/913792 / php-5-3-10-sur-debian-jessie

Donc, tout d'abord, j'ai besoin de savoir s'il est possible que PHP7.0 et PHP5.3 travaillent ensemble sur apache2 sur Debian Stretch.

Deuxièmement, j'ai besoin de comprendre comment cela peut être fait .

Je ne suis pas administrateur système, donc mes connaissances Debian grandissent de jour en jour à partir de zéro.

Je vous remercie.

raguchi
la source
Existe-t-il une exigence spécifique pour migrer vers Stretch? Jessie est toujours prise en charge, vous pouvez plutôt y migrer.
Stephen Kitt
J'ai ici un serveur interne fonctionnant avec PHP 5 et 7. Je suis d'accord avec Stephen, Jessie est un chemin plus facile. Êtes-vous prêt à vivre avec les problèmes de sécurité?
Rui F Ribeiro
Malheureusement, l'étirement est une exigence, je "reçois" l'utilisateur root d'un serveur virtuel avec le SO installé (debian 9), tout dépend de moi. Je suis conscient des problèmes de sécurité avec PHP5.3, ce serait une solution temporaire car je peux migrer toutes les applications pour travailler avec PHP7.0
raguchi
J'abandonne Debian Stretch, aucun moyen d'avoir PHP 5.3. @RuiFRibeiro, votre version PHP5 est 5.6, n'est-ce pas? Peut-être que je pourrais avoir PHP5.3 et PHP7.0 dans Debian Jessie mais je ne peux pas voir un moyen facile comme avec 5.6 (apt-get install php7.0-fpm php5-fpm).
raguchi
5.6 exactement. C'est plus un hack qu'autre chose, je ne l'utiliserais pas sur un serveur Internet.
Rui F Ribeiro

Réponses:

5

Je suis tombé sur un problème similaire et j'ai réussi à le faire fonctionner.

J'ai dû installer un serveur avec debian 9 / nginx / php5.4, donc même s'il ne correspond pas exactement à vos prérequis, je suppose que la solution est similaire. Je vais énumérer les mesures que j'ai prises qui l'ont résolu pour moi.

Fondamentalement, vous devez installer php à partir des sources, et cela pose un problème si vous avez besoin du support openssl (--with-openssl), car les anciennes versions de PHP (<7.0) ne supportent pas openssl> = 1.1.0, ce qui est la valeur par défaut dans debian 9. Vous devez donc construire une ancienne version openssl (j'ai pris 1.0.1u).

Mais installons d'abord quelques dépendances.

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

Ensuite, nous construirons 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

En guise de réaction en chaîne, vous devrez construire libcurl et libc-client (pour le support imap) avec votre openssl fraîchement construit. Nous allons commencer par 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

Ensuite, libc-client. J'ai en fait utilisé les sources de debian 8, car il comprenait des correctifs. La construction elle-même a échoué mais a quand même produit c-client.a, ce qui est tout ce dont j'avais besoin.

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

Avec cela, j'avais tout ce dont j'avais besoin pour construire PHP5.4. Veuillez noter que j'avais un avertissement pour les liaisons postgresql lors de la compilation (en raison de l'inadéquation de la version locale vs système openssl), donc je pense que vous devrez créer votre propre libpq si vous souhaitez les utiliser.

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

Les seules choses qui restent sont la création de fichiers php.ini et php-fpm.conf, qui sont à la fois triviaux, la configuration de la socket php-fpm et la création d'un initscript (il y a beaucoup d'exemples en ligne, je ne peux pas poster le fichier complet ici), et la configuration de votre serveur web (fastcgi sur socket).

Arza
la source
Je rencontre un problème avec la ligne emake de la compilation uw-imap_2007f. Il y a beaucoup de problèmes dans la déclaration principale de /usr/local/imap-2007f/ipopd/ipop2d.c
dubis
Oui, cela est attendu. Il devrait toujours générer un fichier c-client / c-client.a, qui est tout ce dont vous avez besoin pour les étapes suivantes.
Arza
À partir de 2020, uw-imap_2007f \ ~ dfsg-7.debian.tar.xz et uw-imap_2007f \ ~ dfsg-7.dsc sont à jour (le patch 2 n'est plus disponible). J'ai également eu un conflit avec un fichier /usr/lib/libc-client.a existant que je n'ai pas résolu. Je choisis de sauter imap.
Martin M
5

Une semaine plus tard, j'ai réussi à le faire fonctionner mais d'une manière différente. J'ai arrêté de jouer avec l'hôte et j'ai commencé à apprendre comment Docker peut me sauver la vie.

Ce message m'a donné la clé: Docker - Exécuter Apache sur l'hôte et le conteneur pour différents sites Web

Ma lecture iniciatique sur Docker était celle-ci: Développement Web PHP avec Docker

En résumé, je n'ai pas besoin d'installer apache2.2 et PHP5.3 sur mon serveur hôte, je peux avoir un conteneur isolé où je peux installer tout ce dont j'ai besoin (généralement un service) et oublier les incompatibilités possibles avec la version du système d'exploitation hôte. Docker gère tout cela. Je peux donc avoir un conteneur avec apache 2.2 + PHP 5.3 comme ce serait dans un OS Debian Squeeze. Un autre conteneur avec apache 2.2 + PHP 5.4 comme ce serait dans un Wheezy, un autre avec apache 2.4 + PHP7.0 comme dans Stretch et ainsi de suite. Tous travaillent en même temps et desservent différents domaines. Pour atteindre ce dernier, faites apache / nginx sur l'hôte pour fonctionner comme proxy inverse en redirigeant chaque domaine vers un conteneur apache-php différent grâce au mappage de port docker. Vous n'avez même pas besoin d'avoir apache / nginx sur l'hôte, il peut également être dans un conteneur.

La méthode docker consiste à avoir chaque (micro) service dans un conteneur, afin que vous puissiez avoir mariaDB dans un autre conteneur, etc.

Mes étapes (résumées): ( je ne peux pas poster plus que sur des liens, quand j'aurai assez de réputation je les éditerai et les ajouterai )

0 - Lisez à propos de docker (le plus sera le mieux): comment créer des images avec le Dockerfile , les meilleures pratiques , la mise en réseau au sein du docker, ...

1 - Installez Docker: suivez toujours le guide officiel .

2 - Créez un répertoire avec votre futur nom d'image (/ home / user / docker / images / apache22php53 par exemple), à ​​l'intérieur créez votre Dockerfile et configs (virtualhost conf dans ce cas) mon Dockerfile était:

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

Dans le répertoire, placez votre fichier de configuration virtualhost dans le chemin: conf / apache / virtualhosts /

3 - construire l'image avec (cd précédent dans le répertoire):

sudo docker build -t apache22php53 .

4 - lancez le conteneur avec:

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

Docker mappera (-p) le port hôte 2253 au port de conteneur 80. Nous montons (-v) également notre racine de document hôte (/ var / www / html) dans la racine du document apache-container (dans squeeze est / var / www). Ils définissent également le nom du conteneur (--name).

5 - ssh to container avec:

sudo docker exec -ti apache22php53 /bin/bash

et lancez apache si nécessaire (comme dans mon cas). "exit" pour revenir à l'hôte cli.

6 - accédez à ... votredomaine.com: 2253 et vous devriez voir votre apache fonctionner avec PHP5.3 chargé.

Ce sont les bases. Après cela, vous apprendrez comment monter des données d'hôte (www, bases de données, etc.) à l'intérieur de conteneurs, comment les conteneurs peuvent communiquer entre eux et avec l'hôte (adresses IP privées dans le réseau de docker), comment utiliser docker-compose pour configurer plusieurs conteneurs à la fois (Web, base de données, etc.), proxy inverse pour plusieurs serveurs Web de conteneurs, etc.

raguchi
la source
J'ai marqué ma propre réponse comme acceptée car c'est la seule solution que j'ai essayée et cela a fonctionné pour moi.
raguchi