Le Guide d'installation d'Apache
URL de référence : http://www.apachefrance.com/Articles/1/

Préambule

Après avoir acquis ses premières lettres de noblesse avec des sites au contenu statique, le Web a depuis quelques temps amorcé un virage afin de rendre la consultation de l'information plus "adaptable" aux desiderata de tout un chacun.
Les évolutions ont dans un premier temps été apportées du côté client, tout d'abord en donnant à l'internaute le moyen d'agir via des formulaires, puis par des scripts écrits dans un langage adapté. Netscape venait de créer Javascript. Microsoft proposera plus tard VBScript avec une syntaxe quasi-identique à Visual Basic.
Les limitations sont vite apparues (accès aux fichiers, interactions avec des bases de données) et d'autres pistes ont été étudiées. L'idée qui émergea fut ainsi de déplacer le travail d'interactivité vers le serveur Web : la notion de scripts exécutés côté serveur (server-side scripting) était née et ouvrait grand les portes du Web dynamique.
Le concept général est d'intégrer au sein d'une page statique des éléments de code écrits dans un langage spécifique, et qui vont être interprétés par un module installé sur le serveur Web. Le résultat de cette interprétation est généralement du HTML, qui est inséré par le serveur Web en lieu et place des zones de code au moment où la page est envoyée vers le navigateur de l'internaute.

Actuellement, plusieurs grands plates-formes destinées à fournir du contenu dynamique existent sur le marché. Elles sont globalement constituées de trois composants : le serveur HTTP, le module d'interprétation de scripts et la base de données. Voici une liste non-exhaustive des différents composants existants :
• Pour les serveurs HTTP, les plus utilisés sont Apache (auquel ce site est en grande partie dédié) et Internet Information Server de Microsoft,
• Pour les modules d'interprétation de scripts, PHP, Active Server Pages de Microsoft et ColdFusion de Allaire,
• Pour les bases de données, MySQL et PostgreSQL, SQL Server de Microsoft et Oracle.

La plate-forme pour les sites dynamiques la plus en vogue du moment (car elle utilise uniquement des logiciels libres) est constituée de Apache / PHP / MySQL, tournant sur Linux.
Le présent guide a donc pour objectif de présenter une manière d'installer et configurer cette plate-forme comme support pour des sites Web dynamiques, que ce soit pour un Intranet ou un site Internet.
Nous étudierons tout d'abord l'installation des librairies MM, Freetype, GD et PDF, dédiées respectivement à la gestion de la mémoire partagée, la génération de caractères True Type, d'images et de fichiers PDF. Puis nous passerons à l'installation et à la configuration de MySQL. L'étape suivante consistera en la mise en oeuvre d'Apache, et nous finirons par l'intégration du module PHP à Apache.

Avant toute chose, il faut vous procurer l'ensemble des sources nécessaires. Vous les trouverez dans la section Téléchargement, dans la rubrique Apache / PHP /MySQL. Vous pouvez charger l'ensemble des fichiers du tableau. Après les avoir chargées, placez-les dans un répertoire temporaire dans votre arborescence (par exemple /tmp/apa_inst). Passez également sous le profil root afin d'avoir les droits nécessaires.
Nous allons maintenant commencer le déploiement par l'installation des librairies MM, Freetype, GD et PDF.

Installation des librairies

Nous vous proposons d'installer quatre librairies sur votre système Linux afin d'enrichir PHP de fonctionnalités supplémentaires : la gestion de la mémoire partagée (shared memory), la génération d'images (aux formats JPG et PNG, ce dernier remplaçant GIF pour des questions de droits d'auteur), la génération de textes utilisant des polices True Type et enfin la génération de fichiers PDF.

MM

MM est une librairie qui permet une utilisation simplifiée de la mémoire partagée (ou shared memory) utilisée lors de la communication inter-processus (ou IPC, Inter Processus Communication) sur les plates-formes de type Unix. La raison pour laquelle il est intéressant d'installer cette librairie sur votre système est lors de l'utilisation des sessions avec PHP 4. En effet, Tobias Ratschiller, dans son article sur la gestion des sessions (l'article ici) recommende la librairie MM : "si vous souhaitez des performances élevées, le module mm est une alternative très intéressante, car il permet le stockage des données de session en mémoire partagée (NDR : plutôt que dans un fichier) et n'est donc pas limité par les perfornances du sous-système disque".
Pour installer MM, décompactez les sources :
# tar xvfz mm-1.1.3.tar.gz
Rendez-vous dans le répertoire qui vient d'être créé :
# cd mm-1.1.3
Préparez la configuration, compilez la librairie et installez-là :
# ./configure --prefix=/usr/local
# make
# make install

FreeType

La librairie Freetype apporte à Linux le support des polices True Type de Windows. Le premier champ d'application possible est leur utilisation sous X-Window. L'autre possibilité, relayée par la librairie GD, est la génération d'images comportant un texte utilisant des polices True Type.
Pour installer cette librairie, décompactez tout d'abord les sources :
# tar xvfz freetype-2.0.5.tar.gz
Rendez-vous dans le répertoire qui vient d'être créé :
# cd freetype-2.0.5
Préparez la configuration :
# make setup
Par défaut, les composants de la librairie vont être placés dans des sous-répertoires du dossier /usr/local. Vous pouvez changer cela, par exemple installer dans /usr, en tapant à la place :
# make setup CFG="--prefix=/usr"
Ceci fait, lancez la compilation et l'installation :
# make
# make install

La librairie FreeType est une librairie dynamique, c'est-à-dire qu'elle est indépendante des applications qui l'utilisent (son code n'est pas intégré aux applications) et n'a besoin d'exister qu'une seule fois en mémoire. Une librairie dynamique est comparable aux DLLs de Windows. Pour la mettre à disposition du système, il faut reconstruire la liste des librairies dynamiques par la commande suivante :
# ldconfig
Validez ensuite l'écriture des données en mémoire tampon sur le disque par la commande sync. Sans cela, le cache des librairies dynamiques n'est pas mis convenablement à jour. Pour vérifier la disponibilité effective de Free Type, tapez la commande suivante :
# ldconfig -v | grep freetype
Le résultat devrait être libfreetype.so.6 -> libfreetype.so.6.1.0.

GD

Pour ajouter le support de la génération dynamique d'images à PHP, nous allons utiliser la librairie GD. La dernière version stable est la 1.8.4 mais celle-ci ne fonctionne pas correctement avec FreeType du fait qu'elle ne supporte par les polices True Type de type 2. Il est donc nécesaire d'utiliser la version 2.0.1 qui, bien qu'au stade de bêta, ne devrait pas poser de problèmes particuliers. Ajoutons qu'afin de compiler cette librairie sans souci, il est nécessaire que les librairies libpng, libjpeg-6b et zlib soient préalablement installées. Pour ajouter le support du format TIFF dans PHP, je vous recommande si ce n'est déjà fait d'installer libtiff. Si vous rencontrez un quelconque problème, n'hésitez pas à poster un message dans le forum.
Passons maintenant à l'installation de la librairie. Décompactez les sources et rendez-vous dans le répertoire créé :
# tar xvfz gd-2.0.1.tar.gz
# cd gd-2.0.1

GD dans sa version 2.0.1 va chercher par défaut à utiliser la librairie FreeType donc aucune configuration n'est nécessaire de ce côté. Il est par contre nécessaire d'ajuster le chemin de recherche des fichiers d'en-tête (.h). Pour cela, éditer le fichier Makefile, recherchez la ligne commençant par INCLUDEDIRS et modifiez -I/usr/include/freetype2 en -I/usr/local/include/freetype2. Il faut ensuite modifier l'emplacement d'installation de la librairie. Pour cela, rechercher la ligne INSTALL_LIB et modifiez le répertoire /usr/lib vers /usr/local/lib. Faites de même pour la ligne INSTALL_INCLUDE et changez la valeur vers /usr/local/include.
Vous pouvez maintenant lancer la compilation et l'installation :
# make install
Comme pour FreeType, vous devez mettre à jour la base des librairies dynamiques :
# ldconfig
# sync
Vérifiez la prise en compte de GD :
# ldconfig -v | grep gd
Vous devriez voir apparaître libgd.so.2.0.0 -> libgd.so.2.0.0 dans le résultat de la commande.

PDFLib

La librairie PDFLib permet à PHP de générer des fichiers PDF à la volée. Il est dès lors possible de proposer aux visiteurs du site de sauvegarder un article ou le résultat d'une requête sous la forme d'un document PDF et donc de profiter des avantages qu'offre ce format.
Décompactez les sources et placez-vous dans le répertoire de travail :
# tar xvfz pdflib-4.0.1.tar.gz
# cd pdflib-4.0.1

Lancez la configuration en fonction de votre plate-forme, puis la compilation :
# ./configure
# make

Enfin, passez à l'installation :
# make install
Comme FreeType, la librairie et ses composants seront placés dans des sous-répertoires de /usr/local.
Il faut enfin mettre à jour la base des librairies dynamiques comme pour les deux librairies précédentes :
# ldconfig
# sync

MySQL

Le Système de Gestion de Bases de Données Relationnelles (SGBDR) MySQL doit sa popularité à plusieurs facteurs. Tout d'abord son ouverture sur le monde du logiciel libre, mais également sa simplicité et sa rapidité qui lui ont valu d'être le moteur de bases de données de choix dans les sites Web dynamiques.
En effet, MySQL offre des performances incroyables lors de la consultation de données, ce qui est un critère primordial. A contrario, il n'est que peu adapté pour des applications transactionnelles classiques (Online Transaction Processing, OLTP), le verrouillage lors d'un ajout ou d'une modification se faisant au niveau de la table toute entière. Ajoutons également qu'il ne gère pas les clés étrangères. Ces lacunes n'ont toutefois que peu d'impact dans le cadre d'un site d'information où quelques webmestres ajoutent ponctuellement des news ou des articles.
Désormais libre d'utilisation, MySQL évolue régulièrement et une nouvelle version dénommée MySQL-Max a vu le jour. Celle-ci apporte un meilleur support des transactions et élargit de ce fait le champ d'action de ce moteur aux qualités certaines. Le principal concurrent de MySQL dans le monde du logiciel libre est PostgreSQL. Ce SGBDR a une vocation de base plus généraliste que MySQL et se veut donc plus complet. Ainsi, et entre autres, les clés étrangères sont supportées et la gestion des verrous est plus souple. Par contre, il n'est pas censé offrir la même rapidité en consultation que son concurrent. A ce sujet, je vous renvoie vers deux articles (en Anglais) où les deux moteurs sont comparés : MySQL and PostgreSQL Compared et Database Software Comparison.

Passons maintenant à l'installation de MySQL.
Tout d'abord, dans un souci de sécurité (surtout si votre serveur est sur Internet), il est préférable de faire tourner le moteur MySQL sous le profil d'un utilisateur avec des droits limités plutôt que root. Ainsi, dans l'hypothèse où un pirate pourrait exploiter une brèche de sécurité de MySQL, son champ d'action serait limité aux droits conférés à l'utilisateur fictif.
Tapez les commandes suivantes afin de créer un groupe mysql et un utilisateur mysql :
# groupadd mysql
# useradd -g mysql mysql
Le choix du nom du groupe et de l'utilisateur restent à votre discrétion. Ainsi, si vous préférez mygrp et myusr, la commande à taper sera :
# groupadd mygrp
# useradd -g mygrp myusr


Remarque : sur une Slackware 8.0, même si le package MySQL n'a pas été installé, l'utilisateur mysql et le groupe mysql existent déjà. Cela ne pose pas de problème, mais dans le fichier /etc/passwd, dans la ligne correspondant à mysql, il faut remplacer /var/lib/mysql par /usr/local/mysql.

Ceci fait, décompactez les sources de MySQL et placez-vous dans le répertoire de travail :
# tar xvfz mysql-3.23.43.tar.gz
# cd mysql-3.23.43

Les possibilités de préconfiguration de MySQL sont vastes. Nous allons donc vous en présenter certaines qui devraient vous permettre de déterminer lesquelles utiliser en fonction de vos besoins.
--prefix=répertoire : répertoire sera le répertoire principal de MySQL, les composants seront placés dans des sous-répertoires (bin, share, etc.).
--localstatedir=répertoire : les bases de données et les journaux (logs) seront placés dans le répertoire répertoire (sur un disque de données séparé par exemple).
--without-debug : MySQL ne sera pas compilé pour produire des informations de débogage. Cette option est à sélectionner pour un serveur de production.
--enable-assembler : lors de la compilation, des fonctions de manipulation de chaînes de caractères en assembleur seront utilisées.
--with-client-ldflags=-all-static : les outils client de MySQL (mysql, mysqladmin) seront compilés de façon à ne pas utiliser les librairies dynamiques. Les binaires générés seront plus gros, mais les applications seront plus rapides.
--with-mysqld-ldflags=-all-static : le moteur MySQL (mysqld) sera compilé de façon à ne pas utiliser les librairies dynamiques. Le binaire généré sera plus gros, mais l'application sera plus rapide.
--disable-shared : seules les versions statiques des librairies de MySQL seront générées.

Nous proposons de faire la préconfiguration avec la commande suivante :
# ./configure \
--prefix=/usr/local/mysql-3.23.43 \
--localstatedir=/data/mysql \
--without-debug \
--enable-assembler \
--with-mysqld-ldflags=-all-static
N.B. : les backslashes en fin de ligne permettent, en tapant sur la touche "Entrée", de continuer la saisie de la commande à la ligne suivante et non pas de la valider.
Lancez ensuite la compilation puis l'installation par les commandes suivantes :
# make
# make install


Pour plus de simplicité ultérieurement, nous vous suggérons de créer un lien symbolique nommé mysql vers le répertoire d'installation de MySQL :
# ln -s /usr/local/mysql-3.23.43 /usr/local/mysql
Ainsi, toute référence à la version de MySQL est occultée, ce qui est plus souple et plus évolutif.

Les outils MySQL utilisant les librairies dynamiques, il est nécessaire de configurer le gestionnaire de librairies dynamiques afin qu'il connaisse l'emplacement de ces librairies.
Pour ce faire, tapez la commande suivante :
# echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf
Procédez ensuite à la mise à jour du cache des librairies :
# ldconfig
# sync

La vérification du bon paramétrage se fera par la commande suivante :
# ldconfig -v | grep mysql
Le résultat devant être :
/usr/local/mysql/lib/mysql:
libmysqlclient.so.10 -> libmysqlclient.so.10.0.0


L'étape suivante consiste à créer les tables système (utile uniquement si MySQL n'a jamais été installé) :
# scripts/mysql_install_db

Lancez les commandes suivantes pour donner les droits sur répertoires de MySQL aux utilisateurs fictifs créés précédemment :
# chown -R root /usr/local/mysql/
# chown -R mysql /data/mysql
# chgrp -R mysql /usr/local/mysql/
# chgrp -R mysql /data/mysql

Le "/" à la fin des commandes portant sur le répertoire /usr/local/mysql est important car il permet que le traitement s'opère sur le répertoire pointé par le lien mysql et non le lien lui-même.

Copiez ensuite le fichier de configuration à sa place :
# cp support-files/my-medium.cnf /etc/my.cnf
Si vous disposez de 512 Mo à 1 Go de mémoire, utilisez le fichier my-large.cnf. Si vous disposez de plus d'1 Go de mémoire, utilisez le fichier my-huge.cnf.
Editez le fichier /etc/my.cnf et ajoutez la ligne suivante dans la section [mysqld] : user = mysql
Ceci permet de spécifier au démon MySQL de tourner avec les droits de l'utilisateur mysql sans avoir à le spécifier sur la ligne de commande.

Une astuce pour gagner en performance : utilisez la commande Unix strip qui retire d'un binaire les symboles utilisés lors de l'édition de lien. Le plus utile est de l'exécuter sur mysqld, le démon MySQL :
# strip /usr/local/mysql/libexec/mysqld

Vous pouvez enfin démarrer le démon MySQL par la commande suivante :
# /usr/local/mysql/bin/safe_mysqld &
Si tout fonctionne bien, MySQL devrait démarrer et vous afficher un message indiquant le répertoire utilisé pour stocker les données (/data/mysql dans notre cas). Pour vérfier si le démon mysqld tourne, utiliser la commande suivante :
# ps | grep mysql
Le résultat devrait ressembler à ceci : 13653 pts/0 00:00:00 safe_mysqld
Vous pouvez également lancer quelques commandes de test :
# /usr/local/mysql/bin/mysqladmin version
# /usr/local/mysql/bin/mysqladmin variables
# /usr/local/mysql/bin/mysqlshow
# /usr/local/mysql/bin/mysqlshow mysql
# /usr/local/mysql/bin/mysql -e "select host,db,user from db" mysql

Lors de son exécution, le script mysql_install_db vous suggère vivement de saisir un mot de passe pour l'utilisateur root de MySQL. Cet utilisateur dispose de tous les privilèges sur les tables systèmes donc ce conseil est bon à suivre.
Vous pouvez le faire par les commandes suivantes :
# /usr/local/mysql/bin/mysqladmin -u root password 'lenouveaumotdepasse'

Pour que le démon MySQL démarre et s'arrête automatiquement, vous pouvez utiliser le fichier mysq.server.
Attention, la méthode suivante s'applique à une distribution Slackware.
Copiez-le dans le répertoire contenant les scripts de démarrage :
# cp support-files/mysql.server /etc/rc.d
Appliquez des droits en exécution :
# chmod 755 /etc/rc.d/mysql.server
Editez le fichier rc.local et ajoutez les lignes suivantes :
# Demarrage MySQL.
if [ -x /etc/rc.d/mysql.server ]; then
. /etc/rc.d/mysql.server start
fi

Apache

Le serveur HTTP Apache jouit d'une notoriété indiscutable dans le monde d'Internet. D'après la société Netcraft, qui étudie chaque mois les "parts de marché" des différents type de serveurs Web, Apache domine largement ses concurrents avec une utilisation sur plus de 60% des serveurs HTTP publics dans le monde. Ce succès est non seulement dû à sa gratuité, mais également à sa robustesse et à son extensibilité. Apache est également une plate-forme de choix pour un intranet, et est très répandu dans les universités et les écoles.
Actuellement en version 1.3.22, Apache connaît des développements réguliers. Les plus grandes évolutions devraient venir de la version 2.0 (actuellement en bêta) qui apporte entre autres un support très poussé des processus légers (threads) pour une meilleure efficacité d'ensemble.

Pour installer Apache, décompactez tout d'abord les sources et placez-vous dans le répertoire nouvellement créé :
# tar xvfz apache_1.3.22.tar.gz
# cd apache_1.3.22


Tout comme MySQL, Apache accepte un nombre conséquent de paramètres lors de sa préconfiguration. Voici un exemple de commande, vous trouverez le détail de ses paramètres ci-après :
# ./configure \
--prefix=/usr/local/apache-1.3.22 \
--htdocsdir=/data/www/html \
--cgidir=/data/www/cgi-bin \
--enable-module=rewrite \
--enable-shared=max


N.B. : les backslashes en fin de ligne permettent, en tapant sur la touche "Entrée", de continuer la saisie de la commande à la ligne suivante et non pas de la valider.

Quelques explications sur les options :

Tout d'abord, --prefix=/usr/local/apache-1.3.22 indique que l'ensemble des composants d'Apache (binaires, modules, fichiers de configuration, etc.) seront placés dans le répertoire /usr/local/apache-1.3.22 ou ses sous-répertoires (bin, conf, libexec, etc.). Si vous souhaitez installer Apache dans un autre endroit de votre arborescence, il suffit de jouer sur ce paramètre.

Les paramètres --htdocsdir et --cgidir permettent de spécifier des répertoires où les pages HTML et les programmes CGI seront stockés. Pour info, si vous souhaitez placer les fichiers de configuration dans un endroit précis, vous pouvez spécifier le paramètre --sysconfdir=répertoire, comme par exemple --sysconfdir=/etc/apache-conf pour placer les fichiers de configuration dans le répertoire /etc/apache-conf.

Ensuite, --enable-module=rewrite spécifie d'ajouter le module permettant la réécriture automatique d'URL (il n'est pas disponible par défaut). Les modules de bases sont normalement suffisants et ne nécessitent pas de librairies complémentaires. Vous pouvez choisir l'option --enable-module=all, ainsi l'ensemble des modules complémentaires (authentification, redirection, etc.) vont être compilés et seront actifs, c'est-à-dire prêt à être chargés au besoin par Apache pour utiliser leurs fonctions. Pour avoir l'ensemble des fonctionnalités, on préfèrera en général l'option --enable-module=most qui ajoute et active tous les modules sauf les suivants : auth_db (car tous les systèmes n'ont pas la librairie db), mmap_static (toutes les systèmes n'ont pas accès à la fonction mmap() - de plus ce module est considéré comme expérimental), so (pas de gestion dynamique des modules - voir un peu plus bas), example (utile uniquement aux développeurs de modules), auth_digest (car ce module peut entraîner des conflits avec le module digest - de plus il est considéré expérimental), log_agent et log_referer (qui sont obsolètes, leurs fonctionnalités ont été intégrées dans le module log_config).

Le paramètre --disable-module permet de spécifier certains modules optionnels fournis avec les sources d'Apache à ne pas compiler (et donc indisponibles). Par exemple, si vous spécifiez --enable-module=all, il vaut mieux malgré tout désactiver certains modules. Ainsi, ajouter les options
--disable-module=mmap_static \
--disable-module=auth_digest \
--disable-module=example \
spécifie de ne pas utiliser les modules mod_mmap_static, mod_auth_digest et mod_example.

La dernière option est certainement la plus intéressante car elle indique au configurateur que l'on souhaite utiliser les modules dynamiques. En effet, tout comme le noyau de Linux est capable d'utiliser des modules qui ne sont chargés que si besoin est, Apache est capable d'utiliser un mécanisme similaire.
Les avantages sont doubles. Tout d'abord, Apache ne charge en mémoire que les modules dont il a besoin à un instant précis, et cela libère donc la mémoire centrale du serveur pour d'autres tâches. Ensuite, on dispose d'une plus grande souplesse. Installer un nouveau module ne nécessite que la compilation du dit module et ne nécessite donc plus les sources d'Apache. De plus, une mise à jour de version de PHP est bien plus aisée puisqu'il suffit de recompiler la nouvelle version sous forme de module et ne nécessite donc pas d'interruption du serveur HTTP. La légère contrepartie par rapport à une intégration des composants au sein d'Apache est une légère augmentation de la charge du serveur dû à la nécessite de gérer les chargements / déchargements des modules en mémoire.
Si vous souhaitez disposer d'un bon compromis entre performance et maintenance aisée, vous pouvez intégrer les modules fournis avec Apache (donc dépendants de la version d'Apache) dans l'exécutable. Pour cela, il suffit de ne pas spécifier l'option --enable-shared=max. Par contre, les modules tiers (et donc indépendants de la version d'Apache) tels que PHP, mod_gzip, etc. peuvent être gérés comme modules dynamiques via apxs.

Vous pouvez maintenant lancer la compilation et l'installation :
# make
# make install


Tout comme nous l'avons fait pour MySQL, nous vons conseillons de créer un lien symbolique apache vers le répertoire d'installation (apache-1.3.22) :
# ln -s /usr/local/apache-1.3.22 /usr/local/apache

Vous pouvez maintenant démarrer Apache :
# /usr/local/apache/bin/apachectl start

Pour vérifier que l'installation est correcte, ouvrez votre navigateur et tapez simplement l'adresse IP (ou le nom si vous avez un DNS) de la machine sur laquelle vous venez d'installer Apache. La page suivante devrait apparaître :



Pour qu'Apache démarre automatiquement, ajoutez les lignes suivantes au fichier /etc/rc.local (valable sur Linux Slackware) :
# Demarrage Apache
if [ -x /usr/local/apache/bin/apachectl ]; then
. /usr/local/apache/bin/apachectl start
fi


L'étape suivante va consister à modifier le fichier de configuration d'Apache afin de l'adapter à nos besoins. Celui-ci se trouve dans le sous-répertoire conf et se nomme httpd.conf. Plutôt que d'en détailler chaque ligne, nous allons vous en présenter les options (ou directives) importantes, ainsi que quelques propositions de modification.
Le fichier httpd.conf comporte trois grandes sections que nous allons maintenant décrire.

Première section : Global Environment

Cette section comprend des paramètres qui décrivent le fonctionnement global d'Apache comme par exemple le nombre de requêtes concurrentes qu'il peut accepter. Voici les plus importants :

ServerType standalone

Cette option décrit le mode d'exécution d'Apache. Les valeurs possibles sont inetd ou standalone (autonome), ce dernier étant choisi par défaut.
Rappelons que le démon inetd (appelé également le "super-serveur Internet") est en quelque sorte un superviseur. Il attend des connexions sur un certain nombre de ports (21 pour FTP, 23 pour Telnet, etc.) et lors d'une demande de connexion sur un port particulier, il démarre une application (ou démon) spécifique apte à fournir les services qu'attend la machine appelante. Cette application terminée, inetd continue l'écoute sur le port. L'intérêt d'inetd est donc de limiter la charge du système en ne démarrant un démon qu'à la demande.
En mode autonome, le démon Apache est en permanence présent en mémoire, qu'il y ait ou non des requêtes. Ce mode est préféré car plus performant : lors d'une requête, Apache répond instantanément. A l'opposé, en mode inetd, un temps de latence inhérent à l'activation du démon est constaté et pénalise lourdement la performance d'un serveur très sollicité. Nous vous conseillons de conserver le paramètre standalone.

ServerRoot "/usr/local/apache-1.3.22"

Cette option spécifie le répertoire principal d'Apache. Les composants sont placés dans des sous-répertoires : bin pour les programmes, conf pour les fichiers de configuration, logs pour les journaux d'accès ou d'erreur, libexec pour les modules dynamiques, man pour les pages de manuel, etc. Cette option prend comme valeur celle spécifiée pour le paramètre "--prefix" lors de la préconfiguration.

LoadModule nommodule_module libexec/nommodule.so
ClearModuleList
AddModule nommodule.c

Ces paramètres permettent l'utilisation des modules dynamiques (ou Dynamic Shared Objects, DSO). L'ordre dans lequel ils sont spécifiés est très important et il ne faut donc pas le modifier.
Si vous souhaitez ajouter un nouveau module à Apache et que vous le compilez pour qu'il soit dynamique, il faudra ajouter les paramètres "LoadModule" et "AddModule" correspondants. Prenons par exemple un module mod_toto : vous devrez ajouter la ligne "LoadModule mod_toto_module libexec/mod_toto.so" avant "ClearModuleList" et ajouter une ligne "AddModule mod_toto.c" juste après la dernière ligne "AddModule ...".
Actuellement, la plupart des modules tiers sont fournis sous la forme d'un fichier source (mod_toto.c par exemple). Pour l'installer simplement, utilisez la commande apxs disponible dans le répertoire bin de Apache :
# /usr/local/apache/bin/apxs -c -i -a mod_toto.c
Le module va ête compilé (-c), installé dans le bon répertoire (-i) et activé (-a). Cette dernière option correspond à l'ajout des lignes "LoadModule" et "AddModule" adéquates dans le fichier httpd.conf.

Deuxième section : 'Main' server configuration

Cette section décrit l'ensemble des paramètres utilisés par le serveur par défaut, c'est-à-dire celui qui répond aux requêtes qui ne sont pas adressées à un hôte virtuel. Si vous souhaitez héberger plusieurs sites distincts sur un seul serveur, vous aurez besoin des hôtes virtuels. Nous les détaillerons lors de la présentation de la troisième section, qui leur est consacrée. Si vous n'hébergez qu'un seul site, seule cette rubrique est importante. Nous ajouterons également que l'ensemble des options de configuration du serveur principal peuvent être reprises dans la configuration d'un hôte virtuel.

Port 80

Cette option spécifie le port sur lequel le serveur Apache attend des requêtes. 80 est la valeur par défaut et correspond à la valeur attribuée au service www par les instances de normalisation (RFC 1700). A noter que comme pour tout port inférieur à 1024, un programme devant utiliser le port 80 doit être lancé avec les droits de root. Si vous n'avez pas les droits d'administration sur la machine, utilisez une valeur supérieure, par exemple 8080.

User nobody
Group nobody

Les directives User et Group permettent de spécifier un utilisateur et un groupe fictif qui détermineront les droits d'accès du serveur Apache, le but étant de limiter les risques en cas d'intrusion par un pirate. Nous sommes donc ici dans le même cas de figure que celui présenté précédemment avec MySQL.
Cependant, et comme nous l'avons évoqué ci-dessus, il n'est pas possible d'utiliser le port 80 si Apache ne tourne pas avec les droits root. La subtilité réside dans le mécanisme de fonctionnement client/serveur d'Apache. Un processus père, tournant avec les droits root, attend des connexions sur le port 80. Lorsqu'une demande de connexion arrive, le processus père crée un processus fils (tournant avec les droits nobody) qui va être chargé de satisfaire les demandes du client venant de se connecter. C'est donc un processus ayant des droits restreints qui lit les fichiers (HTML, PHP, etc.) et les envoie au navigateur de l'internaute.
Une règle doit donc être observée : les fichiers constituant votre site doivent être accessibles en lecture à l'utilisateur et/ou au groupe nobody. Assurez-vous que les nouveaux fichiers que vous copiez sont soit en lecture pour tout le monde (chmod a+r fichier.html), soit appartiennent à l'utilisateur nobody (chown nobody fichier.html) ou au groupe nobody (chgrp nobody fichier.html).

Pour des raisons obscures, la version 1.3.22 définit comme groupe par défaut "#-1". Si vous avez le moindre souci, remplacez-le par nobody.

ServerAdmin webmaster@asgard.local

La directive ServerAdmin permet simplement de définir une adresse email qui sera affichée sur les pages générées par Apache (pages d'erreur, présentation de répertoire, etc.)

#ServerName thor.asgard.local

Cette directive permet de forcer un nom d'hôte qui sera renvoyé au navigateur client, par exemple www plutôt que le nom d'hôte réel.
Attention toutefois, vous ne pouvez pas spécifier n'importe quel nom, celui que vous avez choisi devra être défini dans le DNS local. Si ce n'est pas le cas, il faudra y accéder par son adresse IP.
Si vous laissez la ligne commentée (avec la # devant), le serveur répondra avec le nom que vous avez tapé dans votre navigateur.
Dans un premier temps, laissez cette ligne commentée.

DocumentRoot "/data/www/html"

Cette option permet de spécifier dans quel répertoire sont stockées les pages présentes à la racine du site (par exemple http://nomserveur/test.html).
Ne changez pas cette option pour l'instant.

<Directory "/data/www/html">...</Directory>

Ces directives délimitent une liste d'options qui va s'appliquer à un répertoire spécifique.
La directive "Options" va déterminer les comportements généraux du répertoire.
La directive "AllowOverride" permet de spécifier si certaines options définies par la directive Options vont pouvoir être surchargées par l'utilisation d'un fichier d'accès (voir AccessFileName ci-dessous).
Les directives "Allow from" et "Order" déterminent qui a accès aux fichiers contenus dans ce répertoire, et dans quel ordre les autorisations sont gérées : d'abord les exclusions ou d'abord les autorisations.

<IfModule mod_userdir.c>...</IfModule>

Ces directives délimitent une liste d'options à n'appliquer que si le nom de module spécifié (mod_userdir dans ce cas) a été activé au niveau de la première section par les directives LoadModule et AddModule.

UserDir public_html

Dans le cas où le module mod_userdir est chargé, cette option permet de spécifier un nom de répertoire qui, s'il existe dans le répertoire de base (home directory) d'un utilisateur local du serveur Apache, va lui permettre d'y stocker des pages. Pour y accèder, il suffira de saisir comme URL http://nomserveur/~nomutilisateur/.
Attention, le serveur Apache ayant les droits de l'utilisateur nobody, le répertoire de base ainsi que le répertoire pour les pages des utilisateurs devront lui être accessibles. Pour ce faire, donnez leur les droits en lecture et en parcours :
# chmod 755 ~nomutilisateur
# chmod 755 ~/public_html

Puis donnez les droits en lecture aux fichiers contenus dans le répertoire public_html :
# chmod -R 755 ~/public_html/*
Si vous ne souhaitez pas utiliser cette fonctionnalité, commentez les lignes LoadModule et AddModule correspondantes dans la première section du fichier httpd.conf.

DirectoryIndex index.html

Si le module mod_dir est chargé (voir IfModule ci-dessus), cette directive permet de spécifier des noms de fichiers qu'Apache va considérer comme noms de page par défaut. Ceci permet de taper une URL sans spécifier un nom de fichier supplémentaire (http://nomachine/test/ plutôt que http://nomachine/test/index.html). Les noms doivent être séparés par des espaces, et l'ordre dans lequel ils sont saisis conditionne la priorité dans le cas où deux fichiers "par défaut" sont présents au même endroit.
Attention ! Lorsqu'aucun nom de fichier n'est fourni, Apache balaye l'ensemble des fichiers du répertoire pour déterminer l'existence ou non de pages "par défaut". Donc dans un souci de performance, ne saisissez pas une liste trop longue.
Vous pouvez ajouter index.php devant index.html.

AccessFileName .htaccess

Cette directive permet de spécifier le nom d'un fichier qui, s'il est présent dans un répertoire, va permettre de spécifier des règles de sécurité pour l'accès aux autres pages de ce répertoire. C'est la présence d'un tel fichier qui fait qu'une fenêtre vous demandant votre login et votre mot de passe vous est présentée. Un tel fichier est utile, par exemple, pour protéger un répertoire contenant les pages d'administration de votre site.
Le fichier d'accès permet également de "surcharger" certaines options définies dans le fichier httpd.conf, c'est-à-dire demander un comportement différent et spécifique pour un répertoire. Cela est intéressant si votre site est hébergé et que vous n'avez pas donc pas la possibilité de jouer sur la configuration de Apache. A noter que ce fichier permet également de spécifier certains options pour PHP.
Le choix ou non d'utiliser les fonctionnalités apportées par ce fichier n'est pas évident. La problèmatique reste celle du bon équilibre souplesse/performance. Si l'option AccessFileName existe, chaque fois qu'Apache ouvrira un répertoire à la recherche d'un fichier, il cherchera un fichier du nom de ce qui a été spécifié lors de la configuration. Cela ajoute donc une opération et a donc un impact certain sur les performances. Par contre, on dispose de fonctionnalités appréciables. Au contraire, si cette ligne est commentée (symbole # au début de la ligne), Apache n'effectuera pas la recherche d'un fichier. Les performances ne seront pas impactées mais on perd en souplesse.

HostnameLookups Off

Cette directive conditionne le fait qu'Apache va essayer (valeur On) ou non (valeur Off) de résoudre l'adresse IP du client qui se connecte à lui pour l'écrire dans les journaux d'accès. Si cette option rend les journaux plus explicites, l'impact sur les performances est généralement trop important. Il vaut donc mieux laisser à "Off"

ErrorLog /usr/local/apache-1.3.22/logs/error_log
CustomLog /usr/local/apache-1.3.22/logs/access_log common

ErrorLog (journal d'erreur) et CustomLog (journal personnalisé, i.e. journal d'accès) permettent de spécifier le chemin et le nom du fichier contenant respectivement les erreurs d'accès (pages non trouvées, etc.) et les accès réussis. CustomLog accepte en plus un paramètre qui correspond à un format de journal, c'est-à-dire une plus ou moins grande richesse des informations journalisées. Les formats pour le journal d'accès sont déterminés par la directive LogFormat.

Pour obtenir un maximum d'informations sur les visiteurs, il est bien plus intéressant d'utiliser le mode combined en lieu et place de common. Mais dans ce cas, le volume des journaux devient vite très importants. Pour mieux les gérer, il suffit d'avoir recours à un programme permettant "d'éclater" les journaux, le plus facile étant une séparation basée sur la date. L'outil cronolog est parfaitement indiqué, car il permet de spécifier des noms de fichiers et/ou de répertoires en se basant sur la syntaxe de strftime. Par exemple, %Y représente l'année courante sur quatre chiffres, %m le mois courant sur deux chiffres, etc. Pour connaître l'ensemble des possibilités, faites :
# man strftime

Tout d'abord, commentez la ligne CustomLog /usr/local/apache-1.3.22/logs/access_log common (ajout d'une dièse # au début de la ligne) afin de ne plus utiliser le mode standard. Commentez également la ligne contenant ErrorLog.

Ensuite, téléchargez cronolog et décompactez l'archive:
# tar xvfz cronolog-1.6.1.tar.gz
Rendez-vous dans le répertoire créé :
# cd cronolog-1.6.1
Préparez la configuration :
# ./configure --prefix=/usr/local/cronolog-1.6.1
Compilez et installez cronolog :
# make install

Nous avons choisi de garder les noms de fichier access_log et error_log, mais ceux-ci vont être séparés mensuellement. Un répertoire par année, et un sous -répertoire par mois.
Pour cela, ajoutez la ligne suivante juste en-dessous de la dernière ligne du type CustomLog :
CustomLog "|/usr/local/cronolog-1.6.1/sbin/cronolog /usr/local/apache-1.3.22/logs/%Y/%m/access_log" combined
Ajoutez également une ligne pour le journal des erreurs :
ErrorLog "|/usr/local/cronolog-1.6.1/sbin/cronolog /usr/local/apache-1.3.22/logs/%Y/%m/error_log".

N.B. : Le caractère avant le chemin vers cronolog est un pipe ("|").

Alias /icons/ "/usr/local/apache-1.3.22/icons/"

La directive Alias permet de créer un lien entre un répertoire dans l'arborescence Web et un répertoire dans l'arborescence du système de fichiers du serveur. Ainsi, avec la directive ci-dessus, une requête sur l'URL http://nomserveur/icons/test.gif retournera le fichier /usr/local/apache-1.3.22/icons/test/gif.
Attention, si l'alias est défini avec un slash à la fin (le symbole "/"), il est nécessaire de taper un slash (ou de spécifier un fichier) dans l'URL pour accèder aux données pointées par l'alias. Par exemple, la directive Alias /doc/ "/usr/local/apache/htdocs/manual/" permettra d'obtenir le contenu du répertoire manual si vous saisissez http://monserveur/doc/ ou http://monserveur/doc/index.html. Si vous tapez http://monserveur/doc, Apache recherchera un sous-répertoire doc dans l'arborescence standard des documents (voir DocumentRoot).
La directive Alias apporte une certaine souplesse en évitant de devoir dupliquer certaines données que l'on voudrait rendre accessible. Cependant, le fait de mettre à disposition des fichiers hors de l'aborescence standard pouvant présenter des risques, il est d'usage d'associer à une directive Alias une directive Directory afin d'instaurer certaines règles de sécurité.

AddType application/x-httpd-php3 .php3

La directive AddType permet soit d'ajouter des type MIME, soit d'étendre la liste des extensions de fichiers correspondant à un type MIME.
L'utilisation la plus courante de cette directive nous concerne directement puisqu'elle permet la prise en compte active par Apache des fichiers PHP.
Nous y reviendrons ultérieurement.

ErrorDocument 404 /missing.html

Les directives ErrorDocument permettent de personnaliser les pages présentées en cas d'erreur. Les paramètres de la directive sont tout d'abord le code HTTP pour lequel on veut personnaliser, puis soit du texte précédé d'une double quote (par exemple "Page introuvable), soit une URL. Dans ce dernier cas, l'URL ne doit pas forcément désigner un fichier HTML statique : cela peut être un script Perl (/cgi-bin/erreur404.pl par exemple), une page PHP, etc.
N.B. : les codes d'erreur les plus courants sont 404 (page introuvable), 500 (erreur interne du serveur) et 403 (accès interdit).

Troisième section : Virtual Hosts

La rubrique Virtual Hosts (hôtes virtuels) permet à Apache de gérer plusieurs sites/domaines différents avec le même serveur. Il existe deux types d'hôtes virtuels : ceux basés sur l'adresse IP et ceux basés sur le nom. Attention toutefois, ces derniers s'appuient sur des spécificités du protocole HTTP dans sa version 1.1, même si.cela ne devrait plus être un problème à l'heure actuelle car tous les navigateurs récents gèrent ce protocole.
Nous n'allons pas étudier les hôtes virtuels car ils couvrent des besoins spécifiques qui sortent du cadre de cet article.

Lorsque vous avez terminé les changements dans le fichier de configuration, arrêtez puis redémarrez Apache :
# /usr/local/apache/bin/apachectl restart

PHP

Ce qui allait devenir PHP a été créé en 1995 par le Danois Rasmus Lerdorf. Son seul et unique but à l'époque était de savoir qui venait lire son CV sur Internet. Etant à son compte, il envoyait des lettres de motivations à diverses entreprises, et mentionnait l'URL de son site. Il avait donc écrit un script CGI en langage Perl qui ajoutait des balises dans le code HTML qui récupéraient les informations sur les visiteurs. Pour impressionner ses visiteurs, il choisit de rendre ses statistiques d'accès publiques. Il baptisa cet outil PHP-Tools (PHP pour Personal Home Page) car ce n'était pour lui qu'un outil destiné à sa page personnelle (home page). C'est également à ce moment que, suite à plusieurs demandes concernant la disponibilité de son script, il choisit de le diffuser comme freeware (ou graticiel ;-)...le concept de logiciel libre n'existait pas à l'époque.
Suite à sa recherche d'emploi, Rasmus obtint un contrat à l'Université de Toronto où il devait travailler sur un système de connexion à Internet pour les étudiants. Il devait développer une interface de gestion Web accèdant à la base de données des étudiants hébergée sur un gros système IBM et permettant d'autoriser la connexion en fonction du paiement effectué par chaque étudiant. Cette base devait pouvoir être mise à jour en temps réel. Vu qu'il n'existait alors aucun outil d'interfaçage entre HTML et base de données, Rasmus eut l'idée d'ajouter des balises spécifiques dans les pages HTML, celles-ci étant interprêtées par le compilateur C. Il donna à cet ensemble de balises le nom de FI pour "Forms Interpreter" (interpréteur de formulaire) car elles permettaient de récupérer des informations saisies dans des formulaires puis de les convertir afin de les exporter vers d'autres systèmes.
En combinant les fonctionnalités de PHP-Tools et de FI, Rasmus réalisa en 1996 la deuxième version de PHP, PHP-FI. Bien qu'il lui soit venu l'idée de commercialiser son produit, il s'abstint devant les messages reçus de nombreux programmeurs à travers le monde qui lui envoyait des corrections de bugs et des améliorations.
PHP est dès lors devenu un projet Open Source et Rasmus continue à être l'un des principaux développeurs, même si le moteur d'interprétation de PHP a été complètement réécrit entre temps.

Pour installer PHP, placez-vous dans le répertoire où vous avez chargé les sources, et décompactez les sources de PHP :
# tar xvfz php-4.0.6.tar.gz
# cd php-4.0.6

Préparez ensuite la compilation :
./configure \
--with-apxs=/usr/local/apache/bin/apxs \
--enable-inline-optimization \
--enable-debug=no \
--enable-safe-mode \
--enable-calendar \
--enable-ftp \
--enable-sysvsem \
--enable-sysvshm \
--enable-trans-sid \
--disable-static \
--with-regex=system \
--with-mm=/usr/local \
--with-mysql=/usr/local/mysql \
--with-freetype-dir=/usr/local \
--with-gd=/usr/local \
--enable-gd-native-tt \
--enable-freetype-4bit-antialias-hack \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-tiff-dir=/usr \
--with-zlib=/usr \
--with-pdflib=/usr/local


Quelques explications sur les options ci-dessus :
--with-apxs=/usr/local/apache/bin/apxs indique que PHP va être compilé comme un module dynamique, le paramètre passé correspond au chemin vers le binaire apxs.
--enable-debug=no indique que PHP ne fournira pas d'informations étendues en cas d'erreur. Ce paramètre est à utiliser pour un serveur de production.
--enable-safe-mode permet à PHP de contrôler certains paramètres d'exécution de scripts et assurer une meilleure sécurité.
--with-regex=system indique à PHP d'utiliser la librairie d'évaluation des expressions régulières du système plutôt que celle inclue avec PHP.
--with-mysql=/usr/local/mysql spécifie le support de la base de données MySQL.
--with-gd=/usr/local va permettre à PHP de générer des images à la volée en se basant sur la librairie GD compilée précédemment (voir ici pour le détail des fonctions).
--with-pdflib=/usr/local permet à PHP de générer des fichiers PDF à la volée en se basant sur la librairie PDFLib (voir ici pour le détail des fonctions).

Les options calendar, ftp, sysvsem et sysvshm ont pour but d'apporter des fonctionnalités supplémentaires à PHP. Elles ne sont en aucun cas obligatoires. Pour plus de détails, vous pouvez consulter la liste des différentes options de compilation, disponible sur le site officiel PHP.

Remarque : le paramètre --enable-track-vars n'est pas spécifié car il est implicite depuis la version 4.0.2 de PHP.

Lancez la compilation et demandez l'installation de PHP :
# make
# make install

Vous devez ensuite copier le fichier php.ini-dist dans le répertoire /usr/local/lib sous le nom php.ini.
# cp php.ini-dist /usr/local/lib/php.ini

Enfin, pour activer le support de PHP par Apache, éditez le fichier httpd.conf de Apache, recherchez les lignes suivantes et enlever le symbole de commentaire (#) au début de chaque ligne :
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps

Si ces lignes ne sont pas décommentées, Apache va considérer les fichiers portant l'extension .php comme des fichiers texte simples et va donc afficher le code plutôt que l'interprêter.
Enfin, a
rrêtez puis redémarrez Apache :
# /usr/local/apache/bin/apachectl restart

Tests / Conclusion

Tout d'abord, créez le fichier test.php contenant le code suivant :
<?php
phpinfo();
?>


Appelez ce fichier dans votre navigateur, si tout va bien, vous devriez voir apparaître une page similaire à celle ci-dessous :



Maintenant, quelques tests des fonctions graphiques fournies par la librairie GD (n'oubliez pas de copier le fichier arial.ttf - la police Arial de Windows - dans le répertoire /data/fonts).
Tout d'abord, la création d'une image au format PNG. Créez un fichier image1.php contenant le code suivant :
<?php
Header ("Content-type: image/png");
$im = imagecreate (400, 30);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
ImageTTFText ($im, 20, 0, 10, 20, $white, "/data/fonts/arial.ttf", "Testing... Omega: &#937;");
ImagePng ($im);
ImageDestroy ($im);
?>

Appelez le fichier image1.php dans votre navigateur, vous devriez voir apparaître l'image suivante :



Passons maintenant au format JPEG. Créer un fichier image2.php avec le code suivant :
<?php
Header ("Content-type: image/jpeg");
$im = imagecreate (400, 30);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
ImageTTFText ($im, 20, 0, 10, 20, $white, "/data/fonts/arial.ttf", "Testing... Omega: &#937;");
ImageJpeg ($im);
ImageDestroy ($im);
?>

Lors de l'appel du fichier, l'image suivante devrait apparaître :


Conclusion

Ce guide, bien qu'il ne soit pas exhaustif, a pour vocation de présenter comment installer une plate-forme de développement de sites dynamiques sur une plate-forme Linux.
Si vous rencontrez une quelconque difficulté,ou si vous avez des questions ou des remarques, n'hésitez pas à poster un message dans le Forum.