Configuration d’Apache pour mod_perl
Sachant tout cela, nous pouvons maintenant fignoler le fichier de configuration d’Apache. Pour respecter les conventions, nous avons renommé .cgi-bin en .perl. Nous pouvons alors placer la plupart de tout ce qui concerne Perl dans un conteneur <Location> :
User webuser
Group webuser
ServerName www.butterthlies.com
DocumentRoot /usr/www/APACHE3/APACHE3/site.mod_perl/mod_cgi/htdocs
TransferLog /usr/www/APACHE3/APACHE3/site.mod_perl/logs/access_log
ErrorLog /usr/www/APACHE3/APACHE3/site.mod_perl/logs/error_log
# À modifier avant de mettre en production !
LogLevel debug
AliasMatch /perl(.*) /usr/www/APACHE3/APACHE3/site.mod_perl/perl/$1
Alias /perl /usr/www/APACHE3/APACHE3/site.mod_perl/perl
DirectoryIndex /perl/home
PerlTaintCheck On
PerlWarn On
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
#PerlHandler Apache::PerlRun
Options ExecCGI
PerlSendHeader On
</Location>
N’oubliez pas de réduire le niveau de débogage avant de mettre votre serveur en production ! Notez également que les deux directives :
PerlTaintCheck On
PerlWarn On
ne sont pas placées dans le conteneur <Location> car elles s’exécutent au chargement de Perl.
Amélioration des performances
Un site web rapide est un sérieux candidat pour devenir un bon site web. Cela vaut sûrement la peine de prendre un peu de temps pour accélérer vos scripts, mais n’oubliez pas que la plupart du temps passé sur le web l’est par des clients qui regardent l’écran de leur navigateur, essayant de déchiffrer ce qu’il contient.
Au chapitre 12, nous évoquions le problème plus large de l’accélération des sites. Ici, nous donnons quelques conseils sur la création de scripts qui s’exécuteront plus vite dans moins d’espace mémoire. Plus ils s’exécutent vite, plus vous pourrez servir de clients à la suite ; moins ils consomment de mémoire, plus vous pourrez lancer d’instances et plus vous pourrez servir de clients simultanément. Cependant, si votre site attire tant de visiteurs qu’il n’arrive pas à suivre, vous avez certainement les moyens d’ajouter du matériel. Dans le cas contraire, pourquoi vous soucier autant du confort des visiteurs ?
Les utilisateurs de FreeBSD peuvent consulter la page http://www.freebsd.org/cgi/man.cgi?query=tuning, qui contient quelques suggestions de base.
La recherche d’une optimisation parfaite peut passer par des chemins subtils et longs, qui dépendent beaucoup des détails de fonctionnement de vos scripts. Une bonne raison pour ne pas consacrer trop de temps à l’optimisation de votre code est que les petites modifications que vous ferez demain pour corriger un problème de maintenance réduiront sûrement à néant vos optimisations dûrement gagnées.
Accélération des scripts
L’intérêt principal d’utiliser mod_perl est de décharger votre serveur. Vous pouvez vous contenter de l’installer et de le configurer comme nous venons de le montrer, mais vous pouvez faire plus.
Préchargement des modules et compilation
Lorsque mod_perl démarre, il doit charger les modules utilisés par vos scripts :
...
use strict;
use DBI();
use CGI;
...
Dans le fonctionnement normal de Perl, les modules sont compilés lors de leur appel par les scripts -- Perl vérifie qu’ils ne contiennent pas d’erreur et les met dans un format exécutable. Ce processus est plus rapide s’il est effectué au démarrage, notamment dans le cas du gros module CGI. Pour cela, on utilise la commande compile :
...
use strict;
use DBI();
use CGI; CGI->compile(<tags>);
...
Remplacez <tags> par la liste des fonctions CGI que vous utilisez.
Persistance de l’interface avec les bases de données
Si vous utilisez une base de données, vos scripts ouvriront et fermeront en permanence des descripteurs pour effectuer les accès. Ce processus vous fait perdre du temps et peut être amélioré en utilisant Apache::DBI.
KeepAlives et MaxClients
Sur les sites chargés, cela vaut le coup de désactiver KeepAlive (voir le chapitre 3) car cette directive maintient la connexion entre le serveur et chaque client pendant un certain temps, même s’ils ne font rien. Cela consomme des processus qui, à leur tour, consomment de la mémoire : comme chaque connexion correspond à un processus et que chaque processus a sa propre instance de Perl, le code compilé et les variables persistantes en cache, sa consommation mémoire peut être très importante -- bien plus qu’avec une utilisation classique d’Apache. De même, on peut ajuster MaxClients pour éviter le swapping et ainsi améliorer les performances ; même si, paradoxalement, cela force les clients à attendre.
Utilisation d’un profiler
L’outil classique pour accélérer les programmes s’appelle un profiler. Cet outil compte les cycles d’horloge de chaque ligne de code exécutées par le processeur : le compte total de chaque ligne montre alors le temps qu’elle a pris au cours de l’exécution du programme. Le résultat est un fichier log, qui peut être trié par un autre programme afin de mettre en évidence les lignes qui consomment le plus de temps. Très souvent, vous ne pourrez pas faire grand chose pour corriger les problèmes qui sont ainsi mis en évidence : il faut bien exécuter les instructions, et cela prend du temps, c’est tout. Cependant, en certaines occasions, le profiler vous montrera que le problème est dû à une fonction qui est appelée plus souvent qu’elle ne le devrait : vous pouvez alors la sortir de la boucle ou réorganiser cette boucle pour qu’elle fonctionne plus efficacement afin que votre script en tire profit.
Il existe un profiler pour Perl, DProf, disponible sur CPAN (voir http://search.cpan.org ). Il y a deux façons de l’utiliser (voir la documentation), la meilleure étant de placer la ligne suivante dans votre fichier de configuration :
...
PerlModule Apache::DProf
...
Cette ligne active le profiler et crée un répertoire dprof/$$ situé sous <ServerRoot>. Dans celui-ci, vous trouverez un fichier nommé tmon.out contenant les résultats que vous pourrez étudier en utilisant le script dprofpp fourni avec le paquetage.
Aussi intéressants que soient les résultats d’un profiler, ils ne méritent pas qu’on y passe trop de temps. Si une partie du code prend 50% du temps d’exécution (ce qui est assez improbable), s’en débarrasser ne fera que doubler la vitesse d’exécution ; si une partie du code prend 10% du temps d’exécution (ce qui est beaucoup plus probable), s’en débarrasser (en supposant que c’est possible) ne fera gagner que 10% en vitesse d’exécution, ce que personne ne remarquera.