Configuration d'Apache httpd.conf
Configuration d'apache: httpd.conf
Introduction
Apache est un serveur Web libre, c'est le standard comme serveur Web sous linux, mais aussi le serveur Web le plus utilisé sur Internet avec plus de 60% des sites d'Internet (contre environ 20% pour IIS). Donc cela ne peut que prouver sa stabilité et ses performances.
S'il est très souvent disponible en standard sur les distributions, on doit souvent le configurer pour ses propres besoins.
Je vais donc essayer de vous détailler le fichier httpd.conf, fichier de configuration d'apache.
Attention: Utilisez une version récente d'apache car:
- De nombreux bugs de sécurité ont été corrigés
- Cette documentation traite de la configuration des derniers serveurs apaches. Dans les anciennes versions, il y avait trois fichiers (httpd.conf, srm.conf, access.conf) mais maitenant tous sont regroupés dans un même fichier: httpd.conf.
Même si la compatibilité avec les anciennes versions a été conservée (on peut toujours utiliser les anciens fichiers) je ne traite ici QUE du fichier httpd.conf.
De plus cette documentation n'est pas encore tout à fait complète, il manque encore quelques options à expliquer, mais certaines me semblent obscures (je ne connais pas tout) ou difficiles à expliquer. J'espère compléter ce document assez vite (de même si vous voulez ajouter vos connaissances à ce document, n'hésitez pas à me mailer
Je ne traite pas de l'installation d'apache, car il est présent dans toutes les distributions. De plus son installation et sa compilation ne sont pas aisées du tout suivant le support que l'on veut lui intégrer. Il existe en effet plusieurs dizaines de facons de le compiler suivant les options que l'on veut lui passer. Mais dans la plupart des distributions, apache est configuré de telle facon que l'on peut y inclure des fonctionalités facilement grâce à des modules "DSO".
Configuration du fichier httpd.conf
Pour cela on va éditer le fichier /chemin_d'install_apache/conf/httpd.conf. Si ce fichier n'existe pas vous devez alors avoir un fichier appelé httpd.conf-dist. Copiez le en httpd.conf et éditez-le.
Détaillons ce fichier, en cherchant les lignes enoncées ci dessous (si une ou plusieurs de ces options ne vous servent pas, commentez-les avec un # devant la ligne)
ServerType standalone
Cette ligne indique si apache se lance en autonome (standalone) ou via inetd.
Pour la plupart des configurations, c'est en standalone. Si vous ne l'avez pas réinstallé, qu'apache était déja installé, ne modifiez pas cette ligne. Ceux qui ont créé votre distrib ont bien configuré cette ligne normalement. Si vous n'êtes pas sur, éditez le fichier /etc/inted.conf , si aucune ligne ne comporte httpd et que par contre vous avez un fichier du style rc.httpd ou Sxxhttpd ou Sxxapchectl dans un sous-répertoire de /etc/rc.d alors c'est qu'il se lance en autonome. Inversement si une ligne httpd existe dans /etc/inetd.conf, alors il se lance en inetd.
ServerRoot "/var/lib/apache"
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 /var/run/httpd.lock
Laissez cette ligne comme elle est , c'est-à-dire commentée, pour 90% des cas (# devant).
PidFile /var/run/httpd.pid
Vérifiez bien que cette ligne soit décommentée. Elle indique au script de démarrage d'enregistrer le numéro de process d'apache pour que, lors de l'arrêt du sytème apache soit stoppé correctement.
ScoreBoardFile /var/run/httpd.scoreboard
Idem. Cette ligne doit exister, ce fichier stocke des informations pour le bon fonctionnement d'apache-lui même.
RessourceConfig /conf/srm.conf
AcessConfig /conf/acess.conf
Les anciens fichiers de configuration d'apache, qui ne sont plus utilisés maitenant (en fait tout est maintenant intégré dans httpd.conf pour simplifier). Ces options sont normalement commentées (# devant).
Timeout 300
Temps en millisecondes avant que le serveur n'envoie ou recoive un "timeout".
En fait quand le serveur attend une réponse d'un programme externe (parseur PHP, script CGI, etc..), si au bout de 3s il ne recoit pas cette réponse, il va envoyer un timeout au programme pour l'arrêter et renvoyer un timeout à l'utilisateur pour le prévenir d'une erreur. Laissez cette valeur par défaut à moins que vous vous aperceviez que des traitements prennent plus de temps que 3s et que le serveur n'attend pas assez longtemps. Ne montez pas trop haut cette valeur non plus car si le programme externe a "planté" ou si une erreur s'est produite, vous risquez de rendre inacessible le serveur apache pour trop de temps (toujours désagréable d'attendre 30s pour rien).
KeepAlive on
Autorise ou pas les connexions persistantes (plusieurs requêtes par connexion). En fait cela permet aux utilisateurs de votre serveur de lancer plusieurs requêtes à la fois. Cela permet d'accélérer les réponses du serveur. Laissez cette valeur par défaut la plupart du temps. Mais dans un environement très sollicité (serveur Web trés fréquenté) cela peut rendre le serveur indisponible pour d'autres utilisateurs ou faire monter le système en ressource. En gros pour de petits serveurs, laissez cette option sur "on". Pour un serveur très sollicité dont le système ralenti énormément ou devient indisponible asez souvent, essayez avec la valeur "off". Mais avant, essayez de baisser la valeur de l'option suivante.
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 ' comme valeur, 'vous autorisez en fait un nombre illimité (attention donc). Laissez la valeur par défaut là aussi.
KeppAliveTimeout 15
Valeur en seconde d'attente pour la requette suivante d'un même client sur une même connexion avant de renvoyer un timeout. Là aussi, laissez la valeur par défaut.
MinSpareServers 5
MaxSpareServer 10
Ces valeurs servent à l'autorégulation de charge du serveur.
En fait apache contrôle lui-même sa charge, suivant le nombre de clients qu'il sert et le nombre de requêtes envoyées par chaque client. Il fait en sorte que tout le monde puisse être servi et ajoute tout seul un certain nombre d'instances apaches pour servir de nouveaux clients qui se connecteraient. Si ce nombre est inférieur à MinSpareServers, il en ajoute un. Si ce nombre dépasse la valeur de MaxSpareServer, il en arrête. Ces valeurs par défaut conviennent à la plupart des sites.
StartServers 5
Nombre de serveurs à démarrer au lancement d'apache.
MaxClients 150
Contrôle le nombre maximum de serveurs pouvant etre lancés simultanément. Laissez donc cette valeur assez haute. Toutefois attention à son niveau pour ne pas qu'en cas de trop forte sollicitation, le serveur apache fasse "tomber" en ressource votre système. Cette valeur ne modifie pas la valeur de MaxKeepAliveRequests car ici Maxclients indique le nombre de clients maximum alors que MaxKeepAliveRequests indique le nombre de requêtes pour UN client.
Remarque: Apache par défaut ne peut servir plus de 254 clients à la fois (c'est a dire si au même moment 254 clients se connectent simultanément, le serveur sature et certains clients doivent attendre avant de pouvoir accéder à votre site), donc la valeur de cette directive ne peut excéder 254 (apache vous signale un warning à son démarrage si vous dépassez cette valeur). Pour pouvoir servir plus de 254 clients simultanément, il faut recompiler apache et modifier dans les sources d'apache la valeur max de clients simultanés. Voir la documentation officielle d'apache pour cela.
Listen 3000
Listen 12.34.56.78
Indique au serveur des ports ou des adresses où il doit "écouter" pour des connexions EN PLUS de l'adresse et port par défaut. Voir l'option VirtualHost plus loin.
BindAdress *
Vous pouvez ici inclure un hôte virtuel en indiquant une adresse, toutes les adresses (*) ou un nom de domaine où le serveur va attendre des connexions. Voir là aussi l'option VirtualHost .
LoadModule xxxxxx.mod libexec/yyyyyy.so
.....
AddModule zzzz.c
Support pour les modules DSO. Si vous devez ajouter des modules à prendre en compte (par exemple pour ceux qui installent PHP en module dynamique), attention à l'ordre de chargement des modules qui a son importance car souvent un module dépend d'un autre module. Voir les documentations des modules que vous souhaitez ajouter.
ExtendedStatus on
Indique si le serveur doit renvoyer des informations complètes de status (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 débuggage.
Port 80
Port d'écoute du serveur par défaut. Vous pouvez le changer si vous désirez mais attention les clients cherchent normalement sur le port 80.
User nobody
Group nobody
User et group system avec lesquels le serveur est démarré. Pour des questions de sécurité laissez toujours ces options! Ne jamais spécifier root!
En fait si quelqu'un arrive à "exploiter" votre serveur (par exemple 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 "nobody", il n'a aucun droit spécifique. Si c'est root ou un user réel, il aura alors les droits de ce user/group et pourra endommager grandement votre système.
ServerAdmin root@localhost.domainname
Adresse E-mail réelle de l'administrateur du site. Cette adresse est affichée par le serveur en cas d'erreur par exemple pour que les utilisateurs puissent en avertir l'administrateur. Mettez votre E-mail donc.
ServerName www.domainname
Adresse que le serveur va renvoyer au client Web. Il est astucieux de mettre www au lieu du nom de la machine réelle, comme cela les visiteurs ne voient pas le nom réel de votre machine (utile pour la sécurité aussi).
DocumentRoot "/var/lib/apache/htdocs"
Répertoire racine où se trouvent vos pages Web.
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
Pour des questions de sécurité, laissez cela par défaut. Cela laisse les permissions de tous les répertoires par défaut et n'autorise pas d'accès spéciaux même si un .htaccess existe (AllowOverride None). De ce fait, personne ne peux modifier les droits que vous avez imposés sur les répertoires où apache a accès. Voir plus bas les explications de chaque option passée.
<Directory "/var/lib/apache/htdocs">
Options Indexes FollowSymlinks Multiviews
AllowOverride None
Order allow,deny
allow from all
</Directory>
Bon là, ce qu'on a fait, c'est qu'on définit cette fois les règles pour le répertoire /var/lib/apache/htdocs (pour notre exemple c'est le repertoire racine des pages Web), on autorise le serveur apache à suivre les liens symboliques (FollowSymlinks) , on empêche quiconque de changer ces règles (AllowOverride None) , puis on définit dans quel ordre appliquer les règles d'autorisation/refus de connexion (order allow,deny) et on autorise les connexions venant de n'importe quel hôte (Allow from all).
Bon détaillons un peu comment ça marche. On commence toujours par:
<Directory xx>
Pour définir sur quel répertoire (xx) on applique ces règles.
Options : on définit les options pour ce répertoire qui sont pour les plus importantes :
None | Désactive toutes les options. |
All | Active toutes les options SAUF Multiviews. |
Indexes | Permet aux utilisateurs d'avoir des indexes générés par le serveur. C'est à dire si l'index du répertoire (index.htm le + souvent) est manquant, cela autorise le serveur à lister le contenu du répertoire (dangereux suivant les fichiers contenus dans ce répertoire). |
FollowSymLinks | Autorise à suivre les liens symboliques. |
ExecCGI | Autorise à exécuter des scripts CGI à partir de ce répertoire. |
Includes | Autorise des fichiers include pour le serveur. |
IncludesNOEXEC | Permet les includes mais empêche la commande EXEC (qui permet d'exécuter du code). |
Multiviews | Autorise les vue multiples suivant un contexte. Cela permet par exemple d'afficher les pages dans un language suivant la configuration du langage du client. |
SymLinksIfOwnerMatch | Autorise à suivre les liens seulement si le user ID du fichier (ou répertoire) sur lequel le lien pointe est le même que celui du lien. |
AllowOverride : définit comment sont gérés les fichiers .htaccess de ce répertoire:
All | Gère tout ce qui est dans .htaccess |
AuthConfig | Active les directives d'autorisations AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require |
FileInfo | Active les directives d'autorisations AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority |
Limit | Active la directive d'autorisation Limit |
None | Ne lit pas le fichier .htaccess et laisse les droits "Linux" de ce répertoire. |
Options | Active la directive Option |
Order : Donne l'ordre d'application des règles Allow Deny:
deny,allow | Applique les règles deny puis allow |
allow,deny | Applique les règles allow puis deny |
Allow (ou deny):
Nom d'hôte | Autorise les hôtes spécifié, les adresses IP, le nom de domaine, etc..(ou les refuse si la règle est deny) |
All | Autorise tout le monde (ou refuse) |
</Directory> : Indique la fin des règles pour ce répertoire.
A 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.
AccesFileName .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:
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
pour interdire aux visiteurs la possibilité voir le contenu des fichiers .ht qui contiennent les règles de sécurité.
#CacheNegotiatedDocs
Autorise ou pas les proxies à mettre en cache les documents (pour autoriser, enlevez le commentaire # en début de ligne)
UseCanonicalName On
Sur on, remet l'url par rapport aux valeurs "Server" et "Port" spécifié plus haut dans le fichier httpd.conf, sur off utilise l'url que le client a utilisée. Attention , mettre 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 text/plain
Type mime par défaut que le serveur renvoie aux clients. Convient dans la plupart des cas. Si par-contre votre serveur web envoie principalement des images, du streaming, etc... modifiez la valeur par
"application/octet-stream" pour éviter que les clients essaient de visualiser du binaire (ce qui va leur donner comme résultat des "ù*$kfdPmm%ù" au lieu d'afficher une video par exemple. Le client doit pouvoir prendre en compte alors le fichier grâce à un plugin et il doit avoir ses types mimes configurés pour lancer l'application associée.
HostNameLookups off
Indique si le serveur enregistre le nom (sur on) du client ou l'adresse IP (sur off)
ErrorLog /var/log/error_log
Chemin complet du fichier où les erreurs apaches seront enregistrées
LogLevel warn
Niveau d'enregistrement des erreurs avec comme valeurs possibles:
emerg | Enregistre seulement les erreurs qui rendent le serveur inutilisable |
Alert | "emerg" + erreurs nécessitant une intervention. |
Crit | "emerg" + "Alert" + erreurs critiques (accès réseau impossible par exemple) |
error | "ermerg" + "Alert" + "Crit" + erreurs dans les pages, les scripts |
warn | "ermerg" + "Alert" + "Crit" + "error" + erreurs non bloquantes (pages mal codées, scripts comportant des erreurs non bloquantes...) |
info | "ermerg" + "Alert" + "Crit" + "error" + "Warn" + toutes les informations générées |
debug | Enregistre TOUT ce qui peut se passer sur le serveur (un client demande une page: on enregistre) |
La plupart du temps, le niveau warn suffit (info et debug fournissent trop d'informations)
ServerSignature on
Si on ajoute la signature (version, OS...) du serveur lorsqu'il génère des pages lui même (index manquant, erreur de script, etc....) , off ne nontre que l'erreur, et sur Email ajoute un lien vers l'email définit plus haut dans ce fichier.
Alias faux_nom nom_réel
permet de faire des alias de répertoires (des liens en quelque sorte)
ScriptAlias /cgi-bin/ chemin_complet_des_cgi
Alias pour les scripts CGI
AddType type extensions
Permet de définir des extensions de fichiers pour des applications (mime type). Si on veut ajouter le support PHP4, on doit ajouter ici:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Ou pour du PHP3:
AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php3-source .phps
Il faut en plus que vous ayez compiler PHP en module DSO (module dynaique) et ajouter les lignes modules comme décrit plus haut pour activer le support PHP (voir la doc d'installation de PHP).
' AddHandler cgi-script .cgi'
Pour utiliser les scripts CGI.
Et enfin les définitions de "virtual host" pour faire des serveurs virtuels suivant des répertoires, etc...
<VirtualHost ip_ou_adresse_virtuelle>
ServerAdmin email_webmaster@hoste_virtuel
DocumentRoot racine_hote_virtuel
ServerName nom_server_virtuel
ErrorLog chmein_complet_errorlog
</VirtualHost>
Explication sur les VirtualHost:
Les virtualhosts permettent de mettre plus d'un site web par IP, en les appelant par nom de domaine ou par IP. Ce qui permet d'avoir des centaines de sites sur un serveur n'ayant qu'une seule IP (c'est comme cela que font tous les hébergeurs, ils ne prennent pas une nouvelle IP pour chaque nouveau client hébergé).
Par exemple, votre serveur web héberge deux sites web d'url: www.domaine1.com et www.domaine2.com, et a comme adresse IP: 80.10.20.30, voici comment définir les deux VirtualHost:
NameVirtualHost 80.10.20.30
<VirtualHost 80.10.20.30>
ServerAdmin webmaster@domain1.com
DocumentRoot /home/domain1/www
ServerName www.domain1.com
ErrorLog /var/log/apache/domain1-error.log
CustomLog /var/log/apache/domain1-access.log combined
ServerAlias domain1.com
</Virtualhost>
<VirtualHost 80.10.20.30>
ServerAdmin webmaster@domain2.com
DocumentRoot /home/domain2/www
ServerName www.domain2.com
ErrorLog /var/log/apache/domain2-error.log
CustomLog /var/log/apache/domain2-access.log combined
ServerAlias domain2.com
</Virtualhost>
NameServer permet de définir sur quelle IP les virtualhosts sont définis.
<VirtualHost> permet de définir un nouvel hôte virtuel apache, avec son adresse IP associée. En combinaison avec la directive ServerName il définit aussi le nom avec lequel le serveur doit etre appelé. Cela signifie que si le serveur reçoit une requête sur son IP 80.10.20.30 avec le nom "www.domain1.com", le serveur va donc fournir les pages webs contenues dans /home/domain1/www (grâce à la directive DocumentRoot).
De la même facon, il va fournir les pages de /home/domain2/www si on appelle celle-ci avec l'url www.domain2.com.
Pour que cela fonctionne, il faut bien sur qu'un serveur DNS soit configuré pour faire pointer www.domain1.com et www.domain2.com sur l'IP 80.10.20.30.
Les directives ErrorLog et Customlog permettent de définir les fichier logs de chaque hôte virtuel (autrement les logs s'ajouteront aux logs principaux du serveur défini dans les directives en dehors de la directive <VirtualHost>.
ServerAlias permet d'indiquer sous quel autre nom l'hôte virtuel peut etre appelé (ici domainX.com en plus de www.domainX.com), bien sur là aussi le serveur DNS doit être configuré pour faire pointer domainX.com sur 80.10.20.30
Une autre facon de faire des hôtes virtuels, si on n'a pas plusieurs noms de domaine, est de la faire par IP ou par IP et Port.
Par IP, il suffit de faire des <VirtualHost ip1> et <VirtualHost ip2> etc... , et par port il suffit de faire des <VirtualHost ip:port1> <VirtualHost ip:port2>
Il faut aussi des directives de Bind et Listen sur chaque IP et port supplémentaire (voir les directives Listen et Bind plus haut dans ce document).
Dans chaque virtualhost, vous pouvez aussi ajouter d'autres directives, comme les directives de ScriptAlias (pour l'exécution de cgi), de Directory (option des répertoires du site), ... En gros, toutes les directives peuvent être redéfinies dans chaque VirtualHost pour configurer le site web virtuel. Voir pour cela la documentation officielle d'apache. Pour chaque directive, il est spécifié si elle peut être utilisé dans un contexte de VirtualHost ou pas.
Voilà donc pour les principales directives utilisées dans httpd.conf. D'autre directives existent (voir la doc officielle), et les modules chargés par apache ajoutent eux aussi des directives spécifiques (voir la documentation du module ajouté).
Autres ressources
@ Retour à la rubrique Réseau et sécurité
Copyright
Copyright © 15/10/1999, Serge Tchesmeli
Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la Licence pour documents libres, Version 1.1 publiée par la La Guilde des Doctorants. Pour plus d'informations consulter la LDL sur le site de La Guilde des Doctorants. |