Qualche tempo fa mi è arrivata una richiesta da un cliente di poter vedere a video i messaggi d’errore di PHP. Questa è sicuramente una cosa da evitare su un server di hosting pubblico, perché svela al potenziale hacker errori nel nostro codice che potrebbe utilizzare a proprio vantaggio.
Plesk 9.x e FastCGI
Plesk 9 permette l’esecuzione di PHP in modalità “classica”, come modulo di apache, oppure come processo separato CGI/FastCGI. Quest’ultima modalità presenta una serie di vantaggi, non ultimo quello di eseguire gli script php impersonando l’utente ftp legato al dominio invece dell’utente del server web, semplificando quindi tutta la gestione dei permessi file.
Il problema
Quindi tutto bene? Insomma, non proprio, almeno per quanto riguarda le installazioni basate su CentOs 5.x. I problemi iniziano quando è necessario definire delle direttive personalizzate di php.ini per diversi siti. Plesk suggerisce di inserire le direttive nel file /var/www/vhosts//conf/vhost.conf e questo funziona, ma solo quando si utilizza PHP con mod_php. Nel caso di utilizzo tramite CGI queste direttive “php_admin_value” vengono ignorate.
La Soluzione
Dopo varie ricerche ho trovato questa soluzione, che permette di creare un php.ini personalizzato per i domini che ne hanno necessità. Non è molto elegante e integrato nel pannello, ma funziona. In pratica si tratta di sostituire il wrapper in modo da utilizzare, se esiste, un php.ini personalizzato nella cartella del singolo dominio.
L’articolo di Parallels che ne parla è questo.
In caso non fosse disponibile per il download il codice del wrapper è il seguente:
#!/bin/sh domain=`fgrep -m 1 "$UID" /etc/passwd| awk -F\: '{print $6}' |awk -F"/" '{print $5}'` PHPRC=/var/www/vhosts/$domain/conf/php.ini [ -f ${PHPRC} ] || PHPRC="/etc/php.ini" export PHPRC exec /usr/bin/php-cgi -c "$PHPRC"
Passo per passo
1. Download del wrapper
# wget http://kb.parallels.com/Attachments/13985/Attachments/cgi_wrapper
2. Individuare la posizione del file da sostituire
# cat /etc/psa/psa.conf |grep CGI_PHP
CGI_PHP_BIN /var/www/cgi-bin/cgi_wrapper/cgi_wrapper
3. Creare un backup del file originale
# cp /var/www/cgi-bin/cgi_wrapper/cgi_wrapper /var/www/cgi-bin/cgi_wrapper/cgi_wrapper_orig
4. Sostituire il cgi_wrapper con quello appena scaricato
# cp cgi_wrapper /var/www/cgi-bin/cgi_wrapper/cgi_wrapper
A questo punto, nel caso un dominio necessiti di una configurazione personalizzata occorre agire in questo modo:
1. Copiare php.ini nella cartella di configurazione del dominio.
# cp php.ini /var/www/vhosts/domain.tld/conf/
2. Cambiare i permessi alla directory di configurazione
# chmod 0755 /var/www/vhosts/domain.tld/conf
3. Modificare il php.ini
# joe /var/www/vhosts/domain.tld/conf/php.ini
4. Riavviare apache
# /etc/init.d/httpd restart
Dopo questa modifica il domino utilizzerà la configurazione nel php.ini posizionato nella propria directory.
SET