Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Istanze multiple di Apache con PHP 4 e PHP 5

PHP 4, non più ufficiale dal 31 dicembre, può convivere con PHP 5 utilizzando due istanze di Apache. Ecco come testare il nuovo PHP 5 senza rinunciare al vecchio motore di scripting
PHP 4, non più ufficiale dal 31 dicembre, può convivere con PHP 5 utilizzando due istanze di Apache. Ecco come testare il nuovo PHP 5 senza rinunciare al vecchio motore di scripting
Link copiato negli appunti

Nel precedente articolo, prendendo le mosse dalla "End of Life" di PHP4 (31 dicembre 2007), avevamo visto come fosse possibile disporre contemporaneamente di entrambe le versioni del linguaggio sulla medesima macchina. Ciò permette di far convivere applicazioni aggiornate ed applicazioni ancora incompatibili con la più recente versione 5. La soluzione scelta consisteva nel configurare Apache e PHP in modo tale che PHP5 girasse come modulo del web server, mentre PHP4 come CGI/FastCGI.

Avevamo anche accennato al fatto che non vi è un'unica soluzione per conseguire tale obbiettivo, quella presentata aveva il vantaggio di essere relativamente semplice da implementare e poco invasiva rispetto alla configurazione di partenza.

In queste pagine affronteremo il problema da una prospettiva diversa: ottenere più istanze di Apache contemporaneamente attive sulla nostra macchina a partire dalla medesima installazione. Basterà che la prima carichi come modulo PHP5 mentre la seconda PHP4 ed il gioco è fatto. L'idea risulta semplicissima, meno immediato sarà realizzarla, dato che Apache è strutturato proprio per evitare che il demone httpd sia lanciato più volte.

Due istanze di Apache sulla nostra macchina

Le spiegazioni che seguono fanno riferimento ad una linux box con Fedora 7 sulla quale siano già installati da pacchetti precompilati Apache 2.2.6 e PHP 5.2.2. Sebbene i concetti siano esattamente i medesimi, dovrete adattare le indicazioni ai path d'installazione ed eventualmente ai nomi di file usati dalla vostra distribuzione.

Il punto cardine sarà eseguire il binario di Apache due volte a partire da un diverso file di configurazione evitando conflitti tra le due istanze. Cominciamo subito con il notare che ci troveremmo con due demoni in ascolto sulla medesima porta 80, cosa impossibile a meno di non disporre di due distinti indirizzi IP. Di seguito supporremo di trovarci in tale situazione, in caso contrario dovremmo ricorrere ad una seconda porta, ad esempio la 8080. Negli esempi rappresenteremo con 11.22.33.44 e 55.66.77.88 i due numeri IP.

Altro problema è rappresentato dal pid file nel quale Apache memorizza l'identificatore univoco del processo, process id, e che dovrà essere distinto per ogni istanza.

Cominciamo con il copiare il file di configurazione httpd.conf, nel nostro caso posizionato in /etc/httpd/conf, rinominandolo httpdPHP4.conf. Questo secondo file ci permetterà di distinguere l'istanza che utilizza come modulo PHP4 da quella che utilizza PHP5. Modifichiamo le direttive del file appena creato nel seguente modo:

PidFile run/httpdPHP4.pid
Listen 55.66.77.88:80

Ricordiamoci inoltre di modificare la seconda direttiva anche in httpd.conf specificando l'indirizzo IP accanto alla porta:

Listen 11.22.33.44:80

Per rendere più agevole la consultazione dei file di log, specie in caso di problemi, conviene distinguere anche questi modificando httpdPHP4.conf così:

ErrorLog logs/errorPHP4_log
CustomLog logs/accessPHP4_log

Fermo restando che quando si creeranno gli host virtuali sarà bene definire log file distinti per ciascuno di essi.

Nel file di configurazione httpd.conf (ed al momento anche in httpdPHP4.conf) è presente la direttiva:

Include conf.d/*.conf

Il cui scopo è includere all'interno del file principale porzioni di configurazione che possano essere facilmente attivate o disattivate semplicemente inserendo o cancellando dalla directory /etc/httpd/conf.d il corrispondente file. Qui possono nascere conflitti tra le due istanze. Nel mio caso i file problematici sono php.conf e ssl.conf: il primo deve caricare il modulo corretto PHP5 o PHP4, il secondo deve riportare l'indirizzo IP corretto accanto alla porta di ascolto 443. La soluzione più semplice e veloce risulta duplicare la directory conf.d chiamandola confPHP4.d modificando la direttiva di inclusione in httpdPHP4.conf:

Include confPHP4.d/*.conf

Andremo poi a personalizzare i file di configurazione necessari. Accontentiamoci di procedere così anche se sarebbe più corretto mantenere un'unica directory per le configurazioni comuni caricando con altra modalità solo quelle che differiscono. Di seguito prenderemo in considerazione solo le direttive presenti in php.conf che riguardano direttamente il tema dell'articolo. A questo punto occupiamoci di PHP4 al momento non ancora presente sulla nostra macchina.

Installiamo PHP4

Come nel precedente articolo dovremo procedere alla compilazione di PHP4 a partire dalla tarball php-4.4.7.tar.gz scaricata dal sito ufficiale. Rimando al citato articolo per le operazioni precedenti la fase d'installazione vera e propria il cui scopo principale è creare una struttura che permetta di distinguere le versioni installate. Consideriamo di trovarci già pronti alla fase di configurazione. Le direttive vanno scritte tutte su un unico rigo:

[root]# ./configure --libdir=/usr/lib/php4 
  --with-exec-dir=/usr/lib/php4/libexec/ 
  --with-config-file-path=/etc/php4/ 
  --includedir=/usr/include/php4/ 
  --program-suffix=4 
  --with-zlib --disable-cgi 
  --disable-cli 
  --with-apxs2=/usr/sbin/apxs

Oltre alle prime direttive che precisano quale sarà il posizionamento dei file installati, già descritte in precedenza, compaiono --disable-cgi e --disable-cli con cui ho scelto di non installare la versione CGI e la versione da riga di comando di PHP4. Mentre --with-apxs2=/usr/sbin/apxs fa riferimento all'installazione del linguaggio come modulo dinamico di Apache, Dynamic Shared Object. Mi sono limitato a riportare solo le direttive di configurazione strettamente inerenti l'argomento, dovrete però installare anche tutte le altre componenti utili al corretto funzionamento dei vostri script.

Proseguiamo con il make && make install per terminare l'operazione. Controllate sempre l'output di ciascun comando per eventuali errori.

Se apriamo ora l'httpd.conf troveremo probabilmente l'aggiunta della seguente riga di configurazione:

LoadModule php4_module        /usr/lib/httpd/modules/libphp4.so

Rimuoviamola in quanto sarà destinata al secondo file di configurazione httpPHP4.conf. Verifichiamo che in /usr/lib/httpd/modules sia effettivamente presente il file libphp4.so generato dalla precedente installazione. Modifichiamo il file php.conf presente in /etc/httpd/confPHP4.d in modo che siano presenti le seguenti direttive:

LoadModule php4_module       /usr/lib/httpd/modules/libphp4.so

AddHandler php-script .php
AddType text/html .php

DirectoryIndex index.php

L'omologo file presente in /etc/httpd/conf.d riporta le direttive per PHP5:

LoadModule php5_module modules/libphp5.so

AddHandler php5-script .php
AddType text/html .php

DirectoryIndex index.php

Bene, non ci resta che un ultimo passo: mettere contemporaneamente in esecuzione le due istanze di Apache.

Attiviamo le due istanze di Apache

Per eseguire lo start e lo stop del web server si può (e comunemente direttamente o indirettamente lo si fa) utilizzare lo script apachectl. Tale script esegue alcuni controlli prima di lanciare o bloccare il demone httpd. All'avvio viene utilizzato di default il file di configurazione httpd.conf, ma, per nostra fortuna, risulta possibile indicarne uno diverso con l'opzione -f.

Posizioniamoci in /usr/sbin/ dove nel nostro caso si trova apachectl, copiamo tale file rinominandolo apachectlPHP4. Editiamo il file appena creato in modo da specificare come file di configurazione httpdPHP4.conf. Per farlo dobbiamo individuare la riga che inizia con HTTPD e modificarla come segue:

HTTPD: '/usr/sbin/httpd -f /etc/httpd/conf/httpdPHP4.conf'

Proviamo la configurazione con:

[root]# apachectlPHP4 configtest

Se ci sono errori dovremo provvedere ad aggiustare di conseguenza i file di configurazione. Se invece tutto è sintatticamente corretto, lanciamo la prima istanza di apache o rilanciamola se è già in esecuzione (potremmo anche usare direttamente apachectl):

[root]# service httpd start

Ed ora è il momento della verità, lanciamo la seconda istanza:

[root]# apachectlPHP4 start

Se non si manifestano problemi in fase d'avvio verifichiamo le connessioni con netstat:

[root]# netstat -tanp | grep httpd
tcp   0   0 11.22.33.44:80   0.0.0.0:*    LISTEN   3238/httpd         
tcp   0   0 55.66.77.88:80   0.0.0.0:*    LISTEN   3181/httpd 

Una risposta simile alla precedente ci mostra le due istanze attive ed in ascolto sulla porta 80. L'ultimo passaggio è la creazione degli host virtuali.

Configuriamo due host virtuali

Per terminare il test relativamente a PHP, come nel precedente articolo, creiamo due host virtuali php5.mioserver.it e php4.mioserver.it modificando httpd.conf in maniera simile a questa:

NameVirtualHost 11.22.33.44:80 

<VirtualHost 11.22.33.44:80>  
ServerName php5.mioserver.it
DocumentRoot /var/www/html/php5
DirectoryIndex index.php index.html index.htm 
.....................
</VirtualHost>

e httpdPHP4.conf in maniera simile a questa:

NameVirtualHost 55.66.77.88:80 

<VirtualHost 55.66.77.88:80>  
ServerName php4.mioserver.it
DocumentRoot /var/www/html/php4
DirectoryIndex index.php index.html index.htm 
.....................
</VirtualHost>

Creiamo il file index.php contenente l'istruzione:

<? phpinfo() ?>

e copiamolo nelle rispettive Document Root /var/www/html/php4 e /var/www/html/php5. Facciamo ripartire entrambe le istanze di Apache perché rileggano i file di configurazione.

Ora puntiamo il nostro browser su http://php4.miosito.it e, se tutto funziona correttamente, otterremo la pagina informativa di PHP Versione 4.4.7. Se digitiamo http://php5.miosito.it dovremmo ottenere la pagina informativa di PHP Versione 5.2.2. In entrambi i casi la voce "Server Api" riporterà Apache 2.0 Handler. Se scorriamo la pagina fino all'indicazione "Loaded Configuration File" leggeremo /etc/php4/php.ini per PHP4 mentre /etc/php.ini nel caso di PHP5. Questo ci conforta assicurandoci nei due casi l'uso di file di configurazione distinti.

Conclusioni

Ci fermiamo qui, anche se sarebbero possibili ulteriori approfondimenti, ad esempio sull'adozione di un unico file di configurazione per Apache, utilizzando mod_macro per distinguere quali direttive siano peculiari di un'istanza e quali dell'altra. Un altro spunto di discussione potrebbe venire dall'indisponibilità di due numeri IP con conseguente necessità di dedicare una porta diversa dall'80 ad una delle istanze. In tal caso si potrebbe ricorrere a mod_proxy per nascondere ai navigatori l'utilizzo di una porta non standard.

Lascio a voi perfezionare il tutto con script di avvio automatizzati ed altri dettagli simili, ricordando che queste configurazioni sono state provate solo su macchine di sviluppo il che significa che dovrete moltiplicare i test nel caso vogliate passare a macchine di produzione.

Un'ultima considerazione prima di chiudere: quanto abbiamo visto fornisce i presupposti anche per utilizzare più installazioni di Apache sulla medesima macchina, ottimo sistema per testare diverse versioni del nostro web server.

Ti consigliamo anche