30.8. Les contenus dynamiques

Apache offre plusieurs possibilités pour fournir des contenus dynamiques. On entend par contenus dynamiques des pages HTML qui ont été générées à partir de données variables fournies par le client, comme par exemple les moteurs de recherche qui, après saisie d'un ou plusieurs mot clés (éventuellement liés par des opérateurs logiques comme ET ou OU) renvoient une liste de pages contenant ces mots.

Apache propose trois moyens de générer des contenus dynamiques :

Les Server Side Includes (SSI)

Il s'agit là d'instructions imbriquées dans une page HTML à l'aide de commentaires spéciaux. Apache interprète le contenu des commentaires et fournit le résultat comme une partie de la page HTML.

L'interface Common Gateway Interface (CGI)

Il s'agit de programmes qui se trouvent dans certains répertoires. Apache transmet à ces programmes des paramètres fournis par le client et renvoie le résultat de ces programmes. Ce type de programmation est relativement simple, en particulier du fait qu'on peut concevoirdes programmes existants en ligne de commande de telle manière qu'ils reçoivent des données d'Apache et qu'ils lui renvoient les résultats.

Modules

Apache offre des interfaces permettant d'exécuter tout module comme partie du traitement d'une demande. Apache permet à ces programmes d'accéder à des informations importantes, comme la requête ou l'en-tête HTTP. Les programmes peuvent ainsi prendre part à la génération de contenus dynamiques aussi bien qu'à d'autres fonctions comme l'authentification. La programmation de tels modules requiert un certain niveau d'expertise. Cette approche a l'avantage de fournir de hautes performances et des possibilités qui vont bien au delà SSI ou même de CGI.

Au contraire des scripts CGI appelés par Apache sous l'identité de leurpropriétaire, les modules sont contrôlés par un interpréteur persistant incorporé à Apache. De cette manière, il n'est pas nécessaire de lancer et d'arrêter un processus séparé pour chaque requête (ce qui entraînerait une charge considérable en gestion de processus, de mémoire, etc.). A la place, le script est géré par l'interpréteur exécuté sous l'identité du serveur web.

Cette approche présente cependant un inconvénient. Comparativement aux modules, les scripts CGI sont relativement robustes face une programmation peu soigneuse. Dans un script CGI, des erreurs comme un oubli de libérer les ressources et la mémoire n'ont pas d'effet à long terme puisque les programmes sont arrêtés après traitement. Ainsi, les ressources non libérées à cause d'une erreur de programmation redeviennent disponibles. Avec des modules, les effets d'erreurs de programmation s'accumulent puisque l'interpréteur fonctionne de façon persistante. Si le serveur n'est pas redémarré et quel'interpréteur fonctionne pendant plusieurs mois, l'incapacité à fournir les ressources demandées, comme par exemple la connexion à une base de données, sont particulièrement désagréables.

30.8.1. Server Side Includes

Les Server Side Includes (SSI) sont des instructions implantées dans des commentaires spéciaux et exécutées par Apache. Leur résultat est inséré dans la sortie. Par exemple, la date actuelle peut être affichée par <!--#echo var="DATE_LOCAL">. Ici, c'est le # situé à la suite de la marque d'ouverture de commentaire <!-- qui indique à Apache qu'il s'agit d'une instruction SSI et non pas d'un commentaire habituel.

Il existe plusieurs possibilités pour activer des SSI. La variante la plus simple consiste à rechercher dans tous les fichiers exécutables des SSI. Une autre variante consiste à définir certains types de fichiers dans lesquels rechercher des SSI. Les deux réglages sont expliquées dans la section Section 30.6.2.15, « Les Server Side Includes ».

30.8.2. L'interface Common Gateway Interface : CGI

CGI est l'abréviation de « Common Gateway Interface ». Avec CGI, le serveur ne fournit pas seulement une page HTML statique, mais exécute tout un programme qui fournit la page. Il est ainsi possible de créer des pages qui sont le résultat d'un calcul, le résultat d'une recherche dans une base de données. Des arguments peuvent être transmis au programme exécuté, qui est donc à même de fournir une page de réponse individuelle à chaque demande.

CGI a l'avantage d'être une technique assez simple. Il suffit que le programme se trouve dans un certain répertoire pour pouvoir être exécuté par le serveur web exactement comme un programme dans la ligne de commande. Les sorties du programme sur la sortie standard (stdout) sont simplement transmises aux clients par le serveur.

En principe, tous les langages de programmation peuvent être utilisés pour écrire des programme CGI. On utilise typiquement des langages de scripts (langages interprétés) comme Perl ou PHP ; dans certains cas, si la vitesse est critique, il peut être plus appropriés d'utiliser C ou C++.

Dans le cas le plus simple, Apache recherche ces programmes dans un répertoire défini (cgi-bin). Ce répertoire peut être défini dans le fichier de configuration, décrit dans Section 30.6, « Configuration ». Si nécessaire, il est possible de définir des répertoires supplémentaires. Dans ce cas, Apache pourra y rechercher d'autres programmes exécutables. Cependant, cela comporte un certain risque pour la sécurité puisque tout utilisateur peut faire exécuter par Apache des programmes dont certains peuvent être utilisés avec de mauvaises intentions. Si les programmes exécutables sont restreints au répertoire cgi-bin, l'administrateur peut contrôler plus facilement qui y dépose des scripts et des programmes et si ceux-ci sont éventuellement de nature malveillante.

30.8.3. GET et POST

Les paramètres d'entrée sont transmis au serveur par GET ou par POST. En fonction de la méthode utilisée, le serveur transmet les paramètres au script de différentes manières. Avec POST, le serveur transmet les paramètres au programme par l'entrée standard (stdin). S'il était démarré sur une console, le programme obtiendrait ses paramètres de la même manière. Avec GET, le serveur transmet les paramètres au programme dans la variable d'environnement QUERY_STRING.

30.8.4. Générer des contenus dynamiques avec des modules

Apache dispose de nombreux modules. Le terme « module » est utilisé avec deux significations. Il existe d'une part des modules qui peuvent être intégrés dans Apache où ils assurent des fonctions précises, tels que les modules décrits ici pour l'utilisation de langages de programmation dans Apache.

D'autre part, dans le contexte de langages de programmation, on comprend par modules un groupe indépendant de fonctions, de classes et de variables. Ces modules sont implantés dans un programme pour proposer certaines fonctionnalités. On peut citer comme exemple les modules CGI existant dans tous les langages de scripts qui facilitent l'écriture d'application CGI en fournissant, entre autres, des méthodes pour lire les paramètres de requête et pour afficher du code HTML.

30.8.5. mod_perl

Perl est un langage de script populaire et ayant fait ses preuves. Pour Perl, il existe une grande quantité de modules et de bibliothèques, dont une bibliothèque pour l'extension du fichier de configuration d'Apache. Vous trouverez un grand choix de bibliothèques pour Perl dans le CPAN (Comprehensive Perl Archive Network— Réseau Complet d'Archive pour Perl) : http://www.cpan.org/. http://www.mongueurs.net/ est un site web en français pour les programmeurs Perl.

30.8.5.1. Configurer mod_perl

Pour mettre en place mod_perl dans SUSE LINUX, il suffit d'installer le paquetage correspondant (voir la section Section 30.5, « Installation »). Après l'installation, le fichier de configuration pour Apache contient les déclarations nécessaires (voir /etc/apache2/mod_perl-startup.pl). Des informations sur mod_perl sont disponibles à l'adresse http://perl.apache.org/.

30.8.5.2. mod_perl comparé à CGI

Dans le cas le plus simple, on peut faire fonctionner un script, jusqu'à présent CGI, en tant que script mod_perl en l'appelant à une autre URL. Le fichier de configuration contient des alias, qui font référence au même répertoire et appellent des scripts qu'il contient via CGI ou par mod_perl. Toutes ces déclarations figurent déjà dans le fichier de configuration. Pour CGI, la déclaration d'alias est :

ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"

Voici les déclarations pour mod_perl :

<IfModule mod_perl.c>
# Fournit deux alias au même répertoire cgi-bin
# pour illustrer les effets de deux mod_perl différents
# avec le module Apache::Registry
ScriptAlias /perl/          "/srv/www/cgi-bin/" 
# avec le module Apache::Perlrun
ScriptAlias /cgi-perl/      "/srv/www/cgi-bin/" 
</IfModule> 

Les déclarations suivantes sont également requises pour mod_perl. Elles figurent déjà dans le fichier de configuration.

#
# Si mod_perl est activé, charger les informations de configuration
#
<IfModule mod_perl.c>
Perlrequire /usr/include/apache/modules/perl/startup.perl
PerlModule Apache::Registry

#
# configure le module Apache::Registry pour l'alias /perl
#
<Location /perl>
SetHandler  perl-script
PerlHandler Apache::Registry
Options ExecCGI
PerlSendHeader On
</Location>

#
# configure le module Apache::PerlRun pour l'alias /cgi-perl
#
<Location /cgi-perl>
SetHandler  perl-script
PerlHandler Apache::PerlRun
Options ExecCGI
PerlSendHeader On
</Location>

</IfModule>

Ces déclarations créent des alias pour les modes Apache::Registry et Apache::PerlRun. La différence entre les deux modes est décrite ci-dessous :

Apache::Registry

Tous les scripts sont compilés puis gardés dans un cache. Chaque script est utilisé en tant contenu d'un sous-programme. Bien que ce fonctionnement soit intéressant du point de vue performance, il présente l'inconvénient suivant : la programmation des scripts doit être faite très soigneusement puisque les variables et les sous-programmes persistent entre les différents appels. Cela signifie qu'il est nécessaire de réinitialiser les variables afin qu'elles puissent être réutilisées lorsqu'elles sont à nouveau appelées. Par exemple, si on enregistre dans un script de banque en ligne le numéro de carte de crédit d'un client dans une variable, ce numéro pourra être présent lorsque le client suivant utilise cette application et donc appelle le même script.

Apache::PerlRun

Les scripts sont recompilés pour chaque requête. Les variables et les sous-programmes sont effacés de l'espace de noms entre les requêtes.(l'espace de noms est l'ensemble des noms de variables et de programmes définis à un moment donné pendant l'existence d'un script). Par conséquent, avec Apache::PerlRun, une programmation absolument rigoureuse n'est donc pas nécessaire car toutes les variables sont réinitialisées au lancement du script et elles ne peuvent plus contenir de valeurs provenant des appels précédents. Pour cette raison, Apache::PerlRun est plus lent que Apache::Registry, mais reste plus rapide qu'un CGI (malgré les similitudes avec CGI) car il n'est pas nécessaire d'appeler un processus séparé pour l'interpréteur.

30.8.6. mod_php4

PHP est un langage de programmation spécialement conçu pour être utilisé avec des serveurs web. Il se distingue d'autres langages, dont les commandes sont enregistrées dans des fichiers à part (script), par le fait que lors de PHP, les commandes sont implantées dans une page HTML (semblable à SSI). L'interpréteur PHP traite les commandes PHP et implante le résultat du traitement dans une page HTML.

Le site web de PHP est disponible à l'adresse http://www.php.net/. Pour un site sur PHP en français, consultez http://www.phpindex.com/. Le paquetage mod_php4-core doit être installé pour que PHP fonctionne. Apache 2 requiert en plus le paquetage apache2-mod_php4.

30.8.7. mod_python

Python est un langage de programmation orienté objet qui dispose d'une syntaxe très claire et très lisible. La structure du programme dépend de l'indentation, ce qui est une caractéristique inhabituelle mais pratique. Les blocs ne sont pas définis par des accolades (comme c'est le cas dans C et Perl) ou d'autres séparateurs (comme begin et end), mais par le niveau d'indentation. Le paquetage à installer est apache2-mod_python.

Vous trouverez des informations plus détaillées à l'adresse http://www.python.org/. Pour plus d'informations sur mod_python, consultez http://www.modpython.org/.

30.8.8. mod_ruby

Ruby est un langage de programmation de haut niveau orienté objet, relativement récent, présentant des ressemblances avec certains aspects de Perl et Python et particulièrement approprié pour les scripts. Comme Python, il présente une syntaxe claire et transparente. En revanche, Ruby a adopté des abréviations, appréciées par certains programmeurs et détestées par d'autres. Un exemple d'abréviation est $.r, le numéro de la dernière ligne lue à partir du fichier d'entrée. Le concept de base de Ruby ressemble beaucoup à Smalltalk.

Vous trouverez le site web de Ruby à l'adresse http://www.ruby-lang.org/. Il existe également un module Apache pour Ruby, dont vous trouverez la page web à l'adresse http://www.modruby.net/.


SUSE LINUX Guide de l'administrateur 9.2