Table des matières

PRESENTATION

Le serveur HTTP Apache est le serveur web le plus utilisé au monde. Apache fonctionne principalement sur les systèmes d'exploitation UNIX et Windows. Apache est conçu pour prendre en charge de nombreux modules lui donnant des fonctionnalités supplémentaires :

Les possibilités de configuration d'Apache sont une fonctionnalité phare. Le principe repose sur une hiérarchie de fichiers de configuration, qui peuvent être gérés indépendamment. Cette caractéristique est notamment utile aux hébergeurs qui peuvent ainsi servir les sites de plusieurs clients à l'aide d'un seul serveur HTTP. Pour les clients, cette fonctionnalité est rendue visible par le fichier .htaccess ainsi que les fichiers hôtes virtuelles permettant d'adapter la configuration suivant les sites.

INSTALLATION

Mise à jour système

Dans un premier temps, nous mettons à jour notre système d'exploitation ainsi que la liste des paquets. Par la suite, les paquets seront remplacés par des versions plus récentes, mais sans qu’aucun autre paquet ne soit ajouté ou supprimé:

sudo apt update && apt upgrade

Installation

L'installation s'effectue par la commande suivante :

sudo apt-get install apache2

Vérification installation

À la fin du processus d’installation, notre machine lance Apache. Le serveur Web devrait être opérationnel.Nous le vérifion avec le système systemd init pour s'assurer que le service fonctionne en tapant :

sudo systemctl status apache2

Le résultat de cette commmande ci-dessous nous confirme que le service a démarré avec succès :

  apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-04-23 22:36:30 UTC; 20h ago
   Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 29435 (apache2)
      Tasks: 55 (limit: 1137)
     Memory: 8.0M
     CGroup: /system.slice/apache2.service
             ├─29435 /usr/sbin/apache2 -k start
             ├─29437 /usr/sbin/apache2 -k start
             └─29438 /usr/sbin/apache2 -k start

Cependant, la meilleure façon de le tester consiste à demander une page à Apache.Nous pouvons accéder à la page d’accueil par défaut d’Apache pour confirmer que le logiciel fonctionne correctement en entrant l'adresse IP machine dans un navigateur web. Voici la page web d'apache par défaut :

Cette page indique qu’Apache fonctionne correctement. Elle contient également des informations de base sur les fichiers Apache et les emplacements de répertoires importants. Cette page se trouve dans le dossier <font inherit/inherit;;#ff0000;;inherit>/var/www/html</font> du serveur.

Gestion du processus Apache

Maintenant que notre serveur web est opérationnel, passons en revue quelques commandes de gestion de base en utilisant <font inherit/inherit;;inherit;;rgb(251, 250, 249)>systemctl</font>

Pour arrêter le serveur Web :

sudo systemctl stop apache2

Pour démarrer le serveur web lorsqu’il est arrêté :

sudo systemctl start apache2

Pour arrêter puis redémarrer le service :

sudo systemctl restart apache2

Si vous procédez uniquement à des modifications de configuration, il se peut qu’Apache recharge souvent sans interrompre les connexions. Pour ce faire, utilisez cette commande :

sudo systemctl reload apache2

Par défaut, Apache est configuré pour un lancement automatique au démarrage du serveur. Pour désactiver cette option :

sudo systemctl disable apache2

Pour réactiver le service de lancement automatique au démarrage :

sudo systemctl enable apache2

Désormais, Apache devrait démarrer automatiquement au redémarrage du serveur.

CONFIGURATION

Fichiers de configuration

Un seul serveur Apache permet de déployer simultanément plusieurs sites et services qu'il faut configurer individuellement. Pour plus de clarté, la configuration d'Apache2 est morcelée. Toutefois, tous les fichiers de configuration se situent dans le répertoire /etc/apache2 :

sites-available contient les fichiers de configuration des sites disponibles

sites-enabled contient des liens symboliques vers les configurations, dans site-available, des sites activés

conf-available contient les fichiers de configuration des autres services disponibles

conf-enabled contient des liens symboliques vers les configurations, dans conf-available, des autres services activés

mods-available contient les fichiers de configuration des modules d'Apache disponibles

mods-enabled contient des liens symboliques vers les configurations, dans mods-available, des modules activés

Normalement les fichiers de configuration globale apache2.conf et ports.conf n'ont pas à être modifiés. Toute la configuration devrait se faire dans les sous dossiers xxx-available.

Les diverses configurations sont activées (a2en pour Apache 2 enable) ou désactivées (a2dis pour Apache 2 disable) avec les commandes suivantes :

sudo a2ensite : configuration d'un site à activer sudo a2dissite : configuration d'un site à désactiver

sudo a2enconf : configuration d'un service à activer ''sudo a2disconf '': configuration d'un service à désactiver

''sudo a2enmod '' : configuration d'un module à activer ''sudo a2dismod '': configuration d'un module à désactiver

Cela aura pour effet de créer ou supprimer les liens symboliques correspondants dans les répertoires xxx-enabled. Apache prendra alors en compte, ou pas, les fichiers de configuration concernés après rechargement :

Configuration port d'écoute

Un dernier fichier, /etc/apache2/ports.conf, permet de spécifier les ports à écouter. Par défaut, il s'agit des ports 80 (port par défaut pour HTTP), et 443 (port par défaut pour HTTPS) si le module SSL est activé.

Sauf cas très particulier, il n'est pas nécessaire de toucher à cette configuration.

Hôte virtuel

Avec Apache, chaque site ou application web correspond en principe à un hôte virtuel (Virtualhost en anglais).

Chaque hôte virtuel est défini par un fichier de configuration indépendant, qu'on trouve ou qu'on créé dans le répertoire /etc/apache2/sites-available/.

Par défaut, il existe 2 hôtes virtuels. Il n'est a priori pas nécessaire de modifier les fichiers existant par défaut. Chaque site ou service devrait correspondre à un hôte virtuel unique, définit dans un fichier indépendant. De plus ces fichiers existant par défaut peuvent éventuellement être écrasés lors de mises à jour majeures du système.

Le premier VirtualHost est défini dans le fichier /etc/apache2/sites-available/000-default.conf. Voici son contenu sans les commentaires :

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Apache recommande de créer un fichier de configuration dans lequel est défini un hôte virtuel pour chaque site ou application web dans le répertoire /etc/apache2/sites-available/.

Chaque hôte virtuel peut être appelé en fonction d'un nom de domaine ou sous-domaine, c'est la configuration la plus courante. Mais on peut également définir un numéro de port particulier, ou une adresse IP particulière (si le serveur en possède plusieurs) pour laquelle on affichera tel ou tel contenu web.

Chaque hôte virtuel ayant son fichier de configuration dédié, pour s'y repérer on peut le nommer par le nom de domaine auquel il correspond, suivi de l'extension .conf. Pour un nom de domaine example.com on créera donc un fichier /etc/apache2/sites-available/example.com.conf.

Voici un exemple de contenu pour ce fichier :

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/var/www/example"
    <Directory "/var/www/example">
   Options +FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>
    ErrorLog /var/log/apache2/error.example.com.log
    CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>

Directive

directivedescription
<VirtualHost *:80>
On accepte les connexions sur n'importe quelle IP du serveur (*) et sur le port 80.
ServerName example.com
Cette directive permet de définir les protocoles, nom d’hôte et port d’une requête que le serveur utilise pour s’authentifier lui-même.Cet hôte virtuel sera seulement appelé pour le nom de domaine //example.com. // Par exemple, si le nom de la machine hébergeant le serveur web est simple.example.com, la machine possède l’alias DNS www.example.com, et si nous voulons que le serveur web s’identifie avec cet alias, nous devons utiliser comme definition ServerName www.example.com Un seul Servername par VirtualHost est requis.
ServerAlias www.example.com
La directive ServerAlias permet de définir les noms alternatifs d’un serveur utilisables pour atteindre des serveurs virtuels à base de nom comme sous-domaine www.example.com. On peut spécifier ici d'autres noms de domaine en les séparant par un espace. On peut aussi utiliser *.example.com pour inclure tous les sous-domaines.
DocumentRoot "/var/www/example"
Cette directive permet de définir l'emplacement des fichiers du site ici dans le répertoire /var/www/example.
<Directory "/var/www/example">
On spécifie dans cette section des règles pour le répertoire /var/www/example sous cet hôte virtuel.
Options +FollowSymLinks
Apache suivra les liens symboliques qu'il trouvera dans ce répertoire (et ses descendants).
AllowOverride all
On pourra inclure une configuration personnalisée via un fichier .htaccess.
Require all granted
Tous les visiteurs pourront accéder au contenu de ce répertoire. Pour des raisons de sécurité ou de privacité on peut par exemple limiter l'accès au serveur à seulement une ou certaines adresses IP avec une directive du type Require ip 192.168.1.10.
ErrorLog /var/log/apache2/error.exmple.com.log
CustomLog /var/log/apache2/access.exmple.com.log
Il est pratique d'avoir des logs séparés pour chaque hôte virtuel, afin de ne pas mélanger toutes les informations.

Après avoir l'avoir créée, il faut activer cette configuration avec la commande sudo a2ensite [nom du fichier sans son extension]. Par exemple :

sudo a2ensite example.com

On recharge ensuite la configuration d'Apache :

sudo systemctl reload apache2

.htaccess

En plus des fichiers de configuration situés dans /etc/apache2, Apache nous permet de définir des configurations tierces pour certains répertoires en plaçant des fichiers nommés .htaccess directement avec les autres fichiers du contenu web. (Le point au début du nom du fichier en fait un fichier caché par défaut.)

Les directives de chaque fichier .htaccess s'appliquent au répertoire dans lequel il se trouve, ainsi que tous ses descendants (sous-repertoires, sous-sous-repertoires, etc.).

C'est la directive AllowOverride , spécifiée dans une section <Directory> de l'hôte virtuel qui définit si les fichiers .htaccess doivent être pris en compte, ou pas, pour ce répertoire et ses descendants. Elle peut prendre la valeur All ou None.

Ces fichiers sont très pratiques pour redéfinir des paramètres sur un serveur mutualisé à l'administration duquel on n'a pas accès, ou pour définir dynamiquement des règles spécifiques à certaines solutions web (comme la réécriture d'URL).

SECURITE

Permissions

Par défaut le groupe et utilisateur sous lesquels tourne Apache sont définis dans le fichier /etc/apache2/envvars par ces deux lignes :

export APACHE_RUN_USER=www-data     # L'utilisateur est www-data
export APACHE_RUN_GROUP=www-data    # Le groupe est www-data

Quand Apache créé un fichier sur l'espace disque, celui-ci appartient donc par défaut à l'utilisateur www-data et au groupe www-data. De la même manière, le serveur ne peut accéder qu'au contenu accessible par www-data.

Groupe et Utilisateurs

Pour des raisons de sécurité il est recommandé de modifier le propriétaire des fichiers auxquels peut accéder Apache.
Le propriétaire devrait être l'utilisateur qui va maintenir le contenu localement, mais le groupe propriétaire devrait rester www-data :

sudo chown -R $USER:www-data /var/www/example  # CHOWN = CHange OWNer

On change ensuite les permissions du contenu de manière à ce que l'utilisateur puisse le lire et le modifier, mais qu'Apache (dans le groupe www-data) ne puisse que le lire.

Droits

On attribue donc les droitsrwx r-x — (750) pour les répertoires, et rw- r– — (640) pour les fichiers :

chmod -R a-rwx,u+rwX,g+rX /var/www/example  #  CHMOD = CHange MODe

MODULES

Présentation

L’une des forces d’Apache est sa modularité. En effet, Apache est un serveur modulaire. Par défaut, seules les fonctionnalités les plus courantes sont incluses dans le serveur de base. Les fonctionnalités étendues sont fournies à l'aide de modules qui peuvent être chargés dans Apache. Il existe de nombreux modules permettant d’effectuer divers traitements en fonction des besoins.

/etc/apache2/mods-available
/etc/apache2/mods-enabled

Activer un module

a2enmod <nom_module>
# apache2 enable module

Désactiver un module

a2dismod <nom_module>
# apache2 disable module

Module MPM

Le serveur est fourni avec une variété de Modules Multi-Processus (MPMs) définissent la manière dont Apache va gérer les connexions HTTP aux ports réseau de la machine, l'acceptation des requêtes, et se chargent de répartir ces dernières entre les différents processus enfants. Par défaut, Apache est préconfiguré pour servir un maximum de 256 clients simultanément.

Trois modes de fonctionnement existent pour Apache pour la gestion des requêtes au travers de module de traitements parallèles des requêtes :

Pour fonctionner, Apache a besoin qu’un et un seul de ces modules soit chargé.

Les sites qui sont très sollicités peuvent utiliser un MPM threadé comme worker ou event, tandis que les sites qui privilégient la stabilité ou la compatibilité avec des logiciels plus anciens peuvent utiliser un module comme prefork.

En mode prefork, les requêtes sont traitées par des processus lourds. Le premier processus lancé écoute sur le port 80 (et/ou 443, ou autre), puis dispatche les requêtes sur des processus fils (le nom prefork venant de la méthode C fork qui permet de créer de nouveaux processus sous unix). Pour traiter 250 connexions simultanées, il faudra donc 251 processus : le processus parent qui écoute et les 250 fils qui traitent.

Exemple de configuration :

<IfModule mpm_prefork_module>
    ServerLimit 500
    MaxClients  500
    MaxConnectionsPerChild 0
</IfModule>

Dans la configuration, les directives :

ServerLimit limite le nombre de processus pouvant être lancés au maximum.

MaxClients limite le nombre de clients pouvant se connecter. Il doit être inférieur ou égal au nombre de processus ServerLimit, l’égalité étant plus logique.

MaxConnectionsPerChild (anciennement MaxRequestsPerChild encore supporté) limite le nombre de connexions qu'un processus enfant va traiter au cours de son fonctionnement.

En mode worker, les requêtes sont traitées par des threads, eux même regroupés dans des processus. On a par exemple 25 thread par processus, et 10 processus. Pour traiter 250 requêtes il faudra 11 processus, et 250 threads. Le MaxClients correspond au nombre de threads total. Il faudra aussi configurer le nombre de processus et le nombre de thread par processus. Le MaxClients peut inférieur au nombre de processus (ServerLimit) multiplié par le nombre de thread (ThreadsPerChild), mais pas supérieur.

Exemple de configuration :

<IfModule mpm_event_module>
    [...]
    ServerLimit 20
    MaxClients 500
    [...]
    ThreadsPerChild 25
</IfModule>

Dans la configuration, les directives :

ServerLimit limite le nombre de processus pouvant être lancés au maximum.

MaxClients limite le nombre de clients pouvant se connecter. Il doit être inférieur ou égal au nombre de processus ServerLimit, l’égalité étant plus logique.

ThreadsPerChild défini le nombre de threads créés par chaque processus enfant.