===== 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 : * L'interprétation de certains langages (Perl, Python, Ruby) * Serveur proxy, Common Gateway Interface * Réécriture d'URL * … 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 : {{:apache2.4:apache_default.png?nolink&745x1034}} 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 ''/var/www/html'' 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 systemctl 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 **[[:installation_serveur_web:apache2.4#modules|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 : ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined 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 : ServerName example.com ServerAlias www.example.com DocumentRoot "/var/www/example" Options +FollowSymLinks AllowOverride all Require all granted ErrorLog /var/log/apache2/error.example.com.log CustomLog /var/log/apache2/access.example.com.log combined ==== Directive ==== ^directive^description| | |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 [[http://www.example.com|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''.| | |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 [[:installation_serveur_web:apache2.4#htaccess|.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 '''' 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 [[https://doc.ubuntu-fr.org/permissions|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 [[https://doc.ubuntu-fr.org/droits|droits]]''rwx 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. * Les modules disponibles sont situés dans le répertoire : /etc/apache2/mods-available * Les modules activés sont situés dans le répertoire : /etc/apache2/mods-enabled ==== Activer un module ==== a2enmod # apache2 enable module ==== Désactiver un module ==== a2dismod # 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 : * mpm_prefork_module * mpm_worker_module * mpm_event_module 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 ''[[https://documentation.help/httpd-2.4-fr/worker.html|worker]]'' ou ''[[https://documentation.help/httpd-2.4-fr/event.html|event]]'', tandis que les sites qui privilégient la stabilité ou la compatibilité avec des logiciels plus anciens peuvent utiliser un module comme ''[[https://documentation.help/httpd-2.4-fr/prefork.html|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 : ServerLimit 500 MaxClients 500 MaxConnectionsPerChild 0 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 : [...] ServerLimit 20 MaxClients 500 [...] ThreadsPerChild 25 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.