Installare mod_fcgid con apache2 in CentOS GNU/Linux
Di default il web server apache esegue gli script php di un sito con l’utente “www-data”. Per permettere ad uno script di memorizzare dati all’interno di una directory, allora i permessi di quest’ultima devono essere settati a 777 oppure il proprietario della cartella deve essere l’utente “www-data”. In questo caso, se sul vostro server web e’ attivo piu’ di un sito internet, allora uno script di un dominio potrebbe modificare i dati di un’altro. Come fare per ovviare a questo problema? Eseguendo gli script di ogni sito con un utente distinto installando la suexec, mod_fcgid ed utilizzando il php in modalita’ cgi. Piu’ difficile a dirsi che a farsi, bastano difatti pochi comandi e qualche minuto per configurare il tutto:
1) Occorre disabilitare SELinux
setenforce 0
Editare il file /etc/selinux/config ed impostare SELINUX a ‘disable’
SELINUX=disabled
2) Installare mod_fcgid. Questo modulo non e’ disponibile nel repository ufficiale di CentOS ma possiamo prelevarlo da un’altra fonte
cd /etc/yum.repos.d/
wget http://centos.karan.org/kbsingh-CentOS-Extras.repo
Editare /etc/yum.repos.d/kbsingh-CentOS-Extras.repo ed impostare gpgcheck a 0 ed enabled a 1 nella sezione [kbs-CentOS-Testing]:
[...]
[kbs-CentOS-Testing]
gpgcheck=0
enabled=1
[..]
Eseguire adesso questo comando
yum install mod_fcgid
4)
Commentare tutte le righe del file /etc/httpd/conf.d/php.conf (per evitare che il php venga caricato come modulo), anteponendo il carattere # ad inizio riga
5)
Adesso dovremo forzare il PHP a correggere il percorso del cgi in modo conforme alle specifiche PATH_INFO/PATH_TRANSLATED. Bastera’ aggiungere nel php.ini (/etc/php.ini) questa direttiva:
cgi.fix_pathinfo = 1
6) Creiamo l’utente con cui dovranno essere eseguiti gli script del sito
groupadd sito1
useradd -s /bin/false -d /var/www/sito1 -m -g web1 web1
chmod 755 /var/www/sito1
7) Creiamo la cartella che dovra’ ospitare i file del sito
mkdir -p /var/www/sito1/htdocs
chown sito1:sito1 /var/www/sito1/htdocs
Creiamo il wrapper che utilizzeremo per avviare il php e configurare mod-fcgid:
mkdir -p /var/www/fcgid-conf-sito1
9) Inseriamo queste righe nel file /var/www/fcgid-conf-sito1/sito1.conf
#!/bin/sh
export PHPRC=/etc/
export PHP_FCGI_MAX_REQUESTS=400
export PHP_FCGI_CHILDREN=2
exec /usr/bin/php-cgi
PHPRC,PHP_FCGI_MAX_REQUESTS e PHP_FCGI_CHILDREN sono opzionali e se verranno omessi sara’ impostato il valore di default. Sono utili per poter indicare il percorso del php.ini, permettendo cosi’ di utilizzare una configurazione diversa da sito a sito, oppure per definire il numero di child per processo ed il numero di richieste che puo’ gestire prima di terminare.
10) Impostiamo i corretti permessi/proprietario
chmod 755 /var/www/fcgid-conf-sito1/sito1.conf
chown -R sito1:sito1 /var/www/fcgid-conf-sito1
11) Creiamo in /etc/httpd/conf/httpd.conf la configurazione del sito
<VirtualHost *:80>
ServerName www.sito1.it
ServerAdmin postmaster@sito1.it
DocumentRoot /var/www/sito1/htdocs/<IfModule mod_fcgid.c>
SuexecUserGroup sito1 sito1
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/sito1/htdocs/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/fcgid-conf-sito1/sito1.conf .php
Order allow,deny
Allow from all
</Directory>
</IfModule># ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off</VirtualHost>
12) Salvare il file e riavviare il web server
/etc/init.d/httpd restart



Ho provato questa guida su Red Hat Enterprise Linux Server release 6.1 scaricando il pacchetto mod_fcgid da http://rpm.pbone.net/ ed ha funzionato senza troppi problemi.
Grazie per l’ottima guida.