Dequidt.org - Serveur Web Apache v.2

Serveur Web Apache v.2

Ce document a pour but d'expliquer succintement comment configurer un serveur apache2 pour heberger un ou plusieurs sites web. Ce document traite des serveurs virtuels (virtual host), du protocole https (web sécurisé SSL) ainsi que de la sécurisation avec les htaccess.

Installation de apache2

Le serveur

Il est possible d'utiliser plusieurs types de gestion du serveur :

Pour installer apache2 sous Debian :

apt-get install apache2 apache2-common apache2-mpm-worker apache2-utils libapr0 openssl ssl-cert

PHP

Pour heberger des pages dynamique écrites en php :

apt-get install libapache2-mod-php4 php4-cli php4-common php4-gd php4-imap php4-mysql libzzip-0-12

Perl (CGI)

Pour utiliser les script Perl (cgi) avec apache2 :

apt-get install libapache2-mod-perl2 libdevel-symdump-perl libwww-perl

Structure du repertoire de configuration (/etc/apache2)

En général, le repertoire de configuration se situe dans /etc/apache2. Il contient les fichiers et repertoires suivant :

Limitations des connexions contre les DoS

Pour éviter les Dénis de Services (DoS), il est important de régler quelques paramètres dans /etc/apache2/apache2.conf selon votre connexion :

# KeepAlive: Autoriser les connexions permanentes
KeepAlive On
# MaxKeepAliveRequests: Nombres de connexion permanentes (il est conseillé de 
# laisser une valeur élevée sauf si vous utilisez une machine peu performante)
MaxKeepAliveRequests 50
# KeepAliveTimeout: TimeOut d'une connexion permanente (laisser tel quel)
KeepAliveTimeout 15
##
## Server-Pool Size Regulation (MPM specific)
## 
# prefork MPM !!!PAS UTILISE : apache2-mpm-prefork!!!
<IfModule prefork.c>
  StartServers 3
  MinSpareServers 3
  MaxSpareServers 10
  MaxClients 15
  MaxRequestsPerChild 0
</IfModule>
# pthread MPM !!! apache2-mpm-worker !!!
# StartServers ......... Nombre de processus serveur lancé au démarrage
# MaxClients ........... Nb de maximum processus serveur autorisé (nb de clients)
# MinSpareThreads ...... Nombre minimum de threads disponibles
# MaxSpareThreads ...... Nombre maximum de threads disponibles
# ThreadsPerChild ...... Nombre constant de threads par serveur
# MaxRequestsPerChild .. Nombre Maximum de requetes acceptées par serveur
#
# Ces paramètres sont à configurer selon la puissance de votre machine
# et le débit de votre connexion internet. Si vous souhaitez utiliser
# apache avec un petite connexion (128kb/s d'upload), divisez par 2 voire 3
# les paramètres MaxClients, MinSpareThreads, MaxSpareThreads et ThreadsPerChild
#
<IfModule worker.c>
  StartServers 2
  MaxClients 100
  MinSpareThreads 20
  MaxSpareThreads 65
  ThreadsPerChild 20
  MaxRequestsPerChild 0
</IfModule>

# perchild MPM !!!PAS UTILISE : apache2-mpm-perchild!!!
<IfModule perchild.c>
  NumServers 3
  StartThreads 3
  MinSpareThreads 3
  MaxSpareThreads 10
  MaxThreadsPerChild 20
  MaxRequestsPerChild 0
  AcceptMutex fcntl
</IfModule>
   

Gestion des erreurs

Lorsqu'une requetes ou une de vos pages génére une erreur, apache affiche une page d'erreur. La fameuse erreur 404 pour une page inexistante.

Vous pouvez utilisez les pages par défault de apache ou créer une page personnalisée. Cette dernière est toujours plus conviviale et montre que vous soigner votre site. Vous pouvez aussi créer un script qui envoye par exemple un email avec des informations (page référente...).

Il y a plusieurs manières de configurer ces pages.

Directe

Remplacer, par exemple, la ligne de apache2.conf :

ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var

par celle-ci en écrivant entre guillemets ce que vous voulez afficher :

ErrorDocument 404 "Page inconnue par le serveur. Contactez l'admin <a href=...."

Redirection locale

Je vous conseille de creer un nouveau repertoire /var/www/erreur dans lequel vous mettrait vos pages d'erreur.

Dans ce cas il faut changer les lignes de apache2.conf:

  Alias /error/ "/usr/share/apache2/error/"
  <Directory "/usr/share/apache2/error">

par

  Alias /error/ "/var/www/error/"
  <Directory "/var/www/error">

Pour ne pas avoir de problème, copier dans un premier temps les pages d'erreurs par défault dans ce répertoire :

cp /usr/share/apache2/error/* /var/www/error/

puis affecter l'utilisateur apache (www-data) comme propriétaire du repertoire et de ses fichiers :

chown -R www-data:www-data /var/www/error

Le nom des pages est du type HTTP_NomErreur.html.var .

Vous pouvez personnaliser ces pages :

Content-language: fr
Content-type: text/html; charset=ISO-8859-1
Body:----------fr--
<!--#set var="CONTENT_LANGUAGE" value="fr" -->

devant le corps de votre page de la langue choisie (ici fr : français).

Pour mettre une autre langue, ajoutez un autre bloc du meme type et le corps correspondant à la suite ...

#ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
ErrorDocument 404 /error/mapage_404.php

Redirection extérieur

Meme principe que la redirection locale sauf que le serveur va chercher les pages d'erreur sur un autre serveur. Exemple :

ErrorDocument 503 http://autre.serveur.com/ausecours.html

Gestion des logs

Je traiterai de cette partie, au moment ou je ferai la doc sur la génération de statitisques (webalizer ou awstats).

Virtual Hosts

Supposons que votre serveur héberge plusieurs sites.

Dans le cas général, pour accéder à vos différents sites vous tapez une adresse tel que http://mondomaine.com/site1, http://mondomaine.com/site2 ... Grace aux hotes virtuels d'apache2 vous pouvez par exemple acceder à ces sites avec les adresse http://site1.mondomain.com, http://site2.mondomain.com, ...

Je vous conseille de stocker vos sites dans /var/www/ (i.e. : /var/www/site1/, /var/www/site2/).

Comme expliqué plus haut, les fichiers de config des virtual hosts ce trouvent dans /etc/apache2/sites-available/. Allez dans ce repertoire. Pour commencer la configuration le plus simple est de copier la configuration par default puis la modifier :

cd /etc/apache2/site-available
cp default site1

Editez site1 :

# Nom du Virtualhost : port ( ici site1:80 (port http) )

<VirtualHost site1:80>
   ServerAdmin webmaster@mondomain.com
   # Nom du serveur
   ServerName site1

   # Définition du répertoire racine du site toto
   DocumentRoot /var/www/site1/
   <Directory />
      Options FollowSymLinks
      AllowOverride None
   </Directory>

   # Définition du répertoire racine du site1
   <Directory /var/www/site1/>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      Allow from all
   </Directory>

 
   # Pour inserer un repertoire de script (cgi)
   # Enlever cette section si vous n'utilisez pas de tel script
   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   <Directory "/usr/lib/cgi-bin">
      AllowOverride None 
      Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
      Order allow,deny
      Allow from all
   </Directory>

   # Si on veut un fichier de logs d'erreur propre à site1
   ErrorLog /var/log/apache2/error_site1.log
   LogLevel warn

   # Si on veut un fichier de logs d'accès propre à site1
   CustomLog /var/log/apache2/access_site1.log combined
   ServerSignature On

   # Insere le repertoire contenant les icones correspondant
   # aux type MIME
   Alias /icons/ "/usr/share/apache2/icons/"
   <Directory "/usr/share/apache2/icons">
      Options Indexes MultiViews
      AllowOverride None
      Order allow,deny
      Allow from all
   </Directory>

   # Insere le repertoire contenant la documentation apache
   # ce repertoire n'est accessible qu'en local
   # Section à enlever sur un serveur de production
   Alias /doc/ "/usr/share/doc/"
   <Directory "/usr/share/doc/">
      Options Indexes MultiViews FollowSymLinks
      AllowOverride None
      Order deny,allow
      Deny from all
      Allow from 127.0.0.0/255.0.0.0 ::1/128
   </Directory>

</VirtualHost>

Pour activer ce site, il vous faire le lien symbloqiue vers ce fichier dans /etc/apache/sites-enabled et relancez apache :

ln -s /etc/apache2/sites-available/site1 /etc/apache2/sites-enabled/
/etc/init.d/apache2 reload

Pour tester, il suffit de tapez http://site1.mondomain.com. Et là, çà marche pas !!

C'est normal, car votre ordinateur ne sait pas résoudre site1.mondomain.com (obtenir l'adresse ip).

Pour resoudre ce problème, soit vous installez un serveur DNS (cf howto Bind) si vous souhaitez que votre serveur virtuel soit accessible depuis l'extérieur, soit pour tester modifiez votre /etc/hosts (ajoutez site1.mondomain.com à la fin de la ligne de l'ip du serveur ):

127.0.0.1 localhost site1.mondomain.com #par exemple

Relancez Apache et cela devrait marcher cette fois-ci.

Vous pouvez faire çà autant de fois que vous voulez avoir d'hôtes virtuels.

Support SSL sur Apache 2

Création des certificats

Sous Debian, pour générer les certificats de votre site, utiliser la commande :

apache2-ssl-certificate

Je vous laisse le soin si vous le souhaiter de générer vos certificats vous-memes. Par contre, il est conseillé de mettre ces certificats dans le repertoire /etc/apache2/ssl/.

Configuration de Apache

Apache 2 est installé avec le module ssl sous Sarge. Il ne s'agit pas d'un paquet supplémentaire.

Il suffit de le charger (il existe 2 manières):

Il vous faut ensuite éditer le fichier ssl.conf. Ajouter simplement une ligne à la fin du fichier (avant le </IfModule>):

SSLCertificateFile /etc/apache2/ssl/apache.pem

Ensuite, ajoutez au fichier ports.conf la ligne suivante :

Listen 443

Configuration de votre VirtualHost

Deux possibilités :

NameVirtualHost *:443
<VirtualHost *:443>
  ServerAdmin yourmail@mail.com
  SSLEngine on
  DocumentRoot /var/www/
  <Directory />

    Options FollowSymLinks AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews AllowOverride None
    Order allow,deny allow from all
    RedirectMatch ^/$ /apache2-default/
  </Directory>
</VirtualHost>

HTAccess et autres ...

Les fichiers “.htaccess” permettent de donner des directives au serveur apache. Je vais aborder seulement le côté limitation d'accès aux fichiers. Ces fichiers sont mis dans le répertoire ou un sous repertoire des sources du site. Les directives définies dans ce fichier sont applicables au répertoire dans lequel il se trouve et dans ses sous-répertoires.

Rmq : Sous unix, le fichier .htaccess est un fichier caché. (vous pouvez le lister dans un repertoire avec la commande “ls -a”).

Restriction d'accès

Directive Order

Cette directive permet de définir l'ordre d'évaluation des directives Deny et Allow

Par default, l'ordre est Deny,Allow.

Attention il ne faut aucun espace entre Allow et Deny, seulement une virgule.

Directive Allow

Cette directive définie les clients autorisés à accéder au serveur. Le client peut être un nom de machine, une adresse ou une plage d'IP. Le premier argument de cette directive est toujours from :

Allow from ...

Les arguments suivants peuvent être de 3 formats différents. Si “Allow from all” est spécifié, tous les clients ont le droit d'accès. Pour autoriser l'accès seulement à certaines machines ou groupes de machines, celles-ci doivent être définies comme suit :

Directive Deny

Cette directive définie les clients interdit d'accès au serveur. Le client peut être un nom de machine, une adresse ou une plage d'IP. Les arguments sont identiques à la directive Allow.

Autorisations à certains utilisateurs ou groupes d'utilisateurs

On peut limiter l'accès au serveur aux utilisateurs ayant un mot de passe. Pour cela, il faut un fichier .htpasswd et rajouter quelques directives dans le fichier .htaccess correspondant au répertoire devant être protégé. Il est possible de filtrer aussi par groupe d'utilisateur avec le fichier .htgroup.

.htpasswd

Ce fichier contient le nom des utilisateurs et leur mot de passe associé (au format CRYPT). Pour ajouter un utilisateur à ce fichier, il faut utiliser la commande htpasswd2 (pour apache2) comme ceci :

htpasswd2 -c .htpasswd utilisateur #une première fois (lorque le fichier n'existe pas)
htpasswd2 .htpasswd utilisateur
.htgroup

Ce fichier contient la liste des groupes et les utilisateurs correspondants. Le format est :

groupe1: utilisateur1 utilisateur2
groupe2: utilisateur1 utilisateur3
.htaccess

Pour activer la protection, il suffit d'ajouter ces lignes dans le fichier .htaccess :

AuthName "Il faut un pwd pour entrer !!!"
AuthUserFile /rep/ou/se/trouve/.htpasswd
AuthGroupFile /rep/ou/se/trouve/.htgroup
AuthType Basic
require group groupe1
require user utilisateur5