Installazione di PHP 5.3 su Debian Stretch (9)


8

Sto migrando un server molto vecchio (Debian etch) su Debian Stretch e ogni singola app sviluppata ha problemi di PHP, era previsto. Alcuni possono essere risolti, altri no (come diversi siti drupal 6). In futuro ogni singola app verrà pubblicata in PHP7.0 ma fino a quel giorno ho bisogno che PHP5.3 le serva.

So che Debian stretch ha una sorta di supporto "nativo" per le versioni PHP coinstallabili, ma tutti gli esempi che ho trovato sono con PHP5.6 (versione di Jessie): https://pehapkari.cz/blog/2017/03/27 / multiple-php-versioni-the-facile-way /

Inoltre, ho trovato alcuni esempi di PHP5.3 e PHP5.4 o PHP5.6 che lavorano insieme su Debian Jessie, Wheezy, ecc. Ma non per Debian Stretch (PHP7.0): /superuser/913792 / php-5-3-10-on-debian-jessie

Quindi, prima di tutto, devo sapere se è possibile che PHP7.0 e PHP5.3 lavorino insieme su apache2 su Debian Stretch.

In secondo luogo, devo capire come è possibile farlo .

Non sono un amministratore di sistema, quindi la mia conoscenza debian sta crescendo di giorno in giorno da zero.

Grazie.


Esiste un requisito specifico per migrare su Stretch? Jessie è ancora supportata, potresti migrare a quello invece.
Stephen Kitt,

Ho qui un server interno che funziona con PHP 5 e 7. Sono d'accordo con Stephen, Jessie è un percorso più semplice. Sei disposto a convivere con i problemi di sicurezza?
Rui F Ribeiro,

Purtroppo è un requisito estensivo, "ricevo" l'utente root di un server virtuale con SO installato (debian 9), tutto dipende da me. Sono a conoscenza dei problemi di sicurezza con PHP5.3, sarebbe una soluzione temporanea in quanto posso migrare tutte le app per lavorare con PHP7.0
raguchi,

Mi arrendo con Debian Stretch, non ho modo di avere PHP 5.3. @RuiFRibeiro, la tua versione di PHP5 è 5.6, non è vero? Forse potrei avere PHP5.3 e PHP7.0 nel debian Jessie ma non riesco a vedere un modo semplice come con 5.6 (apt-get install php7.0-fpm php5-fpm).
Raguchi,

5.6 esattamente. È più un trucco che altro, non lo userebbe in un server Internet.
Rui F Ribeiro,

Risposte:


5

Mi sono imbattuto in un problema simile e sono riuscito a farlo funzionare.

Ho dovuto installare un server con debian 9 / nginx / php5.4, quindi sebbene non corrisponda esattamente ai tuoi prerequisiti, suppongo che la soluzione sia simile. Elencherò i passi che ho fatto per risolverlo.

Fondamentalmente, devi installare php dai sorgenti, e questo crea un problema se hai bisogno del supporto openssl (--with-openssl), perché le vecchie versioni di PHP (<7.0) non supportano openssl> = 1.1.0, che è il default in debian 9. Quindi devi costruire una versione di openssl precedente (ho preso 1.0.1u).

Ma prima installiamo alcune dipendenze.

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

Quindi costruiremo 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

Come reazione a catena, dovrai creare libcurl e libc-client (per il supporto imap) con il tuo openssl appena creato. Inizieremo 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

Quindi, libc-client. In realtà ho usato i sorgenti di debian 8, poiché includeva alcune patch. La build stessa non è riuscita ma ha comunque prodotto c-client.a, che è tutto ciò di cui avevo bisogno.

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 questo, avevo tutto ciò di cui avevo bisogno per creare PHP5.4. Si prega di notare che ho avuto un avviso per i collegamenti postgresql nella compilazione (a causa della mancata corrispondenza tra versione locale vs sistema openssl), quindi penso che dovrai creare il tuo libpq se desideri utilizzarli.

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

Le uniche cose rimaste sono la creazione di file php.ini e php-fpm.conf, che sono al contempo banali, la configurazione del socket php-fpm e la creazione di un initscript (ci sono molti esempi online, non posso pubblicare l'intero file qui) e la configurazione del server Web (fastcgi su socket).


Sto riscontrando problemi con la prima riga della compilation uw-imap_2007f. Ci sono molti problemi nella dichiarazione principale di /usr/local/imap-2007f/ipopd/ipop2d.c
dubis,

Sì, questo è previsto. Dovrebbe comunque generare un file c-client / c-client.a, che è tutto ciò che serve per i passaggi successivi.
Arza,

A partire dal 2020, uw-imap_2007f \ ~ dfsg-7.debian.tar.xz e uw-imap_2007f \ ~ dfsg-7.dsc sono attuali (la patch 2 non è più disponibile). Ho anche avuto un conflitto con un /usr/lib/libc-client.a esistente che non ho risolto. Ho scelto di saltare imap.
Martin M,

5

Una settimana dopo sono riuscito a farlo funzionare, ma in modo diverso. Ho smesso di scherzare con l'host e ho iniziato a imparare come Docker può salvarmi la vita.

Questo post mi ha dato la chiave: Docker - Esegui Apache su host e container per diversi siti Web

La mia lettura iniciatica su docker è stata questa: PHP Web Development con Docker

Riassumendo, non ho bisogno di installare apache2.2 e PHP5.3 nel mio server host, posso avere un contenitore isolato dove posso installare tutto ciò di cui ho bisogno (di solito un servizio) e dimenticare possibili incompatibilità con la versione del sistema operativo host. Docker gestisce tutto. Quindi posso avere un container con apache 2.2 + PHP 5.3 come sarebbe in un sistema operativo debian squeeze. Un altro contenitore con Apache 2.2 + PHP 5.4 come sarebbe in un Wheezy, un altro con Apache 2.4 + PHP7.0 come in tratto e così via. Tutti lavorano contemporaneamente e servono domini diversi. Per ottenere quest'ultimo, apache / nginx sull'host funziona come proxy inverso reindirizzando ciascun dominio su un diverso contenitore apache-php grazie al mapping delle porte docker. Non hai nemmeno bisogno di avere apache / nginx sull'host, può anche essere in un contenitore.

La modalità docker consiste nell'avere ogni (micro) servizio in un contenitore, in modo da poter avere mariaDB in un altro contenitore, ecc.

I miei passaggi (riepilogativi): ( Non riesco a pubblicare altro che sui link, quando avrò abbastanza reputazione, li modificherò e li aggiungerò )

0 - Leggi sulla docker (meglio è): come costruire immagini con Dockerfile , best practice , networking all'interno della docker, ...

1 - Installa Docker: segui sempre la guida ufficiale .

2 - Crea una directory con il tuo futuro nome di immagine (/ home / user / docker / images / apache22php53 ad esempio), all'interno crea il tuo Dockerfile e le tue configurazioni (conf virtualhost in questo caso) il mio Dockerfile era:

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

All'interno della directory inserisci il tuo file di configurazione virtualhost nel percorso: conf / apache / virtualhosts /

3 - costruisci l'immagine con (cd precedente all'interno della directory):

sudo docker build -t apache22php53 .

4 - avviare il contenitore con:

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

Docker mapperà (-p) la porta host 2253 su 80 porta container. Stiamo montando (-v) anche la radice del documento host (/ var / www / html) nella radice del documento apache-container (in squeeze è / var / www). Stanno anche impostando il nome del contenitore (--name).

5 - ssh nel contenitore con:

sudo docker exec -ti apache22php53 /bin/bash

e avvia apache se necessario (come nel mio caso). "esci" per tornare all'host cli.

6 - vai su ... yourvhostdomain.com:2253 e dovresti vedere il tuo apache in esecuzione con PHP5.3 caricato.

Questa è la base. Successivamente imparerai come montare i dati host (www, database, ecc.) All'interno dei contenitori, come i contenitori possono comunicare tra loro e con l'host (IP privati ​​nella rete docker), come utilizzare la composizione docker per impostare più contenitori contemporaneamente (web, database, ecc.), proxy inverso per server Web a più contenitori, ecc.


Ho contrassegnato la mia risposta come accettata perché è l'unica soluzione che ho provato e ha funzionato per me.
Raguchi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.