PHP FastCGI Process Manager con CentOS 6

Con Apache gli script PHP possono essere interpretati essenzialmente in due modi: attraverso un modulo apposito (mod_php) o richiamando l’interprete PHP con FastCGI.

In molti casi si utilizza mod_php perché è l’opzione di default preconfigurata, ma ci sono delle alternative, con vantaggi e svantaggi che vanno valutati con attenzione.

mod_php è in genere (ma anche qui ci potrebbero essere eccezioni) più veloce e permette di personalizzare alcune direttive di configurazione all’interno del file .htacess; il rovescio della medaglia è che l’interprete PHP viene caricato assieme ad ogni istanza di Apache, anche quando non serve perché viene richiesto un file di testo o un file con un’immagine, e viene eseguito nel suo stesso contesto di sicurezza.

Utilizzando FastCGI il codice eseguito dall’interprete PHP è completamente separato da quello del web server, quindi si può definire un contesto di sicurezza differente da quello utilizzato dal server e l’interprete viene eseguito solamente quando è necessario. Nel 2012 è stata scoperta una vulnerabilità di PHP eseguito via CGI tale per cui richiamando una pagina mettendo nell’URL ?-s (esempio: http://www.example.com/index.php?-s) viene visualizzato il sorgente dello script al posto del risultato. Il baco è stato corretto, ma vale la pena di eseguire un test se si passa da mod_php a FastCGI.

Dalla versione 5.3 PHP ha introdotto FastCGI Process Manager (FPM), una tecnologia per demonizzare l’interprete PHP e richiamarlo da server HTTP differenti anche, volendo, da host diversi. FPM crea uno o più pool di server, ciascuno con un proprio contesto di sicurezza e una propria configurazione, in questo modo il numero di worker che interpretano il codice PHP può essere diverso dai worker del server HTTP.

Vediamo come passare da mod_php a FPM su un’installazione CentOS 6.

La prima migrazione va fatta su un server di sviluppo o di test, per poter avere dati sufficienti ed esperienza per ripetere la procedura in produzione.

Si parte bloccando Apache con

service httpd stop

Installare quindi i pacchetti necessari

yum install php-fpm mod_fastcgi

Disabilitare mod_php commentando tutto quello che c’è in /etc/httpd/conf.d/php.conf

Verificare che in /etc/php.ini il parametro cgi.fix_pathinfo sia commentato (default) o valga 1.

Abilitare l’avvio automatico di PFM con

chkconfig php-fpm on

Editare /etc/php-fpm.conf e verificare che il parametro daemonize sia yes. I valori di /etc/php-fpm.d/www.conf sono adatti per il primo test, da qui possono essere creati altri pool o si può modificare quello esistente.

Avviare il servizio di PFM con

service php-fpm start

e verificare che /var/log/php-pfm/error.log non riporti problemi.

Verificare che esista la directory /var/www/cgi-bin

Modificare /etc/httpd/conf.d/fastcgi.conf e impostare il parametro FastCgiWrapper a Off; se viene lasciato On Apache darà un errore 500 quando si carica un file PHP. Nel medesimo file (o altrove, come si preferisce) aggiungere queste righe:

DirectoryIndex index.html index.shtml index.cgi index.php
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /var/www/cgi-bin/php5-fcgi
FastCgiExternalServer /var/www/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization

È corretto che il file php5-fcgi non esista.

Avviare il server Apache e verificare che tutto funzioni.

Prima di portare le modifiche in produzione è necessario esaminare i file .htaccess per controllare che non contengano direttive di configurazione PHP, in quanto, oltre a non funzionare, provocherebbero un errore 500 nel momento in cui viene richiesto un file del sito a cui fanno riferimento.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento