Table des matières

Introduction à la configuration d'Apache (1.3.23)

grep -n "UserDir" /etc/httpd/conf/httpd.conf
grep -ni "alias" /etc/httpd/conf/httpd.conf
grep -ni "alias" /etc/httpd/conf/commonhttpd.conf
* Il est prudent de sauvegarder le fichier de configuration d'origine. Pour vérifier la syntaxe de ce fichier, passser la commande:
httpd -t

Configuration de base

/etc/httpd/conf/httpd.conf. Ce fichier pour certaines installations est maintenant scindé en deux parties httpd.conf et commmonhttpd.conf Observer que le fichier commmonhttpd.conf est inclus dans le fichier de base httpd.conf, par la directive :

Include conf/commmonhttpd.conf (ligne 117)

Même si l'on a pas de raisons de les modifier, il est instructif de les parcourir pour découvrir les principales clauses paramétrables. Ce qui suit est la description des principaux paramètres, et leur valeur attribuée par défaut à l'installation.

Le serveur s'exécutera seul, sans recourir au super-serveur xinetd.

Il s'agit du répertoire où le serveur trouvera son répertoire de configuration conf On trouve dans /etc/httpd, un lien vers /var/log/httpd/access_log, le fichier-journal des accès aux ressources, réussis ou non (le consulter)

C'est le fichier où le serveur en exécution stocke son premier numéro de processus (PID)

fixe la racine du serveur Web, c'est-à-dire le répertoire de base où sont cherchées par défaut les pages html, lorsque l'URL ne comporte pas de chemin de répertoire

Apache écoute sur le port tcp usuel

Group apache Apache doit etre démarré par root, mais par sécurité ses processus auront pour propriétaire l'utilisateur apache, sans privilège.

S'il a un problème, le serveur écrit un message à cette adresse

Ce paramètre signifie que l'utilisateur toto peut publier ses pages WEB personnelles dans un sous-répertoire de son répertoire perso, qui doit être nommé public_html, c'est-à-dire dans /home/toto/ public_html. Sa page d'accueil sera alors accessible par l'URL : http://serveur/~toto , où serveur est le nom du serveur ou son adresse IP.

Il est courant d'omettre le nom du fichier de la page d'accueil d'un site ou de l'un de ses sous-répertoires. Pour ne pas retourner systématiquement une erreur 404 signalant une adresse erronnée, le serveur posséde une liste standard de noms de fichiers qu'il s'efforce de trouver dans le répertoire. Cette liste ordonnée est indiquée par la clause DirectoryIndex

Cette clause fixe le nom du fichier à trouver dans un répertoire pour que son accès soit protégé, en imposant à l'utilisateur une authentification par nom et mot de passe. Ces comptes sont spécifiques à Apache et n'interfèrent pas avec les comptes Linux. Voir cette page pour une explication de sa mise en oeuvre.

Les modules

Apache est un serveur modulaire. Autour d'un noyau qui rassemble les fonctions de base on peut inclure des modules de façon dynamique (à condition de s'y connaitre !). Il existe un module spécial mod_so qui permet justement ce chargement dynamique. Les directives incluses dans httpd.conf LoadModule chargent les modules dynamiques et AddModule précise l'ordre d'intégration des modules statiques et dynamiques. Par exemple voici les directives controlant le module PHP

LoadModule php4_module extramodules/libphp4.so
.....
AddModule mod_php4.so

Les modules dynamiques chargeables (fichiers .so) sont tous placés dans /usr/lib/apache2/modules/.

Pour connaitre les modules compilés avec le core :

apache2 -l

Voir la liste des modules chargés par apache :

apache2ctl -t -D DUMP_MODULES

Réglages d'exécution

Paramètre important qui fixe la durée (en secondes) d'attente maximum du serveur d'une réponse à une requete envoyée à un programme extérieur (comme un gestionnaire de base de données)

MaxKeepAliverequests 100

KeepAliveTimeout 15

Autorise les connexions persistantes d'un client, afin de lui permettre l'envoi de plusieurs requetes sans déconnexion, avec un plafond fixé pour un client, pour servir aussi d'éventuels autres clients ! et un temps d'attente maxi de la requete suivante provenant du meme client.

Fixe un nouveau nom public pour le serveur, auquel on pourra s'adresser par les URL http://www/ Bien entendu le nom symbolique www doit être connu du DNS ou du fichier hosts local (sous GNU/Linux ou MS/Windows)

MaxSpareServers 20 Nombres maximum et minimum de processus serveurs devant etre en permannence disponibles, en attente de nouvelles connexion clientes

Nombre de processus serveurs démarrés à l'initialisation, en plus du processus père. Ceci explique pourquoi la requete ps aux|grep httpd renvoie 5 PID.

Nombre maximum de processus qu'Apache peut lancer et gérer simultanément. Ce nombre ne peut pas excéder 254

Nombre maximum de requetes HTTP traitées par un processus enfant avant qu'il ne soit éliminé.

Controle des accès à un répertoire

Attention, contrairement aux permissions Unix, les clauses s'appliquent AUSSI à TOUS les sous-répertoires. En revanche, une directive <Directory rep> spécifique à l'un des sous-répertoires s'impose.

#--------------------- Global Access Configuration ------------------------
# Voici un exemple de paramétrage des permissions d'accès. Il est préférable
# d'etre restrictif à la racine et d'étendre les permissions à des répertoires spéciaux.

# Politique par défaut : accès interdit à tous à partir de /
# (donc pour tout le système de fichier) sauf permissions à expliciter
<Directory />
order deny, allow
deny from all
Options None
AllowOverride None
</Directory>

# Pour la racine du serveur WEB, il faut bien permettre l'accès
<Directory /var/www/html>
# Options possibles : "None", "All", ou plusieurs combinaisons de:
# "Indexes", "Includes", "FollowSymLinks", "ExecCGI", ou "MultiViews".
Options Indexes Includes FollowSymLinks
# AllowOverride = All pour donner la priorité aux fichiers .htaccess
AllowOverride All
order allow,deny
# allow from = all pour permettre à tout le monde d'accéder aux documents
allow from all
</Directory>

# pour le répertoire contenant les scripts:

<Directory /var/www/cgi-bin>
AllowOverride None
Options ExecCGI
</Directory>

* Précisions sur la restriction des accès Pour un répertoire donné, dans son conteneur <Directory>, on peut préciser les hotes dont les requetes seront traitées, et ceux dont les requetes seront rejetés.

On précise d'abord une règle générale avec la directive order allow, deny ou l'inverse, qui précise la règle à appliquer aux machines qui figurent sur les listes explicites qui suivent les clauses allow from et deny from 1. order allow, deny : autorise les hotes de la liste allow, mais rejette ceux de la liste deny 2. order deny, allow : rejette les hotes de la liste deny, mais autorise ceux de la liste allow 3. exemple1 : soit à autoriser tout le réseau 172.16.0. sauf 172.16.0.25

# quel est le bon ordre : order deny, allow ou bien allow, deny ?
order .....
# par contre l'ordre relatif de ces 2 clauses suivantes n'a pas d'importance
allow from 172.16.0.0/255.255.255.0
deny from 172.16.0.25

4. exemple 2 : n'autoriser que certaines machines, par exemple la machine 172.16.0.100 et une machine voisine du meme réseau

Option signification All | None toutes | aucune option(s) permise(s) ExecCGI exécution de scripts autorisée FollowSymLinks le serveur suivra les liens symboliques rencontrés dans le répertoire Includes permet l'utilisation de SSI IncludesNOEXEC permet l'utilisation de SSI sauf les directives #exec et #include Indexes autorise l'affichage du contenu d'un répertoire (si un fichier par défaut n'y est pas trouvé)

Par défaut par sécurité, on choisit la valeur NONE (.htaccess est alors ignoré), et on positionne les autres valeurs qu'au cas par cas : ALL (prise en compte tatale), AuthConfig ou AuthUserFile (remplacement de AthName,AuthType et Require), ce qui est suffisant pour protéger l'accès à un site privé par une authentification.

Contrôle d'accès à un fichier

<Files fichier.html fichier2.html>

AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd
AuthGroupFile /usr/local/bin/www/httpd_1.3/basedenoms/.htgroup
AuthName AccesRestreint
AuthType Basic

<limit GET POST>
order deny,allow
deny from all
allow from .enst.fr
require group intranet
satisfy all
</Limit>


</Files>

Personnalisation

Les pages WEB personnelles

UserDir disable

UserDir enable jean toto ....
* Attention aux droits d'accès ! L'accès de tous à ces sites persos exige que le droit de parcours x soit accordé à tous les rép. des utilisateurs et à public_html(droits 771), et que le droit de lecture r soit bien sûr accordé aux fichiers des pages pour tous (droits 644)
* En utilisant UserDir /home/*/public_html, où * est remplacé par un nom d'utilisateur, celui-ci n'aplus besoin de posséder un compte sur le système.

.htaccess et .htpasswd

le fichier .htaccess

AuthName "Page d'administration protégée"
AuthType Basic
AuthUserFile "/home/sdz/www/gestion/admin/.htpasswd"
Require valid-user

Parmi ces 4 lignes, il y en a 2 que vous allez devoir changer :

le fichier .htpasswd

Apache fournit un outil permettant de générer facilement des mots de passe cryptés (aussi bien sous Windows que sous Unix), il s'agit de l'utilitaire htpasswd accessible dans le sous-répertoire bin d'Apache.

La syntaxe de cet utilitaire est la suivante :

htpasswd -c {chemin du fichier de mot de passe} utilisateur

htpasswd {chemin du fichier de mot de passe} utilisateur

Le mot de passe sera demandé en ligne de commande avec une confirmation. Voici un exemple :

htpasswd -c /www/secure/.htpasswd JFPillou

Utilisation d'alias de répertoires

# pour accéder à la doc directement avec l'url http://Serveur/doc
Alias /doc /usr/share/doc
# pour accorder les permissions d'accès limitées au site doc
<Directory /usr/share/doc>
order deny,allow
deny from all
# permission à partir de localhost
allow from localhost, 127.0.0.1
# permission à partir des stations du sous-domaine de l'établissement
allow from .bahut.ac-creteil.fr
Options Indexes FollowSymLinks
</Directory>

Héberger plusieurs sites WEB

httpd -f config

où config est le nom du fichier de configuration, avec son chemin absolu (sinon il est consiséré comme situé relativement à ServerRoot, c'est-à-dire /etc/httpd, par défaut.

Ainsi pour SLIS, il y a lancement dans /etc/rc.d/rc.local de /usr/sbin/httpd -f /etc/hadmin/conf/httpd.conf. Les paramètres usuels sont fixés ainsi :

ServerRoot /etc/hadmin
DocumentRoot /home/hadmin/html/
Port 1098

Les sites WEB virtuels

1. décommentez les lignes suivantes tout à la fin du fichier (enlevez le # devant la ligne) :

# pour indiquer où le paramétrage des sites vituels est décrit (relativement à /etc/httpd)
Include conf/vhosts/Vhosts.
# Pour activer les services virtuels
LoadModule vhost_alias_module modules/mod_vhost_alias.so
AddModule mod_vhost_alias.c

2. Exemple de modification dans /etc/httpd/conf/vhosts/Vhosts.conf pour mettre en place un site virtuel pour mon site LINUX, consultable à l'url : http://linux.bahut.ac-creteil.fr

################# Named VirtualHosts
NameVirtualHost 192.168.0.1
<VirtualHost 192.168.0.1>
ServerName linux
#ServerPath /domain
DocumentRoot /var/www/LinuxCours/formation
ErrorLog logs/linux-error_log
TransferLog logs/linux-access_log
</VirtualHost>

Voir la liste des vhosts :

apache2ctl -t -D DUMP_VHOSTS

Gestion et suivi des connexions

On peut utiliser aussi less /var/log/httpd/access_log puis Shift-F pour basculer à la fin du fichier en attente de données (Ctrl-C pour finir)

Le module PHP

On doit y trouver la directive d'inclusion du fichier de configuration de PHP : Include conf/addon-modules/php.conf, le chemin étant supposé relatif à /etc/httpd

LoadModule php4_module /usr/lib/apache/libphp4.so
AddModule mod_php4.c
AddType application/x-httpd-php .php .php4 .php3 .phtml
AddType application/x-httpd-php-source .phps

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 du être installé à part), par la présence de extension=mysql.so (en ligne 243)

php5 -m

Multiples Reverse-Proxy

http://apache.webthing.com/mod_proxy_html/ pour utiliser ProxyHTMLURLMap (module mod_proxy_html)

    ServerName author.example.com
    ProxyPass        /   ajp://localhost:8009/
    ProxyPassReverse /   ajp://localhost:8009/

    ServerName site1.example.com
    ProxyPass        /.magnolia/ ajp://localhost:8009/.magnolia/
    ProxyPass        /.resources/ ajp://localhost:8009/.resources/
    ProxyPass        /docroot/ ajp://localhost:8009/docroot/site1/
    ProxyPass        /dms/     ajp://localhost:8009/dms/site1/
    ProxyPass        /resources/     ajp://localhost:8009/resources/site1/
    ProxyPass        /         ajp://localhost:8009/site1/
    ProxyPassReverse        /.magnolia/ ajp://localhost:8009/.magnolia/
    ProxyPassReverse        /.resources/ ajp://localhost:8009/.resources/
    ProxyPassReverse /docroot/ ajp://localhost:8009/docroot/site1/
    ProxyPassReverse /dms/     ajp://localhost:8009/dms/site1/
    ProxyPassReverse /resources/     ajp://localhost:8009/resources/site1/
    ProxyPassReverse /         ajp://localhost:8009/site1/
    SetOutputFilter INFLATE;proxy-html;DEFLATE
    ProxyHTMLURLMap /docroot/site1/ /docroot/
    ProxyHTMLURLMap /dms/site1/     /dms/
    ProxyHTMLURLMap /resources/site1/     /resources/
    ProxyHTMLURLMap /site1/         /
   <Host name="site1.example.com" appBase="public"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
      </Host>
     
      <Host name="author.example.com" debug="0" appBase="author"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
      </Host>