Apache 2 en mode multithreadé

internet.pngVous le savez (ou pas) les installations classiques d’Apache 2 (avec PHP et MySQL bien souvent) sur Ubuntu (et même Debian) se basent sur une version bien spécifique du serveur web : la version prefork. Son comportement est donc de créer des processus (lourds) pour traiter les différents clients qui veulent accéder aux pages web. L’inconvénient c’est que la multiplication des processus pour le système d’exploitation c’est … lourd. Pour le soulager un peu, on peut utiliser une version d’Apache pas forcément ultra connue s’appelant worker. Cela permet de traiter les clients avec des threads (processus légers) et c’est particulièrement intéressant pour les processeurs récents (ou même assez vieux en fait).

Pour installer la version worker d’Apache, rien de plus simple :
# aptitude install apache2-mpm-worker

Ah ouais, mais il veut me virer le mod PHP5 ? Ça y est le voici l’inconvénient, le mod PHP5 n’est pas thread safe. On ne peut donc pas l’utiliser avec la version multithread de Apache. Mais comme PHP est quand même ultra répandu sur le web et que l’on ne peut se passer de ce magnifique blog (j’entends quelqu’un qui me dit que je devrais mettre plus de contenu pour qu’il soit magnifique), il existe tout de même une solution pour faire l’interprétation des scripts PHP.

On va utiliser la technique FastCGI. À la base CGI était utilisé pour faire du contenu dynamique sur le web avec plein de langages de programmation (Perl, C, script shell, etc…). En fait, il n’y a pas vraiment de limite de langages. FastCGI peut donc parfaitement interpréter du PHP. Pour activer cela, on installe alors 2 petits paquets :
# aptitude install libapache2-mod-fcgid php5-cgi

Si mod_fcgid n’est pas automatiquement activé dans Apache 2, on fera aussi un petit :
# a2enmod fcgid

Dans le cas où on a besoin de faire des modifications dans la configuration de PHP, on ira plus voir /etc/php5/apache2/php.ini mais plutôt /etc/php5/cgi/php.ini.

L’inconvénient c’est que, contrairement à mod_php5 pour apache2-mpm-prefork, les pages PHP ne seront pas interprétées sans modifier les différents VirtualHost qui peuvent servir des scripts PHP. Il faudra donc ajouter dans chaque directive Directory contenant désignant des répertoires avec du PHP les directives suivantes :
AddHandler fcgid-script .php
FCGIWrapper /usr/lib/cgi-bin/php5 .php
Options ExecCGI

La ligne AddHandler permet de spécifier quelle extension de fichier est à exécuter via FastCGI. FCGIWrapper donne le programme à exécuter pour traiter l’extension donnée. Et il ne faut pas oublier l’option ExecCGI sans quoi le PHP ne sera pas interprété.

Au final, cela pourra donner un VirtualHost dans le genre de celui-ci :
<VirtualHost *:80>
  DocumentRoot /var/www/mon_site

  <Directory "/var/www/mon_site">
    AddHandler fcgid-script .php
    FCGIWrapper /usr/lib/cgi-bin/php5 .php
    Options ExecCGI Indexes FollowSymLinks MultiViews
  </Directory>
</VirtualHost>


Comme vous pouvez le voir, ça peut vite être lourd si on a beaucoup de VirtualHost à changer. C’est pour ça que je vous encourage donc d’utiliser le mod_macro (merci Romain pour l’astuce) pour vous simplifier votre future administration du serveur web. Une fois tous les VirtualHost modifiés, il faudra redémarrer le serveur Apache.
# /etc/init.d/apache2 restart

Et là, si votre Apache avait l’habitude d’être un gros consommateur de ressources, il devrait se calmer.

Vus : 2071
Publié par Respawner : 34