Server Aruba Cloud - Debian 12 - Installare un Web Server LAMP multi PHP (PHP 5.6, PHP 7.4, PHP 8.2)
### Una premessa fondamentale
Alcuni anni fa pubblicai come realizzare un server su CentOS 7 che potesse ospitare diversi siti in PHP (multihost), ma soprattutto con diverse versioni di esso dal 5.6 al 74 (poi in un apposito post anche 8.1, clicca qui per leggere tutti i post del dEC System IV).
La macchina, usata in svariate versioni anche per uso professionale si è rivelata efficiente, robusta e funzionale per tutte quelle applicazioni anche obsolete che per mancanza di fondi, investimenti e quant'altro dava la possibilità di poter sfruttare le tecnologie acquisite anche su una macchina aggiornabile dove far coesistere tutto il patrimonio digitale che si era costruito nel corso del tempo.
Ricordo che CentOS è l'acronimo di Community Enterprise Operating System, è una distribuzione Linux di classe enterprise derivata dai sorgenti di Red Hat Enterprise Linux (RHEL)
Com'è noto, l'anno scorso (il 30-06-2024) CentOS ha eliminato il supporto per la versione 7 lasciando senza supporto, una popolazione di circa il 26% dei web server mondiali (clicca qui per una analisi dei sistemi Linux).
Se si pensa all'enormità del problema è fisiologico immaginare ad una soluzione alternativa che possa avere un prospettiva nel tempo, senza sacrificare tutto quello che si è costruito in precedenza.
In questo post propongo un'alternativa basata su Debian (sul quale è basato anche Ubuntu) che sostanzialmente esiste da quando il compianto Ian Murdock lo creò nel 1994 ed è un software multi piattaforma.
Ho concepito il progetto come quello basato su CentOS ma su base solida di Debian nativo
### Puliamo la macchina dal firewall installato ed aggiorniamo la macchina
Prima di iniziare è bene fare un upgrade del sistema, per il momento eliminiamo il firewall installato di deafult:
sudo apt purge --autoremove iptables
poi facciamo tutti gli aggiornamenti che ci servono
sudo apt update && sudo apt upgrade
Installiamo anche, per comodità, Midnight Commander (MC) e vediamo di organizzare il sistema
sudo apt install mc
### Installiamo Apache2
Prima di tutto, installiamo il web server apache sul quale costruiremo il sistema
sudo apt install -y apache2
verifichiamolo
sudo systemctl status apache2
ed abilitiamolo
sudo systemctl enable apache2
A questo punto il sistema è funzionante web server funzionante
### PHP 5.6
Partiamo da una premessa che installare PHP 5.6 è molto difficile dal punto di vista della disponibilità del pacchetto, poiché è da considerarsi obsoleto.
Usiamo il pacchetto di Ondrej Sury per avere un PHP 5.6 funzionante
Invece di fare pezzo a pezzo l'installazione, prepariamo un file di script da incollare in nano per far installare il sistema automaticamente:
nano php56.sh
ed incollare il seguente codice
#!/bin/bash
## Install Debian/Ubuntu
## https://think.unblog.ch/en/multiple-php-fpm-versions-with-apache-on-debian-12/
## https://tecadmin.net/how-to-install-php-on-debian-11/
## https://shape.host/resources/how-to-install-multiple-versions-of-php-on-debian-with-ispconfig
## installiamo wget
apt install -y lsb-release apt-transport-https ca-certificates wget gnupg
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update
## PHP 5.6
apt install -y php5.6 php5.6-cli php5.6-cgi php5.6-gd php5.6-mysql php5.6-imap
apt install -y php5.6-curl php5.6-intl php5.6-pspell php5.6-recode php5.6-sqlite3 php5.6-tidy
apt install -y php5.6-xmlrpc php5.6-xsl php5.6-zip php5.6-mbstring php5.6-soap
apt install -y php5.6-opcache libicu72 php5.6-common php5.6-json php5.6-readline php5.6-xml
sudo apt install-y libapache2-mod-php5.6
salvare e dare i permessi 755 al file (chmod 755 php56.sh) e poi farlo partire nel seguente modo:
./php56.sh
Se andiamo a creare nella cartella di default /var/www/html creiamo con nano il file ver.php con il seguente codice, possiamo verificare sia il server apache che la versione di php
nano ver.php
dentro copiare
<?php
phpinfo();
?>
A questo punto facciamo un test:
Ovviamente il nome a dominio è del tutto arbitrario e punta ad un indirizzo IP di macchina del Server Aruba che stiamo usando
### PHP 7.4
Fatto il PHP 5.6, ora concentriamoci sulla versione intermedia, la 7.4, anche questa non più supportata, ma ancora in uso largamente:
Installiamo la versione di PHP 7.4, con il seguente script
nano php74.sh
e dentro incolliamo il seguente script
#!/bin/bash
## PHP 7.4
apt install php7.4 php7.4-cli php7.4-cgi php7.4-gd php7.4-mysql php7.4-imap
apt install php7.4-curl php7.4-intl php7.4-pspell php7.4-recode php7.4-sqlite3 php7.4-tidy
apt install php7.4-xmlrpc php7.4-xsl php7.4-zip php7.4-mbstring php7.4-soap
apt install php7.4-opcache libicu72 php7.4-common php7.4-json php7.4-readline php7.4-xml
sudo apt install libapache2-mod-php7.4
salvare e dare i permessi 755 al file (chmod 755 php74.sh) e poi farlo partire nel seguente modo:
./php74.sh
In questo momento il sistema ha al suo interno attivo l'ultima versione di PHP che abbiamo installato
### PHP 8.2
Installiamo ora l'ultima versione di PHP 8.2, poiché è l'ultima stabile.
Al momento in cui scrivo (29-10-2024) sono state rilasciate le versioni 8.3 (grossomodo stabile) e 8.4 RC4.
Le differenze, come al solito sono relativamente poche, ma una versione più "stabile" è sempre preferibile ad una meno stabile (poi dipende da cosa fare)
Come nei casi precedenti, facciamo lo script per caricare i moduli di PHP 8.2
nano php82.sh
e dentro incolliamo il seguente script
#!/bin/bash
## PHP 8.2
apt install php8.2 php8.2-cli php8.2-cgi php8.2-gd php8.2-mysql php8.2-imap
apt install php8.2-curl php8.2-intl php8.2-pspell php8.2-recode php8.2-sqlite3 php8.2-tidy
apt install php8.2-xmlrpc php8.2-xsl php8.2-zip php8.2-mbstring php8.2-soap
apt install php8.2-opcache libicu72 php8.2-common php8.2-json php8.2-readline php8.2-xml
sudo apt install libapache2-mod-php8.2
salvare e dare i permessi 755 al file (chmod 755 php82.sh) e poi farlo partire nel seguente modo
./php82.sh
### Installiamo le FastCGI Process Manager (FPM) per la gestione parallela
Fatto i tre script che caricano automaticamente i tre tipi di PHP, a questo punto carichiamo gli FPM che li possono gestire in parallelo:
sudo apt update
sudo apt install -y php5.6-fpm php7.4-fpm php8.2-fpm
Questa operazione ci consentirà di attivare i scoket dei tre sistemi di PHP, che è possibile verificare con il seguente comando:
ls -l /run/php/*.sock
A questo punto vediamo quali moduli apache-php sono attivi (non gli FPM) e disabilitiamoli.
Usiamo il seguente comando per verificare i moduli attivi:
apache2ctl -M | grep php
In questa schermata ci sono due indicazioni:
Could not reliably determine the server's fully qualified domain name, using 127.0.0.1.
Set the 'ServerName' directive globally to suppress this message
significa che in /etc/apache2/apache2.conf (o in un suo include) non è stato definito un ServerName di default per l’intero server. Di conseguenza Apache si “auto‑assegna” 127.0.0.1 come nome di host.
La seconda indicazione è che il modulo mod_php per PHP 5 è attualmente caricato in Apache.
Visto che abbiamo installato i moduli FPM, dobbiamo necessariamente disabilitare questo modulo con il comando:
sudo a2dismod php5.6
Attiviamo il proxu FPM:
sudo a2enmod proxy proxy_fcgi setenvif
e dopo dobbiamo riavviare apache2 con il seguente comando:
sudo systemctl reload apache2
Ovviamente se esistono (improbabile) altri mod apache php attivi, per disabilitarli si usa la stessa sintassi mettendo la versione attiva (es. sudo a2dismod php7.4, ecc.) e poi si ricarica apache
### Virtual Host con PHP personalizzati
Ora che abbiamo installato tutte le versioni che ci interessano di PHP sul nostro server.
Andiamo nella cartella /etc/apache2/sites-available/ e costruiamo i nostri Virtual Host
In questo esempio, uso dei domini reali che ho in portafoglio mio: php56.dec.pw, php74.dec.pw e php82.dec.pw
Quindi, creiamo i file con nano:
### Virtual Host PHP 5.6
nano /etc/apache2/sites-available/php56.dec.pw.conf
e copiamo il seguente testo:
<VirtualHost *:80>
ServerName php56.dec.pw
DocumentRoot /var/www/php56
<Directory /var/www/php56>
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
# punta al socket di PHP 5.6-FPM
SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/php5_error.log
CustomLog ${APACHE_LOG_DIR}/php5_access.log combined
</VirtualHost>
ErrorLog ${APACHE_LOG_DIR}/sito1_error.log
CustomLog ${APACHE_LOG_DIR}/sito1_access.log combined
</VirtualHost>
### Virtual Host PHP 7.4
nano /etc/apache2/sites-available/php74.dec.pw.conf
analogamente al testo della 5.6, copiamo il seguente testo nel file di configurazione
<VirtualHost *:80>
ServerName php74.dec.pw
DocumentRoot /var/www/php74
<Directory /var/www/php74>
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
# punta al socket di PHP 7.4‑FPM
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/php7_error.log
CustomLog ${APACHE_LOG_DIR}/php7_access.log combined
</VirtualHost>
### Virtual Host PHP 8.2
Come detto in precedenza, usiamo il dominio php82.dec.pw, ma intendiamo PHP 8.2
nano /etc/apache2/sites-available/php82.dec.pw.conf
analogamente al testo della 5.6 e 7.4, copiamo il seguente testo nel file di configurazione
<VirtualHost *:80>
ServerName php82.dec.pw
DocumentRoot /var/www/php82
<Directory /var/www/php82>
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
# punta al socket di PHP 8.2‑FPM
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/php8_error.log
CustomLog ${APACHE_LOG_DIR}/php8_access.log combined
</VirtualHost>
mkdir /var/www/php56
mkdir /var/www/php74
mkdir /var/www/php82
Queste sono le directory personalizzate e dentro copiamo il file ver.php che avevamo visto all'inizio, rendendolo da ver.php a index.php
cp /var/www/html/ver.php /var/www/php56/index.php
cp /var/www/html/ver.php /var/www/php74/index.php
cp /var/www/html/ver.php /var/www/php82/index.php
Il fatto stesso che possa includere anche PHP 5.6 consente agli sviluppatori di poter effettuare upgrade di programmi in modo graduale contenendo i costi senza perdere funzionalità acquisite per programmi già scritti.
Inoltre essendo compatibile con Debian/Ubuntu l'aggiornabilità del sistema dovrebbe essere più garantita rispetto al compianto CentOS 7, che nelle sue versioni successive non è riuscito a mantenere quella compatibilità e funzionalità con RHEL che ne hanno decretato il successo.
Commenti