Installation von PHP 5.3 auf Debian Stretch (9)

8

Ich migriere einen sehr alten Server (Debian Etch) auf Debian Stretch und jede einzelne entwickelte App hat PHP-Probleme, wie erwartet wurde. Einige können repariert werden, andere nicht (wie mehrere Drupal 6-Sites). In Zukunft wird jede einzelne App unter PHP7.0 bereitgestellt, aber bis zu diesem Tag brauche ich PHP5.3, um sie bereitzustellen.

Ich weiß, dass Debian Stretch eine Art "native" Unterstützung für co-installierbare PHP-Versionen bietet, aber alle Beispiele, die ich gefunden habe, sind mit PHP5.6 (Jessies Version): https://pehapkari.cz/blog/2017/03/27 / multiple-php-version-the-easy-way /

Außerdem habe ich einige Beispiele für PHP5.3 und PHP5.4 oder PHP5.6 gefunden, die unter Debian Jessie, Wheezy usw. zusammenarbeiten, jedoch nicht für Debian Stretch (PHP7.0): /superuser/913792 / php-5-3-10-on-debian-jessie

Zuerst muss ich wissen, ob es möglich ist, dass PHP7.0 und PHP5.3 auf Apache2 unter Debian Stretch zusammenarbeiten.

Zweitens muss ich herausfinden, wie dies getan werden kann .

Ich bin kein Systemadministrator, daher wächst mein Debian-Wissen von Tag zu Tag von Grund auf.

Vielen Dank.

Raguchi
quelle
Gibt es eine spezielle Anforderung für die Migration zu Stretch? Jessie wird weiterhin unterstützt, Sie können stattdessen darauf migrieren.
Stephen Kitt
Ich habe hier einen internen Server, der mit PHP 5 und 7 arbeitet. Ich stimme Stephen zu, Jessie ist ein einfacher Weg. Sind Sie bereit, mit den Sicherheitsproblemen zu leben?
Rui F Ribeiro
Leider ist Stretch eine Voraussetzung, ich "empfange" den Root-Benutzer eines virtuellen Servers mit installiertem SO (Debian 9), alles andere liegt bei mir. Ich bin mir der Sicherheitsprobleme mit PHP5.3 bewusst, es wäre eine vorübergehende Lösung, da ich alle Apps migrieren kann, um mit PHP7.0 zu arbeiten
raguchi
Ich gebe mit Debian Stretch auf, keine Möglichkeit, PHP 5.3 zu haben. @RuiFRibeiro, deine PHP5-Version ist 5.6, nicht wahr? Vielleicht könnte ich PHP5.3 und PHP7.0 in Debian Jessie haben, aber ich kann keinen einfachen Weg wie mit 5.6 sehen (apt-get install php7.0-fpm php5-fpm).
Raguchi
5.6 genau. Es ist mehr ein Hack als alles andere, würde es nicht in einem Internet-Server verwenden.
Rui F Ribeiro

Antworten:

5

Ich bin auf ein ähnliches Problem gestoßen und habe es geschafft, dass es funktioniert.

Ich musste einen Server mit debian 9 / nginx / php5.4 installieren. Obwohl dies nicht genau Ihren Voraussetzungen entspricht, gehe ich davon aus, dass die Lösung ähnlich ist. Ich werde die Schritte auflisten, die ich unternommen habe, um es für mich zu lösen.

Grundsätzlich müssen Sie PHP aus Quellen installieren, und dies stellt ein Problem dar, wenn Sie OpenSSL-Unterstützung (--with-openssl) benötigen, da alte Versionen von PHP (<7.0) OpenSSL> = 1.1.0 nicht unterstützen Die Standardeinstellung in Debian 9. Sie müssen also eine ältere openssl-Version erstellen (ich habe 1.0.1u genommen).

Aber lassen Sie uns zuerst einige Abhängigkeiten installieren.

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

Dann bauen wir 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

Als Kettenreaktion müssen Sie libcurl und libc-client (für die IMAP-Unterstützung) mit Ihrem frisch erstellten openssl erstellen. Wir werden mit libcurl beginnen.

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

Dann libc-client. Ich habe tatsächlich die Quellen von Debian 8 verwendet, da es einige Patches enthielt. Der Build selbst schlug fehl, produzierte aber immer noch c-client.a, was alles ist, was ich brauchte.

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

Damit hatte ich alles, was ich brauchte, um PHP5.4 zu erstellen. Bitte beachten Sie, dass ich bei der Kompilierung eine Warnung für Postgresql-Bindungen erhalten habe (aufgrund der Nichtübereinstimmung zwischen lokaler und System-OpenSSL-Version). Ich denke, Sie müssen Ihre eigene libpq erstellen, wenn Sie sie verwenden möchten.

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

Die einzigen Dinge, die noch übrig sind, sind die Erstellung von php.ini und php-fpm.conf Dateien, die beide trivial sind, die Konfiguration des php-fpm Sockets und die Erstellung eines Initskripts (es gibt viele Beispiele online, ich kann nicht die vollständige Datei veröffentlichen hier) und die Konfiguration Ihres Webservers (fastcgi on socket).

Arza
quelle
Ich habe ein Problem mit der Emake-Zeile der uw-imap_2007f-Kompilierung. Es gibt viele Probleme in der /usr/local/imap-2007f/ipopd/ipop2d.c
Haupterklärung
Ja, das wird erwartet. Es sollte weiterhin eine c-client / c-client.a-Datei generiert werden, die alles ist, was Sie für die nächsten Schritte benötigen.
Arza
Ab 2020 sind uw-imap_2007f \ ~ dfsg-7.debian.tar.xz und uw-imap_2007f \ ~ dfsg-7.dsc aktuell (Patch 2 ist nicht mehr verfügbar). Ich hatte auch einen Konflikt mit einem vorhandenen /usr/lib/libc-client.a, den ich nicht gelöst habe. Ich überspringe imap.
Martin M
5

Eine Woche später gelang es mir, es zum Laufen zu bringen, aber auf eine andere Art und Weise. Ich hörte auf, mich mit dem Host zu beschäftigen, und begann zu lernen, wie Docker mein Leben retten kann.

Dieser Beitrag gab mir den Schlüssel: Docker - Führen Sie Apache auf Host und Container für verschiedene Websites aus

Meine iniciatic Lektüre über Docker war diese: PHP Web Development mit Docker

Zusammenfassend muss ich Apache2.2 und PHP5.3 nicht auf meinem Host-Server installieren. Ich kann einen isolierten Container haben, in dem ich alles installieren kann, was ich brauche (normalerweise einen Dienst), und mögliche Inkompatibilitäten mit der Host-Betriebssystemversion vergessen. Docker verwaltet alles. Ich kann also einen Container mit Apache 2.2 + PHP 5.3 haben, wie es in einem Debian-Squeeze-Betriebssystem der Fall wäre. Ein weiterer Container mit Apache 2.2 + PHP 5.4 wie in einem Wheezy, ein anderer mit Apache 2.4 + PHP7.0 wie in Stretch und so weiter. Alle arbeiten zur gleichen Zeit und bedienen verschiedene Domänen. Um letzteres zu erreichen, muss Apache / Nginx auf dem Host als Reverse-Proxy fungieren und jede Domäne dank Docker-Port-Mapping in einen anderen Apache-PHP-Container umleiten. Sie müssen nicht einmal Apache / Nginx auf dem Host haben, es kann sich auch in einem Container befinden.

Der Docker-Weg besteht darin, jeden (Mikro-) Dienst in einem Container zu haben, damit Sie mariaDB in einem anderen Container usw. haben können.

Meine Schritte (zusammengefasst): ( Ich kann nicht mehr als auf Links posten, wenn ich genug Ruf habe, werde ich sie bearbeiten und hinzufügen )

0 - Lesen Sie mehr über Docker (je mehr desto besser): Erstellen von Bildern mit der Docker-Datei , Best Practices , Vernetzung innerhalb von Docker, ...

1 - Installieren Sie Docker: Befolgen Sie immer die offizielle Anleitung .

2 - Erstellen Sie ein Verzeichnis mit Ihrem zukünftigen Bildnamen (/ home / user / docker / images / apache22php53, z. B.). Erstellen Sie darin Ihre Docker-Datei und Konfigurationen (in diesem Fall virtualhost conf). Meine Docker-Datei war:

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

Fügen Sie im Verzeichnis Ihre conf-Datei virtualhost in den Pfad ein: conf / apache / virtualhosts /

3 - Erstellen Sie das Bild mit (vorherige CD im Verzeichnis):

sudo docker build -t apache22php53 .

4 - Starten Sie den Container mit:

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

Docker ordnet den Host-Port 2253 (-p) dem Container-Port 80 zu. Wir mounten (-v) auch unseren Host-Dokumentstamm (/ var / www / html) im Apache-Container-Dokumentstamm (in Squeeze ist / var / www). Sie setzen auch den Containernamen (--name).

5 - ssh zum Container mit:

sudo docker exec -ti apache22php53 /bin/bash

und starten Sie Apache bei Bedarf (wie in meinem Fall). "exit", um zum Host-Cli zurückzukehren.

6 - Navigieren Sie zu ... yourvhostdomain.com:2253 und Sie sollten sehen, dass Ihr Apache mit geladenem PHP5.3 ausgeführt wird.

Das sind die Grundlagen. Anschließend erfahren Sie, wie Sie Hostdaten (www, Datenbanken usw.) in Containern bereitstellen, wie Container zwischen ihnen und dem Host kommunizieren können (private IPs im Docker-Netzwerk) und wie Sie mit Docker-Compose mehrere Container einrichten sofort (Web, Datenbank usw.), Reverse-Proxy für mehrere Container-Webserver usw.

Raguchi
quelle
Ich habe meine eigene Antwort als akzeptiert markiert, da dies die einzige Lösung ist, die ich ausprobiert habe und die für mich funktioniert hat.
Raguchi