Si es vol mantenir segura una instal·lació d'apache i aïllar cada Virtualhost, habitualment es presenten les següents opcions:
-
Apache Suexec + suphp + suhosin
És una solució que han adoptat la majoria de hosting i que aïlla correctament cada virtualhost. No obstant, té un rendiment horrible, amb executar 1000 vegades una pàgina de phpinfo() aquests són els resultats:
* suexec: 127.219 segons
* mod_php: 3.753 segons
-
Canviar a servidor litespeed
Aquest servidor és la millor solució realment, tal i com es descriu a http://www.litespeedtech.com/litespeed-web-server-is-the-best-platform-for-php-powered-sites.html
No obstant, inexplicablement, inclou php4 en comptes de php5, per la qual cosa requereix compilar php5 i substituir l'executable de php-cgi per la versió 5. Com tot el món, sóc massa gos i no m'agrada tenir php compilat a ma perquè es perd la senzillesa d'afegir mòduls a php amb només apt-get. Ho sent.
-
Usar Paralels Plesk.
Aquest panel de control per a apache configura els permisos per a cada virtualhost de manera correcta i impideix interferències entre els virtualhost.
L'inconvenient és que es perd capacitat de maniobra amb les configuracions, augmenta la càrrega del servidor i, principalment, costa molts diners.
-
La solució definitiva: el mòdul apache2-mpm-itk
Amb el meravellós mòdul apache2-mpm-itk és possible aconseguir una veritable instal·lació de apache2 multiusuari sense embolicar les coses amb SuExec. Després d'alguns passos senzills és possible especificar un usuari + grup per a cada virtualhost, de manera que Apache (i el PHP) s'executarà amb aquest usuari per a les peticions del virtualhost en qüestió.
Aturem el servei apache, abans de res.
service apache2 stop
(o bé: /etc/init.d/apache2 stop)
S'asumeix que apache s'executa amb l'usuari www-data i grup www-data (comprovar l'arxiu /etc/apache2/envvars )
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
Nota: si s'ha instal·lat suexec, s'ha de desactivar, simplement amb:
mv /usr/lib/apache2/suexec /usr/lib/apache2/suexec.disable
Instal·lar mpm-itk amb debian/ubuntu és molt fàcil ja que el mòdul de l'apache2-mpm-itk està al repositori. Tingueu en compte que la instal·lació suposa el fi de la versió standard de apache2 i la desactivació del mòdul apache2-mpm-prefork, ja que mpm-itk es compila dins de l'apache2. Així que per instal·lar-ho sols s'ha d'executar, com a root:
apt-get install apache2-mpm-itk
Una vegada fet això, no cal habilitar-ho ni a2enmod ni res. Només s'ha de configurar la llista de virtualhosts(habitualment /etc/apache2/sites-available/default) i permetre que mitjançant l'addició d'aquesta línia en cada <virtualhost>, apache2 s'execute amb l'usuari determinat:
AssignUserId USUARI GRUP
Canviant USUARI i GRUP per l'usuari i grup que es vol, per exemple:
<VirtualHost *:80>
DocumentRoot /var/www/flog
ServerName flog.cat
ServerAlias www.flog.cat
AssignUserId flog http
....
</VirtualHost>
També es pot afegir així de manera que no provocarà conflictes si mpm es deshabilita:
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
Si no s'especifica cap usuari per algun virtualhost, s'executarà amb l'usuari apache2 (www-data o el que s'especifique a l'arxiu de configuració).
Abans d'activar apache de nou, ens hem d'assegurar d'establir els permisos del DocumentRoot del virtualhost canviant-los de www-data per al nou usuari i grup amb l'eina chown i chmod si és necessari.
chown USUARI:GRUP /var/www/paginaweb/ -R
chmod 644 /var/www/paginaweb/ -R
Ara ja es pot iniciar apache i gaudir de la protecció de mpm-itk :)
service apache2 start
(o bé: /etc/init.d/apache2 start)
Ah, per cert, aquest és el rendiment de mpm-itk per a la mateixa prova d'executar phpinfo() 1000 vegades: 37.01 segons. Molt millor que suphp, veritat?