17 May 2011

Apache, Les bonnes pratiques

Introduction

Maintenir et garder une configuration propre lorsque l’on héberge plusieurs sites Internet ou plusieurs logiciels n’est pas chose aisée. En effet, il existe bon nombre de fichiers de configuration depuis la version 2 de Apache. Ce Guide vous expliquera comment créer des fichiers de configuration afin de garder une certaine harmonie et surtout quel syntaxe utiliser.

Il est recommandé de vous expérimenter sur un serveur de test, car une mauvaise configuration de votre serveur Apache peut affecter les sites déjà fonctionnels.

Avant de vous lancer, il est également conseillé de faire des sauvegardes de vos fichiers avec la commande suivante.

cp -R /etc/apache2/ /etc/apache2.backup/

Vous pourrez ainsi facilement revenir à la configuration d’orignine en tapant la commande suivante.

rm -rf /etc/apache2/ # < Supprime tous les fichiers de configurations Apache
cp -R /etc/apache2.backup/ /etc/apache2/ # < Copie tous les fichiers depuis la sauvegarde

Quelques notions à connaitre

Afin de bien comprendre le contenu de ce guide, il est nécessaire de connaitre quelques termes utilisé dans Apache.

Hôte virtuel

Lorsque vous hébergez plusieurs sites web sur le même serveur, chaque site est nommé Hôte virtuel. Ainsi, il est possible d’héberger plusieurs sites avec du contenu différent pour chaque site avec une seule installation d’Apache.

Note : Votre serveur Apache est la plupart du temps accessible aussi bien via une adresse IP que via son nom d’hôte ou encore un nom de domaine. Dans tous les cas, il faudra créer un Hôte virtuel dans chacun de ces cas de figure. Il est donc possible de mettre un site différent lorsqu’on tape l’adresse IP du serveur ou bien si on tape le nom d’hôte.

Voici un exemple de syntaxe d’hôte virtuel :

<Virtualhost *:80>
  ServerName "Nom_de_domaine.com"
  DocumentRoot "Chemin_racine"
</Virtualhost>

Alias

Par défaut, lorsque vous tapez /nom_de_dossier derrière une adresse de votre serveur, le serveur va chercher un dossier du même nom dans la racine de votre site. Si vous souhaitez que /nom_de_dossier pointe vers un autre dossier, vous devrez créer un alias avec la syntaxe suivante :

Alias /url_source /chemin_de_destination

L’Alias est particulièrement pratique lorsque vous installez une application web dans un emplacement différent de celui de votre site racine.

Dossiers et fichiers existants par défaut

Lorsque vous installez Apache pour la première fois, il existe déjà un certain nombre de fichiers de configurations. Nous allons décrire le rôle de chacun des fichiers ou dossiers.

  • apache2.conf : C’est le fichier principal de Apache, en principe, il n’est pas nécessaire de le modifier car il contient l’emplacement des logs et autres formats que nous ne souhaitons pas changer ici.
  • envvars : Ce fichier contient les variables d’environnement. Ce sont des variables qui sont définie lors du lancement d’apache pour l’utilisateur Apache. Nous n’allons pas toucher à ce fichier ici.
  • httpd.conf : Ce fichier est vide et présent pour des raisons historiques. Nous n’allons pas toucher à ce fichier ici.
  • ports.conf : Ce fichier contient les ports TCP que Apache doit ouvrir. Par défaut, ce sont les ports 80 pour http et 443 pour https, ce paramétrage nous conviens très bien, nous n’allons pas toucher à ce fichier ici.
  • conf.d : Ce dossier contient tous les fichiers de configurations spécifiques d’un logiciel web. Par exemple, si nous installons phpmyadmin, c’est dans ce dossier que le fichier de configuration viendra se ranger.
  • mods-available : Ce dossier contient tous les fichiers de configurations disponibles spécifiques aux modules d’Apache. En principe, il n’est pas nécessaire de modifier les fichiers contenus dans ce dossier.
  • mods-enable : Ce dossier contient généralement des liens symboliques de fichiers contenus dans le dossier mods-available. Nous verrons plus loin comment activer ou désactiver des modules simplement.
  • sites-available : Ce dossier contient tous les fichiers de configurations disponibles spécifiques aux sites web. Par exemple, si nous souhaitons héberger un site nommé www.iabsis.com c’est dans ce dossier que nous allons créer le fichier de configuration.
  • sites-enabled : Ce dossier contient tous les fichiers de configurations activés spécifiques aux sites web. Dans notre exemple, si nous souhaitons activer le site www.iabsis.com, un lien symbolique sera créer depuis le dossier sites-availables. Nous verrons plus loin comment faire.

Stockage des fichiers de configuration pour les logiciels

Lorsque vous installez une application web (comme phpmyadmin, roundcube ou autre), il est recommandé de créer un fichier de configuration dans le dossier /etc/apache2/conf.d/ qui est dédié pour cet usage.

Note : lorsque vous installez un logiciel via le système de paquetage de votre distribution linux, la plupart créer le fichier de configuration pour vous à cet emplacement. Vérifiez donc que vous n’allez pas créer un doublon dans ce cas précis.

Admettons maintenant que nous ayons un logiciel installé dans le dossier /usr/share/monlogiciel/ et que nous souhaitons accéder à ce logiciel avec l’url http://serveur/monlogiciel/ il sera nécessaire de faire la commande suivante :

nano /etc/apache2/conf.d/monlogiciel

Puis de coller les lignes suivantes :

# Création d'un alias pour le logiciel monlogiciel
Alias /monlogiciel /usr/share/monlogiciel/

Il est nécessaire ensuite de redémarrer Apache pour que le nouveau fichier de configuration soit pris en compte.

/etc/init.d/apache2 restart

Désormais, votre logiciel est disponible à l’adresse http://ip_du_serveur/monlogiciel/ ou http://nom_du_serveur/monlogiciel ou encore http://domaine_du_serveur/monlogiciel

Créer des hôtes virtuels

Lorsque vous souhaitez héberger plusieurs domaines différents sur un même serveur Apache, vous devrez créer des hôtes virtuels. La bonne pratique veut que l’on crée un fichier dans le dossier /etc/apache2/sites-available, le nom importe peu, mais nous conseillons d’utiliser le nom de votre domaine.

Vous souhaitez par exemple configurer exemple1.com et exemple2.com, dans ce cas, créez deux fichiers dans /etc/apache2/sites-available :

# Fichier /etc/apache2/sites-available/exemple1.com

<VirtualHost *:80>
  DocumentRoot /var/www/exemple1.com/
  Servername exemple1.com
</VirtualHost>

# Fichier /etc/apache2/sites-available/exemple2.com

<VirtualHost *:80>
  DocumentRoot /var/www/exemple2.com/
  Servername exemple2.com
</VirtualHost>

Vous devrez ensuite activer ces fichiers de configurations :

a2ensite exemple1.com exemple2.com

Vous pourrez facilement désactiver un site si vous ne souhaitez plus l’utiliser ou si le fichier de configuration est faux avec la commande :

a2dissite exemple1.com

Enfin pour prendre en compte tous les changements, il faut redémarrer apache :

/etc/init.d/apache2 restart

Si vos hôtes virtuels ne fonctionnent pas, vérifier que le fichier /etc/apache2/ports.conf contient la ligne NameVirtualHost *:80

Activer et utiliser Ssl

Lorsque vous souhaitez utiliser le port https (443) avec ssl, vous devrez configurer apache afin qu’il prenne en compte vos certificats.

Création de vos certificats

Avant de pouvoir utiliser ssl, vous devrez créer une paire de certificat, un privé et un public. Le certificat public est envoyé au navigateur qui souhaite crypter la session. Lorsque le navigateur souhaite envoyer des informations au serveur tel que des informations bancaires, il crypte les données à l’aide du certificat public qui ne permet pas de décrypter l’information ensuite. Seul le certificat privé permet ensuite de décrypter les données. Il est donc évident que le certificat privé ne doit être en aucun divulgué.

Création du dossier qui contiendra les certificats :

mkdir -p /etc/apache2/ssl/ctr/
mkdir -p /etc/apache2/ssl/key/

Le certificat ne fonctionnant que pour un hôte virtuel, nous allons donner au certificat le nom du domaine (ici exemple1.com).

  • Création de la clef privée :
cd /etc/apache2/ssl/key
openssl genrsa -out exemple1.com.key 1024
  • Création du certificat public signé avec la clef:
cd /etc/apache2/ssl/ctr
openssl req -new -x509 -days 365 -key ../key/exemple1.com.key -out exemple1.com.crt

Saisissez ensuite les informations demandé

Enter PEM pass phrase: Un mot de passe de votre choix
Verifying - Enter PEM pass phrase: Confirmer votre mot de passe

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: Ma région
Locality Name (eg, city) []:Ma région
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Mon nom ou société
Organizational Unit Name (eg, section) []: Mon secteur d'activité
Common Name (eg, YOUR name) []:exemple1.com
Email Address []: Mon email

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: Laisser vide
An optional company name []:Laisser vide

Enfin, si vous voulez faire signer la clef auprès d’une autorité (verisign, geotrust,…) vous devrez lui fournir le contenu de la clef publique :

cat /etc/apache2/ssl/crt/exemple1.crt

Copiez/collez dans le champs dédié lors du paiement de votre certificat. Vous devriez ensuite recevoir deux clefs :

  • Le certificat public signé qu’il faut remplacer par l’ancien certificat :
mv /etc/apache2/ssl/crt/exemple1.com.crt /etc/apache2/ssl/crt/exemple1.com.crt.origin
nano /etc/apache2/ssl/crt/exemple1.com.crt

Dans l’éditeur, collez votre clef, puis quittez en tapant CTRL+X puis o pour sauvegarder.

  • Le certificat intermédiaire, qui permet au navigateur de vérifier le certificat public à partir des certificat racine qu’il connait.
nano /etc/apache2/ssl/crt/intermediate.crt

Dans l’éditeur, collez votre clef intermédiaire, puis quittez en tapant CTRL+X puis o pour sauvegarde.

Configuration d’Apache

Si vous avez déjà le fichier /etc/apache2/sites-available/exemple1.com éditez ce fichier, et ajoutez les lignes suivantes :

<VirtualHost *:443>
        ServerName exemple1.com
        DocumentRoot /var/www/exemple1.com/
	SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/crt/exemple1.com.crt
        SSLCertificateKeyFile /etc/apache2/ssl/key/exemple1.com.key
        SSLCACertificateFile /etc/apache2/ssl/crt/intermediate.crt
</VirtualHost>

Vérifiez éventuellement que vous ayez bien les lignes suivantes dans le fichier /etc/apache2/ports.conf ou quelque part dans votre configuration :

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Enfin redémarrez Apache et vérifiez que votre configuration fonctionne :

/etc/init.d/apache2 restart

Combinaisons et options supplémentaires

Il est intéressant maintenant de combiner ce qui a été dit précédemment. Voici quelques exemples.

Combiner un Hôte Virtuel avec un Alias

Dans cet exemple, on inclut un Alias dans un Hôte virtuel :

<VirtualHost *:80>
  DocumentRoot /var/www/exemple1.com/
  Servername exemple1.com
  Alias /images /usr/share/images/
</VirtualHost>

Ainsi, lorsqu’on tape dans le navigateur l’adresse http://exemple1.com/images/, Apache ne va plus chercher dans /var/www/exemple1.com/images mais bien dans /usr/share/images. Ceci est particulièrement pratique si vous avez une librairie partagées pour plusieurs applications.

On notera que cet Alias ne fonctionnera que pour le domaine exemple1.com, si nous avons exemple2.com, l’alias ne sera pas défini.

Avoir plusieurs domaine dans un hôte virtuel

Si vous souhaitez par exemple que l’adresse exemple1.com et www.exemple1.com (qui est considéré comme un sous-domaine) soit configuré sur le même hôte virtuel, il suffit d’utiliser l’exemple suivant :

<VirtualHost *:80>
  DocumentRoot /var/www/exemple1.com/
  Servername exemple1.com
  ServerAlias www.exemple1.com
</Virtualhost>

Activer les fichiers .htaccess

Si pour des raisons diverses vous souhaitez utiliser des fichiers htaccess, il faut l’autoriser dans votre configuration. Ajouter les lignes suivantes dans votre VirtualHost par exemple :

Comme ceci :

<VirtualHost *:80>
  DocumentRoot /var/www/exemple1.com/
  Servername exemple1.com
  ServerAlias www.exemple1.com

  # On autorise ici l'utilisation des fichiers .htaccess  
  <Directory /var/www/exemple1.com/
    AllowOverride All
  </Directory>

</Virtualhost>

On remarque ici l’utilisation de la balise Directory qui permet de spécifier des règles pour un dossier en particulier. Comme l’utilisation de AllowOverride affecte ici l’utilisation des fichiers stockés localement, on doit utiliser cette balise.

Conclusion

Il existe bien évidemment de nombreuses autres configurations et options possibles, mais elles seront généralement basée sur le même principe que ceux fournis dans ce guide.

N’hésitez pas à rechercher sur Internet ce que vous souhaitez faire ou bien encore consulter la documentation officielle à la page suivante :

http://httpd.apache.org/docs/2.2/


Tags: