Administration réseau sous Linux/Apache
Apache est un serveur HTTP libre.
Un serveur HTTP permet d'héberger des sites web qui seront accessibles avec un navigateur tel que , Internet Explorer ou encore Chrome.
Un site web peut fournir tout type de contenu (des fichiers textes, HTML, Flash, zip…).
Ce contenu peut être statique (le serveur transmet un fichier au navigateur) ou dynamique (le contenu est généré par un programme exécuté par le serveur).
Les sites web contiennent généralement plusieurs types de documents, certains étant statiques et d'autres dynamiques.
Nous traiterons ici d'Apache 2.2 sur un système (et ses dérivés, comme ).
Fichiers log.
Par défaut sous Debian, Apache enregistre les erreurs dans le fichier codice_1. Quand quelque chose ne fonctionne pas, ce fichier fournit souvent des pistes pour trouver la solution.
Il enregistre également toutes les requêtes dans codice_2.
Configuration de base.
Sous Debian, Apache se lance automatiquement lorsqu'on l'installe et à chaque démarrage du système.
Lorsqu'on modifie sa configuration, il faut lui faire prendre connaissance des changements avec la commande 
 /etc/init.d/apache2 reload
Pour l'arrêter, le lancer ou le relancer on utilisera la même commande avec codice_3, codice_4 ou codice_5.
Pour d'autres systèmes il faudra consulter la documentation du système ou celle d'Apache.
Configuration du serveur.
La configuration du serveur se trouve dans codice_6.
Ce fichier contient des instructions codice_7 qui permettent de déplacer certaines parties de la configuration dans d'autres fichiers.
Debian utilise cette fonctionnalité pour les modules (comme PHP) et la gestion des serveurs virtuels :
Configuration des modules.
Le répertoire codice_8 contient les modules installés.
Le répertoire codice_9 contient les modules activés.
Les modules activés sont des liens symboliques vers les modules installés.
Pour activer ou désactiver un module, on peut manipuler directement les liens ou utiliser les commandes codice_10 et codice_11 (voir les pages de man).
Configuration des sites.
De la même manière, le répertoire codice_12 contient les sites web disponibles et codice_13 les sites activés.
Il en existe un préinstallé : le site codice_14.
Les sites peuvent s'activer ou se désactiver en manipulant les liens dans codice_15 ou en utilisant codice_16 et codice_17.
Quelques directives classiques.
La syntaxe d'Apache est assez simple.
On trouve des blocs (ou contextes) comme par exemple :
et des directives comme par exemple
 Include /etc/apache2/sites-enabled/
Les directives qui permettent de configurer le serveur lui-même sont généralement placées dans codice_18.
Celles qui ne concernent qu'un site web sont déportées dans le fichier de configuration du site (codice_19).
La directive DocumentRoot fixe la racine du serveur Web, c'est-à-dire le répertoire de base où se trouvent les documents.
Par exemple avec la directive codice_20, si le navigateur demande la page codice_21, le serveur cherchera le fichier codice_22.
UserDir permet d'indiquer le répertoire personnel des utilisateurs du système.
La directive codice_23 signifie qu'un utilisateur peut publier ses pages web personnelles dans un sous-répertoire codice_24 de son répertoire personnel.
Pour l'utilisateur "toto", c'est généralement codice_25.
Sa page d'accueil sera alors accessible par l'URL spéciale codice_26.
DirectoryIndex indique la liste des fichiers qu'Apache cherchera à afficher si l'URL n'en précise pas.
Par exemple si la configuration contient codice_27 et qu'on demande l'URL codice_28, Apache va chercher dans le répertoire un fichier codice_29 ou codice_30.
Si un de ces fichiers existe, il sera affiché.
Sinon, Apache affichera soit la liste des fichiers, soit une erreur (suivant la présence de codice_31 dans la directive Options).
AccessFileName définit le nom du fichier qu'on peut placer dans un répertoire pour en modifier sa configuration.
Cela permet, par exemple, d'interdire localement l'affichage de la liste des fichiers, ou de protéger par mot de passe un répertoire et ses sous répertoires.
Listen indique à Apache sur quel port TCP il doit écouter.
Le port par défaut du protocole HTTP est 80.
ServerName indique à Apache son nom de domaine et éventuellement son port.
Il s'en sert lorsqu'il doit communiquer son adresse au client (le navigateur).
C'est le cas par exemple lorsqu'on demande l'adresse codice_32 sans "slash" (codice_33) à la fin.
Comme ce n'est pas une URL valide (l'URL d'un répertoire doit se terminer par un "slash"), Apache utilise la directive codice_34 pour reconstruire une adresse avec un "slash" et la renvoi au client.
Gestion du nombre d'instances d'Apache.
Le serveur Apache utilise plusieurs processus et prend en charge plusieurs types de stations multi-processeurs en utilisant les modules MPM (multi processing modules).
Le premier module prefork utilise des processus (pour systèmes stables ou plus anciens), le deuxième worker utilise des threads, et le dernier des threads par processus. Le dernier module perchild est en cours de développement et n'est pas recommandé.
Celui utilisé par défaut sous Linux est prefork.
Exemple commenté.
La partie du fichier de configuration traitant la gestion du nombre de processus est la suivante :
<IfModule prefork.c>
 StartServers 5
 MinSpareServers 5
 MaxSpareServers 10
 MaxClients 20
 MaxRequestsPerChild 0
</IfModule>
<IfModule worker.c>
 StartServers 2
 MaxClients 150
 MinSpareThreads 25
 MaxSpareThreads 75
 ThreadsPerChild 25
 MaxRequestsPerChild 0
</IfModule>
<IfModule perchild.c>
 NumServers 5
 StartThreads 5
 MinSpareThreads 5
 MaxSpareThreads 10
 MaxThreadsPerChild 20
 MaxRequestsPerChild 0
 AcceptMutex fcntl
</IfModule>
Pour activer le module :
 a2enmod mpm_prefork
On voit ensuite les processus d'avance :
$ ps -ef |grep apache
root 32026 1 0 15:16 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 32029 32026 2 15:16 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 32030 32026 0 15:16 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 32031 32026 0 15:16 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 32032 32026 0 15:16 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 32033 32026 0 15:16 ? 00:00:00 /usr/sbin/apache2 -k start
Paramétrage des répertoires.
Chaque répertoire auquel Apache accède peut être configuré indépendamment (et ses sous-répertoires en héritent).
Le paramétrage d'un répertoire se met dans un "conteneur" délimité par codice_35 et codice_36.
La configuration s'applique au répertoire et à tous ses sous répertoires.
Si un sous-répertoire possède également sa propre configuration, elle vient s'ajouter à celle du parent.
Voici quelques exemples de contrôle d'accès.
Plus de détails sont donnés dans la section "Un exemple de configuration".
Les paramètres possibles de la directive Options sont : "None", "All", "Indexes", "Includes", "FollowSymLinks", "ExecCGI", ou "MultiViews".
Gérer les pages Web personnelles.
Il est possible de permettre aux utilisateurs du système de diffuser des pages personnelles sans avoir à créer un site par utilisateur.
Il faut pour cela utiliser le module codice_37.
Le répertoire contenant le site web doit être créé dans le "home" de l'utilisateur et doit être accessible en lecture pour tous.
Le nom du répertoire est défini par la directive UserDir.
Par défaut il s'agit du répertoire codice_24.
L'adresse pour accéder à ces sites personnels est le nom de l'utilisateur précédé d'un "tilde" (codice_39).
Par exemple un utilisateur "toto" sur le serveur "www.iut.clermont.fr" peut créer les pages de son site dans le répertoire codice_25, et on pourra y accéder avec l'adresse : http://www.iut.clermont.fr/~toto/.
Il est possible de n'autoriser que certains utilisateurs à bénéficier du codice_41.
Par exemple pour n'autoriser que "sasa" et "toto" à avoir un site personnel :
Pour définir les options de ces répertoires, on peut utiliser une clause codice_42 pour le répertoire codice_43 :
La clause codice_23 ne fonctionne que pour des utilisateurs ayant un compte sur le système.
L'URL http://www.iut.clermont.fr/~toto ne fonctionne que si "toto" est un véritable utilisateur (auquel cas l'expression Unix codice_45 a un sens), pas seulement si le répertoire codice_25 existe.
On peut utiliser une autre forme de UserDir pour autoriser les répertoires sans forcément qu'il y ait un compte unix associé :
 UserDir /home/*/public_html
Le module PHP.
PHP a normalement été intégré au serveur Apache sous forme d'un module chargeable situé comme tous les autres modules d'Apache dans codice_47.
Les fichiers codice_48 et codice_49 contiennent les directives codice_50 et codice_51 qui permettent à Apache d'exécuter du PHP quand on demande un fichier se terminant par codice_52.
Ils doivent être liés dans codice_9 pour activer PHP.
On peut utiliser pour cela la commande codice_10.
En marge de Apache, PHP possède lui aussi son fichier de configuration, souvent codice_55.
Il n'est pas particulièrement conseillé d'y intervenir sauf si on sait ce que l'on fait.
On peut néanmoins y observer que PHP prend bien en compte le module d'extension MySQL, contenant les fonctions d'accès au "moteur" de base de données MySQL (qui a dû être installé à part), par la présence de codice_56.
En cas de modification d'un fichier de configuration, comme PHP fonctionne comme module d'Apache, il faut redémarrer Apache pour qu'il réinitialise PHP par la lecture de php.ini.
 /etc/init.d/apache2 restart
Exemples de configuration.
Voici quelques exemples de configuration.
L'ensemble des directives possibles peut être consulté ici : http://httpd.apache.org/docs/2.2/mod/directives.html
Pensez que les directives doivent parfois se trouver dans codice_18, parfois dans le contexte codice_58 d'un site donné.
ServerType.
 ServerType standalone
Cette ligne indique si le serveur Apache se lance en 'autonome' (standalone) ou via codice_59 (TCP_WRAPPER).
Pour la plupart des configuration, c'est en standalone.
Cette directive a disparu de Apache2, qui dispose d'un autre moyen pour définir cela.
Le comportement est en fait choisi d'après le MTM (Multi-processing module) choisi.
ServerRoot.
 ServerRoot /etc/apache2
Vous indiquez ici le répertoire d'installation d'Apache.
Normalement les scripts d'installation ont bien renseigné cette ligne.
Vérifiez quand même.
LockFile.
 LockFile /var/run/httpd.lock
Laissez cette ligne comme elle est, c'est à dire en commenté pour 90% des cas (# devant).
PidFile.
 PidFile /var/run/httpd.pid
Vérifiez bien que cette ligne est décommentée.
Elle indique au script de démarrage d'enregistrer le numéro de processus d'Apache pour que lors de l'arrêt du système le processus Apache soit stoppé correctement.
ScoreBoardFile.
 ScoreBoardFile /var/run/httpd.scoreboard
Ce fichier stocke des informations pour le bon fonctionnement d'Apache.
Timeout.
 Timeout 300
Temps en secondes avant que le serveur n'envoie ou ne reçoive un "timeout" .
Quand le serveur attend une "réponse" (ex : script CGI, connexion\ldots), si au bout de ce temps, il ne reçoit pas de réponse, il va s'interrompre et prévenir l'utilisateur de l'erreur.
Laissez cette valeur par défaut à moins que vous n'effectuiez des traitements dépassant cette limite.
Ne pas monter trop haut cette valeur non plus car si le programme externe à "planté", ou si une erreur est survenue, vous risquez de rendre inaccessible le serveur Apache pour trop de temps (il est toujours désagréable d'attendre pour rien).
KeepAlive.
 KeepAlive on
Autorise ou non les connexions persistantes (plusieurs requêtes par connexions).
En fait cela permet aux utilisateurs de votre serveur de lancer plusieurs requêtes à la fois, et donc d'accélérer les réponses du serveur.
Laissez cette valeur par défaut la plupart du temps.
Pour de petits serveurs laissez cette option sur "on" .
Pour un serveur très sollicité, dès que vous vous apercevez que le système ralentit énormément ou devient indisponible assez souvent, essayez avec la valeur "off" .
Mais avant, essayez de baisser la valeur de l'option suivante.
MaxKeepAliveRequests.
 MaxKeepAliveRequests 100
En combinaison avec l'option précédente, indique le nombre de requêtes pour une connexion.
Laissez cette valeur assez haute pour de très bonnes performances.
Si vous mettez 0 comme valeur, vous en autorisez en fait un nombre illimité (attention donc).
Laissez la valeur par défaut là aussi.
KeepAliveTimeout.
 KeepAliveTimeout 15
Valeur d'attente en secondes avant la requête suivante d'un même client, sur une même connexion, avant de renvoyer un timeout.
Là aussi laisser la valeur par défaut.
MinSpareServers & MaxSpareServer.
 MinSpareServers 5
 MaxSpareServers 10
Ces valeurs servent à l'auto-régulation de charge du serveur.
En fait le serveur Apache contrôle lui même sa charge, suivant le nombre de clients qu'il sert et le nombre de requêtes que demandent chaque client.
Il fait en sorte que tout le monde puisse être servi et ajoute tout seul un certain nombre d'instances Apaches "idle", c'est-à-dire qui ne font rien, mais sont prêtes à servir de nouveaux clients qui se connecteraient.
Si ce nombre est inférieur à codice_60 il en ajoute une (ou plusieurs).
Si ce nombre dépasse la valeur de codice_61 il en arrête une (ou plusieurs).
Ces valeurs par défaut conviennent à la plupart des sites.
Listen.
 Listen 3000
 Listen 12.34.56.78
 Listen 12.34.56.78:3000
Indique au serveur des ports ou des adresses IP (il y en a une par interface réseau du serveur!), ou les deux, où il doit "écouter" les demandes de connexions, EN PLUS de l'adresse et port par défaut.
Voir la directive codice_58 plus loin.
BindAdress.
 BindAdress *
Redondant avec codice_63, cela permet de spécifier des adresses IP d'interfaces réseau, pour écouter les requêtes.
Cette directive a disparu dans Apache 2.
Port.
 Port 80
Redondant avec codice_63, cela permet de spécifier le port d'écoute (80 par défaut).
Cette directive a disparu dans Apache 2.
LoadModule, ClearModuleList & AddModule.
 LoadModule xxxxxx.mod libexec/yyyyyy.so
 ClearModuleList
 AddModule zzzz.c
Support pour les modules DSO (Dynamic Shared Object). codice_50 permet de charger un module.
Avant Apache 2, les directives codice_66 et codice_67 permettaient de spécifier l'ordre d'exécution des modules, à cause de problèmes de dépendances.
Apache 2 peut maintenant faire cela automatiquement, car les APIs de modules leur permet de spécifier eux-mêmes leur ordre.
Sous Apache 1.*, il faut cependant y prêter une grande attention, et le maintenir à jour à l'ajout de tout nouveau module.
ExtendedStatus.
 ExtendedStatus on
Indique si le serveur doit renvoyer des informations complètes de statut ("on" ) ou des informations réduites ("off" ). "off" par défaut.
Laissez cette valeur par défaut sauf en cas de développement et de debuggage.
User & Group.
 User nobody
 Group nobody
Une fois le serveur démarré, il serait dangereux de lui laisser les droits codice_68 pour répondre aux requêtes.
Il est donc possible de modifier l'utilisateur et le groupe du processus pour lui donner un minimum de droits sur la machine du serveur. (En fait si quelqu'un arrive à "exploiter" votre serveur, par exemple s'il arrive à faire exécuter du code par le serveur Apache, il hérite des droits du serveur lui même.
Donc si c'est codice_69 il n'a aucun droit spécifique.
Si c'est codice_68 ou un utilisateur réel, il aura alors des droits lui permettant d'endommager votre système.)
ServerAdmin.
 ServerAdmin root@localhost.domainname
Adresse e-mail de l'administrateur du site.
Cette adresse est affichée par le serveur par exemple en cas d'erreur, pour que les utilisateurs puissent en avertir l'administrateur.
ServerName.
 ServerName www.domainname
Adresse que le serveur va renvoyer au client web.
Il est préférable de mettre une adresse résolue par DNS au lieu du nom de la machine réelle, pour que les visiteurs ne voient pas le nom réel de votre machine (utile pour la sécurité aussi).
DocumentRoot.
 DocumentRoot /var/lib/apache/htdocs
Répertoire racine ou se trouve vos pages Web.
Directory.
 <Directory /var/lib/apache/htdocs>
 Options Indexes FollowSymlinks Multiviews
 AllowOverride None
 Order allow,deny
 Allow from all
 </Directory>
Change les paramètres du repertoire codice_71.
On peut placer à l'intérieur les directives suivantes :
Options.
on définit les options pour ce répertoire.
Les options possibles sont les suivantes :
AllowOverride.
définit comment sont gérés les fichiers .htaccess de ce répertoire :
Order.
Donne l'ordre d'application des règles "Allow/Deny" :
Allow/Deny.
À vous de placer vos règles suivant le contenu de vos répertoire accessibles par le Web.
Il existe les mêmes règles pour les fichiers (<Files> </Files>) et les locations (<Location> </Location>).
Voir un exemple pour les fichiers (file) plus bas.
DirectoryIndex.
 DirectoryIndex index.html index.htm index.php index.php5
Indique le ou les fichiers à charger lorsqu'on accède à un répertoire sans préciser de fichier.
Dans cet exemple, si on accède à http://example.com/repertoire/, Apache cherchera un des fichiers mentionnés (index.html, index.htm...) et s'il en trouve un il l'affichera. S'il n'en trouve pas, il affichera la liste des fichiers ou interdira l'accès (suivant la présence ou non de l'option Indexes sur le répertoire).
AccessFileName.
 AccessFileName .htaccess
Nom du fichier des règles d'accès pour les règles AllowOverride.
Un conseil: placez comme vu précédemment une règle file du style:
CacheNegotiatedDocs.
 #CacheNegotiatedDocs
Autorise ou pas les proxies à mettre en cache les documents (pour autoriser, enlevez le commentaire # en début de ligne)
UseCanonicalName.
 UseCanonicalName On
Placé sur "on" , réécrit l'URL par rapport aux valeurs codice_72 et codice_73 spécifiées plus haut dans le fichier httpd.conf.
Sur "off" , l'URL reste celle donnée par le client.
Attention, mettez sur "on" si vous utilisez des CGI avec des variables SERVER_NAME, car si l'URL du client n'est pas la même que celle du CGI, votre script CGI ne marchera pas.
DefaultType.
 DefaultType text/plain
Type mime par défaut que le serveur renvoie au clients.
Convient dans la plupart des cas.
HostNameLookups.
 HostNameLookups off
Sur "on" , le serveur le nom du client grâce à une requête DNS inverse.
Sinon, il se contente de l'adresse IP, ce qui génère beaucoup moins de trafic réseau.
ErrorLog.
 ErrorLog /var/log/error_log
Chemin complet du fichier où les erreurs seront enregistrées.
LogLevel.
 LogLevel warn
Niveau d'enregistrement des erreurs avec comme valeurs possibles, par ordre décroissant d'importance, donc croissant en bavardage:
Le niveau codice_74 est le minimum recommandé, et on monte généralement à codice_75.
ServerSignature.
 ServerSignature on
Alias.
 Alias faux_nom nom_réel
permet de faire des alias de répertoires (des liens en quelque sorte) (similaire à codice_76
AddType.
 AddType type extensions
Spécifie que des fichiers utilisant de telles "extensions" sont du "type" précisé.
Cela permet de décider quoi en faire.
Pour ajouter le support PHP, le fichier codice_79 contient par exemple :
AddHandler.
 AddHandler cgi-script .cgi
Pour utiliser les scripts CGI.