Installare la suexec e mod_fcgid con apache2 in Debian Lenny

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) Innanzitutto e' necessario installare la suexec, il modulo fcgid ed il
php come cgi:

apt-get install apache2-suexec libapache2-mod-fcgid php5-cgi

2) Abilitiamo questi due moduli:

a2enmod suexec
a2enmod fcgid

3) 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/php5/cgi/php.ini) questa direttiva:

cgi.fix_pathinfo = 1

4)Andiamo a creare l'utente proprietario del sito:

adduser utente-sito

5) Creiamo le directory che conterra' il sito web ed impostiamo su essa il
corretto proprietario:

mkdir -p /var/www/vhosts/sito1/htdocs
chown utente-sito:utente-sito /var/www/vhosts/sito1/htdocs

N.B. La suexec e' precompilata per contenere i siti in /var/www
Potrete verificarlo eseguendo questo comando e leggendo il contenuto della
variabile AP_DOC_ROOT:
/usr/lib/apache2/suexec -V
Per modificarlo purtroppo dovrete ricompilare la suexec

6) Creiamo il wrapper che utilizzeremo per avviare il php e configurare mod-fcgid:

mkdir -p /var/www/fcgid-conf-sito1

Inseriamo nel file /var/www/fcgid-conf-sito1/sito1.conf questo:

#!/bin/sh
export PHPRC=/etc/php5/cgi
export PHP_FCGI_MAX_REQUESTS=400
export PHP_FCGI_CHILDREN=2
exec /usr/lib/cgi-bin/php

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.

7) Impostiamo i permessi ed il corretto proprietario del wrapper:

chmod 755 /var/www/fcgid-conf-sito1/sito1.conf
chown -R utente-sito:utente-sito /var/www/fcgid-conf-sito1

8 ) Non ci rimane che inserire questo codice nella configurazione del sito:

<IfModule mod_fcgid.c>
SuexecUserGroup utente-sito utente-sito
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/vhosts/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>

9) Riavviamo il server web:

/etc/init.d/apache2 restart