Istanze Multiple Apache e PHP su Ubuntu

Istanze Multiple Apache php

Istanze Multiple Apache e PHP su Ubuntu

Istanze Multiple di Apache e configurazione con versioni differenti di PHP

In questo tutorial vedremo come  installare istanze multiple di Apache con versioni differenti di PHP  (nel nostro caso PHP5.6 e PHP7). Questo ci permetterà di usare le due versioni di PHP senza dover cambiare ogni volta la versione assegnata al server. Per prima cosa installiamo apache2 dai repository ufficiali di Ubuntu e verifichiamo lo stato del server

Installazione di Apache su Ubuntu

sudo apt-get install apache2

sudo systemctl status apache2

apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (exited) since mer 2018-01-03 11:15:53 CET; 1h 20min ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0
   Memory: 0B
      CPU: 0

gen 03 12:27:08 laptop systemd[1]: Started LSB: Apache2 web server.

Installazione di PHP su Ubuntu

Ora installiamo le versioni di php che dovranno essere condivise su Apache2 che nel nostro caso saranno php5.6 e php7.1. Attualmente la versione di default su Ubuntu 16.04 è php7.1 ma possiamo anche installare la versione php7.2. Aggiungiamo i repositori ondrej per avere a disposizione tutte le versioni di php supportate

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

Installiamo PHP 7.1 e PHP 5.6 su Ubuntu

sudo apt-get install php7.1 php7.1-curl php7.1-common php7.1-mysql php7.1-gd php7.1-json php7.1-zip php7.1-mbstring php7.1-xml php7.1-cli php7.1-mcrypt php7.1-soap php7.1-xmlrpc

Installiamo anche la versione php5.6 cosi da averle entrambe sullo stessa macchina

sudo apt-get install php5.6 php5.6-curl php5.6-common php5.6-mysql php5.6-gd php5.6-json php5.6-zip php5.6-mbstring php5.6-xml php5.6-cli php5.6-mcrypt php5.6-soap php5.6-xmlrpc

Ed infine installiamo alcuni moduli per Apache e Mysql (assumendo che Mysql sia già installato sulla macchina)

sudo apt-get install libapache2-mod-php php-pear libmcrypt-dev mcrypt

Aggiungiamo il file info.php alla root di apache2 che su Ubuntu si trova su /var/www/html col seguente codice

<?php  phpinfo();?>

Visualizziamo l’indirizzo http://localhost/info.php e dalla seguente schermata possiamo verificare che la versione di php utilizzata da Apache è la versione 7.1

Apache-php7.1-info

Ora se volessimo cambiare la versione di php usata da Apache2 dovremmo eseguire i seguenti comandi

sudo a2dismod php7.1
sudo a2enmod php5.6
sudo service apache2 restart
sudo a2dismod php5.6
sudo a2enmod php7.1
sudo service apache2 restart

Come potete vedere dalla schermata di info.php la versione utilizzata da Apache2 ora è cambiata in php5.6

 

Attenzione questa modifica cambia solo la versione di php utilizzata da Apache e non la versione di default utilizzata da Ubuntu (per esempio quella utilizzata dalla shell) infatti se digitiamo:

php -v
PHP 7.1.12-3+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Dec 14 2017 15:37:13) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.12-3+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2017, by Zend Technologies

Per cambiare anche la versione di default nella shell dobbiamo digitare il seguente comando (per la shell basta solo il primo) :

sudo update-alternatives --set php /usr/bin/php7.1
sudo update-alternatives --set phar /usr/bin/phar7.1
sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.1
sudo update-alternatives --set phpize /usr/bin/phpize7.1
sudo update-alternatives --set php-config /usr/bin/php-config7.1
sudo update-alternatives --set php /usr/bin/php5.6
sudo update-alternatives --set phar /usr/bin/phar5.6
sudo update-alternatives --set phar.phar /usr/bin/phar.phar5.6 
sudo update-alternatives --set phpize /usr/bin/phpize5.6
sudo update-alternatives --set php-config /usr/bin/php-config5.6

Istanze Multiple Apache e PHP – Configurazione

Ora vediamo come configurare Apache2 per utilizzare più versione di php senza dover ogni volta cambiare la configurazione tramite linea di comando. La soluzione è di avere più istanze di Apache una per ogni modulo php utilizzato, nel nostro caso due; una per la versione di PHP7.1 che ricordiamo essere attualmente la versione di default di Ubuntu 16.04, sulle porte 80 e 443 rispettivamente http e https, mentre la versione PHP5.6 sarà disponibile sulle porte 81 e 444 (controllate se le porte sono utilizzate da altre applicazioni, potete settare qualunque porta disponibile). Le istruzioni sono riportate nella documentazione di Apache visualizzabile al seguente percorso: /usr/share/doc/apache2/README.multiple-instances

Eseguiamo lo script setup-instancecontenuto nella directory /usr/share/doc/apache2/examples aggiungendo il suffisso php5.6 Tutti i comandi per la seconda istanza avranno questo suffisso e si manterrà la stessa configurazione per tutti i siti della nuova istanza compresi certificati SSL, altri host virtuali etc.

cd /usr/share/doc/apache2/examples
sudo chmod +x setup-instance
sudo ./setup-instance php5.6

Questo script crea diversi file, directory e symlink come potete osservare dal seguente output (la cartella che ci interessa e apache2-php5.6 che si trova in /etc)

Setting up /etc/apache2-php5.6 ...
Setting up /etc/init.d/apache2-php5.6 ...
Setting up symlinks: a2enmod-php5.6 a2dismod-php5.6 a2ensite-php5.6 a2dissite-php5.6 a2enconf-php5.6 a2disconf-php5.6 apache2ctl-php5.6
Setting up /etc/logrotate.d/apache2-php5.6 and /var/log/apache2-php5.6 ...

Ora tutte le configurazioni di php su apache andranno fatte in questa cartella. Disabilitiamo php7.1 sulla nuova istanza di Apache e disabilitiamo alcuni moduli che potrebbero andare in conflitto (questo dipende dai moduli installati sulla vostra macchina, disabilitate tutti quelli che potrebbero andare in conflitto come php7.1-fpm etc.) con i seguenti comandi:

sudo a2dismod-php5.6 php7.1
sudo a2enmod-php5.6 php5.6
sudo a2dismod-php5.6 proxy_fcgi
sudo a2dismod php5.6

Come vediamo l’ultimo comando disabilita php5.6 sull’istanza di default infatti non abbiamo utilizzato il suffisso php5.6.

Settiamo le porte differenti per la nuova Istanza di Apache

Dopo esserci assicurati che le porte 81 e 444 non siano utilizzate da altre applicazioni configuriamo le nuove porte sulla nuova istanza di apache2-5.6 modificando il file port.confin /etc/apache2-php5.6cambiando le porte 80 e 443 con quelle che si vogliono utilizzare (nel mio caso ho scelto 81 e 444). In /etc/apache2-php5.6/sites-available/modificare i file 000-default.conf, default-ssl.conf e qualsiasi altro file di configurazione dei siti utilizzati dal webserver che si vogliono far girare su questa istanza cambiando i numeri di porta da 80/443 a 81/444.

Ora, anche se il nuovo servizio è stato installato dobbiamo comunicare ad ubuntu come far avviare il servizio aggiungendolo nel runlevel col seguente comando

sudo update-rc.d apache2-php5.6 defaults

Finito!!! Ora possiamo lanciare entrambi i servizi con i comandi

sudo /etc/init.d/apache2-php5.6 restart
sudo service apache2-php5.6 restart

sudo /etc/init.d/apache2 restart
sudo service apache2 restart

e verificare che in http://localhost/info.phphttp://localhost:81/info.php siano installate le due versioni di php. Possiamo anche modificare la cartella di default (dovrebbe essere /var/www/html) per entrambi in modo da mettere i progetti che usano php7.1 in una cartella e php5.6 in un’altra.

Pasquale Guarino

pasquale.guarino80@gmail.com