Contactez-nous : 01 71 18 39 73 | contact@thecodingmachine.com
Suivez-nous sur Facebook

Configurer Apache sous Ubuntu

Directives, modules, fichiers de configuration... Vous avez déjà entendu ces mots mais ils vous paraissent peu familiers ?
La lecture de cet article devrait vous permettre d'en savoir plus sur la configuration globale d'Apache sur Ubuntu. Vous pourrez apprendre comment configurer SSL sur un serveur et comment configurer un fichier .htaccess.
Si vous souhaitez vous informer sur l'installation et la compilation d'Apache sur les autres plateformes et aller plus loin dans la configuration d’Apache voici la documentation officielle.

Fichiers de configuration

(apache2.conf)

La configuration globale d'Apache s'effectue sur la plupart des systèmes à l'aide d'un fichier qui se nomme httpd.conf, accompagné de plusieurs autres fichiers de configuration pour gérer des paramètres plus précis (ex. le fichier ports.conf, les fichiers .htaccess...)
Sous Ubuntu c'est le fichier apache2.conf qui est utilisé, le fichier httpd.conf existe mais est vide afin de maintenir la compatibilité avec des applications plus anciennes.

Note : Sur Wamp c'est httpd.conf qui est utilisé par défaut mais avec une stratégie d'écriture légèrement différente.

Ces fichiers de configuration sont de simples fichiers texte éditables avec n'importe quel éditeur de texte, ce qui rend la tâche globalement simple. Il est situé dans le répertoire /etc/apache2/apache2.conf.

attention

Si par exemple vous avez plusieurs sites web sur le même serveur, vous avez la possibilité de passer par des fichiers de conf intermédiaires pour faire de la configuration spécifique.
Pour ce faire, dirigez-vous vers les répertoires /etc/apache2/sites-available (contient les fichiers physiques) et vers le répertoire /etc/apache2/sites-enabled (contient les liens symboliques de ces fichiers de conf).
Vous devez d'abord créer et remplir votre fichier de configuration (que vous pouvez par exemple nommer nomdevotresite.conf) dans le dossier sites-available, puis créer un lien symbolique vers ce fichier dans le dossier sites-enabled de cette façon :

ln –s ../sites-available/{nom du fichier de conf}

Il existe des milliers de directives pour alimenter ces fichiers, nous allons en voir quelques unes.

Bon à savoir : Toute modification d’un fichier de configuration Apache nécessite un redémarrage pour être prise en compte. Voici la commande :

sudo /etc/init.d/apache2 restart


Les principaux tags Apache

Gestion des hôtes virtuelsOn se sert ici du tag <VirtualHost> avec lequel on a la possibilité de configurer plusieurs adresses IP et donc plusieurs certificats.
La directive NameVirtualHost est obligatoire pour mettre en place un VirtualHost.
Dans l’exemple suivant les directives incluses dans la balise VirtualHost s’appliquent seulement à cette adresse au port 80 :

# Note : L'adresse IP spécifiée est l'adresse du serveur
# Il est utile de la préciser seulement dans les RARES cas où le serveur a plusieurs IP
Listen 80
NameVirtualHost 172.45.46.43.23
<VirtualHost 172.45.46.43.23:80> 
	# Directives que l’on souhaite appliquer à cette adresse
< /VirtualHost >

<VirtualHost _default_:*>
DocumentRoot /www/default
</VirtualHost>

# On s’assure qu’Apache écoute sur le port 80
Listen 80
# Ecoute les requêtes de VirtualHost sur toutes les adresses IP
NameVirtualHost *: 80
<VirtualHost * :80> : Toutes les adresses IP au port 80

attention Attention: Ne pas mettre <VirtualHost + nom de domaine> car si le DNS n'est pas disponible, Apache ne démarrera pas, ou si on utilise un LoadBalancer, l'adresse IP retournée ne sera pas celle de notre machine.

Il existe un serveur par défaut dans Apache qui prend toutes les requêtes entrantes. On le spécifie à l’aide des directives DocumentRoot / ServerName

DocumentRoot : C’est ici qu’est précisé le répertoire racine du serveur. Les requêtes vont chercher par défaut index.php à la racine de ce répertoire.

ServerName (facultatif) : C’est le nom du site web, la directive Virtualhost n'agira que sur ce serveur s'il est spécifié.
Apache reçoit la requête, capte le host (ex: www.toto.com) puis scanne tous les Servername de tous les VirtualHost spécifiés et applique les directives du Virtualhost qui correspondend.

Gestion des répertoiresCela s'effectue à l'aide du tag <Directory>. Il rassemble un groupe de directives qui s'appliquent uniquement au répertoire et sous-répertoires spécifiés.
Les directives qui suivent donnent les droits pour lire ou ne pas lire les fichiers :

  • Allow from all : Signifie pour tout le monde
  • Order Allow, Deny : C'est l'ordre d'acceptation par défaut
  • AllowOverride All : Droit de lire le fichier .htaccess

<Directory /usr/local/httpd/htdocs>
	Options Indexes FollowSymLinks
	Order Allow, Deny
	Allow from all
	AllowOverride all
</Directory>

Gestion des répertoires virtuelsOn utilise le tag <Location> qui est l'équivalent de <Directory> mais sur un répertoire virtuel. Cette directive s'applique sur un nom virtuel avant la transformation en nom physique.
Utilisez <Location> pour appliquer des directives à un contenu qui est présent à l'extérieur du système de fichiers. Pour les contenus qui sont au sein même du système de fichiers, utilisez <Directory> et <Files>.
<Location /> est une exception, qui est un moyen simple d'appliquer une configuration à l'ensemble du serveur.
De plus, ce tag est particulièrement utile lorsqu’il est combiné à la directive SetHandler. Par exemple, pour activer les requêtes de statuts du serveur, et permettre l’accès aux navigateurs provenant seulement de exemple.com, vous pouvez utiliser:

<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .exemple.com
</Location>

Configurer un ensemble de fichier On peut utiliser le tag <Files> pour spécifier un ensemble de fichiers à configurer et pas seulement un Directory.

Configurer un ensemble de fichiers spécifiquesGrâce au tag <FilesMatch>, on peut configurer un ensemble de fichiers qui se ressemblent. On peut par exemple faire correspondre des fichiers contenant une certaine chaine de caractère. Exemple : l'extension *.js.
<FilesMatch + regex> (spécifier l'ensemble de fichiers à matcher à l'aide d'une regex)
ExpireActive On : Rajouter une date d'expiration aux fichiers statiques
ExpiresDefault : durée de vie (ex: A3600 correspond à 1 heure)
</FilesMatch>

Note : la directive Expire est utilisée pour spécifier que le navigateur prend la ressource et la met en cache sur le disque dur. Si on redemande la même ressource, il ne refait pas la requête, et ce jusqu'à la date d'expiration définie.

attention Attention : S'il y a une erreur dans le fichier on doit attendre la date d'expiration ou bien insister sur le rafraichissement.

Inclure un ensemble de fichiersAvec le tag <Include> on peut rajouter tous les fichiers qui se terminent par l'extension que l'on souhaite dans le dossier de notre choix. L'ordre des Include est traité par ordre alphabétique

Spécifier des directives à un moduleOn se sert du tag <IfModule> pour appliquer des directives à un module spécifique suivant qu'il soit disponible ou non. Les directives au sein de ce bloc ne sont appliquées que si le test renvoie true.


Quelques directives Apache

Alias : Cette directive est relative à un nom de domaine. Il est préférable de la placer à l'intérieur d'un Virtualhost, sinon l’alias s'applique pour le serveur par défaut. Il faut de plus préciser le Directory sinon il prend le default (DocumentRoot) qui est configuré en Deny from all.

Alias /image/ /ftp/pub/image
<Directory /ftp/pub/image>
Order allow,deny
Allow from all
</Directory>

ServerAlias : Elle définit les noms alternatifs pour un hôte, pour une utilisation avec les virtualhost basés sur le ServerName.
Ne pas les utiliser sauf pour de la redirection (question de ranking sur les moteurs de recherche)

<VirtualHost *:80>
ServerName server.domain.com
ServerAlias server server2.domain.com server2
ServerAlias *.thecodingmachine.com
# Liste des autre directives
</VirtualHost>

RedirectPermanent : Tout ce qui commence par la valeur spécifiée est redirigé (code 301) => ça réécrit l'URL dans le navigateur. On peut en faire un temporaire pour que le navigateur ne l'ait pas en cache.

Directive Forcetype : Lorsqu'elle est placée dans un fichier. htaccess ou dans une balise <Directory>, <Location> ou <Files>, cette directive force le type mime de tous les fichiers correspondant. Par exemple, si vous aviez un répertoire avec des images PNG, mais que vous ne voulez pas tous les étiqueter avec gif, vous pouvez l'utiliser. Le module MIME est inclut dans le core de Apache depuis la version 2.0 si ce n'est pas le cas pour votre version il faut l'activer (cf. section Modules pour voir comment activer / désactiver un module).

# Force tous les fichiers à être du type image/png:
<Location /images>
ForceType image/png
</Location>
 
# Tous les autres type MIME sont ici:
<Location /images/mixed>
ForceType None
</Location>


Modules Apache

Vous pouvez voir la liste de tous les modules Apache disponibles dans le dossier /etc/apache2/mods-available.
Pour activer un module qui ne l’est pas, il suffit de vous déplacer dans le dossier /etc/apache2/mods-enabled puis de créer un lien symbolique depuis mods-available vers ce dossier de cette façon :

ln –s ../mods-available/{nom du module}

Tous les modules apache activés se trouvent dans mods-enabled et ne sont que des liens vers les modules physiques qui se trouvent dans mods-available.
Pour désactiver un module il suffit de supprimer ce lien, ce qui n’aura pas pour effet de supprimer le module.

Note : C’est exactement la même procédure pour les fichiers de configuration d’un site web dans les dossiers sites-available et sites-enabled (ex. : configuration d’un alias ou d’un virtualhost).

Présentation de quelques modules utiles

Module authentification (mod_auth) : Ce module fourni tout le nécessaire pour une Authentification HTTP Basic (Login, mot de passe, configuration de la BDD, tables et champs).
Note : Des fonctionnalités similaires et une plus grande évolutivité sont assurées par mod_auth_dbm où les noms d'utilisateur et mots de passe sont stockés dans des fichiers DBM. En effet le module mod_auth fourni des fichiers de passwords en clair.

Module Deflate (mod_deflate) : Permet de compresser des fichiers à la volée. Il présente un avantage et un inconvénient, son utilisation limite la bande passante mais prend beaucoup de CPU. En effet Apache n'a pas de cache et quand il reçoit une requête il ne traite qu'UNE requête à la fois. Une solution possible à cette contrainte est d’utiliser Varnish.

Modules Prefork et worker (mpm_prefork_module, mpm_worker_module) : Modules utilisés dans un souci de stratégie de performance. Ils permettent de configurer le nombre de connexions simultanées qu'Apache peut ouvrir (c'est-à-dire le nombre de requêtes client auxquelles il peut répondre simultanément).
attention Attention : Il faut faire attention à ce que la directive MaxClient soit définit assez haute pour gérer autant de connexions que l’on souhaite mais pas trop pour ne pas dépasser la capacité en RAM du serveur.

Module Rewrite (mod_rewrite) : Pour éviter d'avoir des URL trop longues ou inapropriées à la page, on utilise ce module qui permet la réécriture d’URL à la volée. Pour l’activer il faut créer le lien symbolique dans mods-enabled comme vu plus haut puis passer la directive RewriteEngine à On.

Configuration typique

RewriteBase : Définit l’url de base pour la réécriture d’URL
RewriteCond : Toutes les conditions au dessus d'une règle s'appliquent. Exemple: !-f, !-d
RewriteRule : Règle de réécriture (Regex + fichier à appeler)

#  Note: /exemple est l’alias du chemin /chemin/physique, 
#  Le serveur est configuré avec une directive alias comme ceci :
#  Alias /exemple /chemin/physique
 
RewriteEngine On
 
#  Il faut préciser au serveur qu’on accède via l’alias /exemple et non
#  par le chemin d’origine /chemin/physique
 
RewriteBase   /exemple
 
#  Maintenant on peut écrire la règle de réécriture qui s’appliquera que si le navigateur est Firefox (RewriteCond)
 
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla
RewriteRule   ^ancien\.html$  nouveau.html


Configurer SSL avec Apache

SSL est un protocole de cryptage des pages transmises au navigateur par le serveur qui est utilisé pour sécuriser l’échange de données sensibles (lors d’un paiement en ligne par exemple).

Pré-requis:

  • Installer SSL : sudo apt-get install openssl
  • Activer le module mod_ssl dans mods-available (cf. section Modules)

Son utilisation requiert l’acquisition d’un certificat auprès d’une société spécialisée dans la certification, ou bien la création d’un certificat auto-signé.
Ils permettent de fournir divers informations concernant l'identité de son détenteur et contiennent une clé publique indispensable pour chiffrer la communication entre les machines et une clé privée qui fera office de signature numérique.

Note : Pour générer un certificat auto-signé il suffit de se placer dans le dossier /etc/apache2/ssl
puis d’exécuter la commande suivante :

apache2-ssl-certificate

Il est ensuite nécessaire de régler le serveur pour qu’il écoute également sur le port 443. Pour cela on édite le fichier /etc/apache2/ports.conf. C’est dans ce fichier que sont définis les ports d’écoute du serveur. Par défaut un serveur web écoute les requêtes sur le port 80, ce qui est modifiable en éditant ce fichier.

Il suffit d’y ajouter la directive suivante dans un bloc IfModule :

# Si le module SSL est activé alors on écoute sur le port 443

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

Si on exécute la requête : https://localhost, on n’aura aucun résultat puisque nous n'avons pas encore déclaré de répertoire accessible par le port 443 et le protocole sécurisé https.
Il est nécessaire d'ajouter un fichier de configuration spécifique pour le service web qui bénéficiera du chiffrement. Pour cela dans le répertoire /etc/apache2/sites-available

# Fichier de configuration /etc/apache2/sites-available/exemple.conf
NameVirtualHost 10.72.3.xxx:443
 
<VirtualHost 10.72.3.xxx:443>
	DocumentRoot /var/www/exemple1
	ServerName exemple.com
    <Directory /var/www/exemple1>
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from all
    </Directory>	
    	SSLEngine on
	SSLCertificateFile /etc/apache2/ssl/apache.pem
	SSLCertificateKeyFile /etc/apache2/ssl/9zr563a7i.0
</VirtualHost>

Quelques explications sur les directives passées :

  • SSLEngine : Directive établie à ‘On’ pour activer SSL
  • SSLCertificateFile : Spécifie le chemin du certificat authentifiant le serveur auprès des demandeurs
  • SSLCertificateKeyFile : Spécifie la clé privée utilisée pour signer l'échange de clé entre le client et le serveur

Redémarrer Apache pour finaliser l’installation.

Gérer les accès avec les fichiers .htaccess

Ces fichiers permettent de changer la configuration Apache à la volée pour un sous-répertoire. On peut typiquement les utiliser pour définir un mot de passe dans un répertoire qui contient des informations sensibles, modifier les accès, personnaliser des pages d’erreurs…
Les directives qui lui sont appliquées sont valables pour le répertoire dans lequel il est placé mais aussi récursivement pour tous les sous-répertoires, on peut placer un autre fichier .htaccess dans les sous-répertoires si l’on souhaite voir s’appliquer un comportement différent pour un dossier spécifique.

attention Attention : Si on réécrit une directive dans le .htaccess d’un répertoire enfant qui est déjà définie dans celle d’un répertoire parent, elle écrase celle du parent.

Exemple de fichier .htaccess :

ErrorDocument 403 <a href="http://www.exemple.com/stop.php3<br />
AuthUserFile" title="http://www.exemple.com/stop.php3<br />
AuthUserFile">http://www.exemple.com/stop.php3<br />
AuthUserFile</a> {chemin vers le fichier de mot passe}
AuthGroupFile {chemin vers le fichier de groupe}
AuthName "Secure Access"
AuthType Basic
Require valid-user

Le fichier de mot de passe est de ce type :

Pascal:toto123
Jean:tata123
Jeanne:tutu123

Note : Il est possible de crypter les mots de passe grâce à l’utilitaire htpasswd accessible dans le répertoire bin d'Apache.
Require valid-user précise que l'on autorise uniquement les personnes identifiées à accéder à un dossier. On peut également préciser explicitement le nom des personnes autorisées à s'identifier de cette façon : require user {username}

attention Erreur courante : Si votre fichier .htaccess n'est pas pris en compte, vérifiez bien que la directive AllowOverride All est présente dans votre configuration Apache.