Contenu | Rechercher | Menus

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
utilisateurs:krodelabestiole:brouillon [Le 11/03/2018, 22:14]
krodelabestiole supprimée
utilisateurs:krodelabestiole:brouillon [Le 17/03/2018, 17:20] (Version actuelle)
krodelabestiole créée
Ligne 1: Ligne 1:
-{{tag>​réseau serveur BROUILLON}} +.
- +
----- +
-{{ apache_logo.png?​80nolink| Logo du logiciel Apache 2}} +
- +
-====== Serveur HTTP Apache 2 ====== +
- +
-Un [[https://​fr.wikipedia.org/​wiki/​Serveur_HTTP|serveur HTTP]] permet à un serveur web de communiquer avec un navigateur en utilisant le protocole [[https://​fr.wikipedia.org/​wiki/​Hypertext_Transfer_Protocol|HTTP(S)]] et ses extensions ([[https://​fr.wikipedia.org/​wiki/​WebDAV|WebDAV]],​ etc.). **Apache** est probablement le serveur HTTP le plus populaire. C'est donc lui qui met à disposition la plupart des sites internet du [[https://​fr.wikipedia.org/​wiki/​World_Wide_Web|WWW]].\\ +
-Il est produit par la //Apache Software Foundation//​. C'est un logiciel libre fourni sous la [[wpfr>​Licence_Apache|licence spécifique Apache]]. +
- +
-On utilise généralement Apache en conjonction avec d'​autres logiciels, permettant d'​interpréter du code et d'​accéder à des bases de données. Le cas le plus courant est celui d'un serveur [[:LAMP]] (Linux Apache MySQL PHP). +
- +
-<note important>​Avant de vous lancer dans l'​utilisation d'​Apache et si ce ne sont pas des choses claires pour vous, n'​hésitez pas à consulter la documentation concernant [[:web|le Web et le protocole HTTP]]. +
- +
-Les références ​à prendre en compte pour comprendre la configuration d'​Apache,​ sont [[https://​​httpd.apache.org/​​docs/​​current/​fr/​|la documentation officielle]],​ les ressources présentes sur votre système, notamment ///​​usr/​​share/​​doc/​​apache2/​​README.Debian.gz//,​ ainsi que les pages de manuel.</​note>​ +
- +
-===== Installation ===== +
- +
-Pour installer Apache seul, [[:​tutoriel:​comment_installer_un_paquet|installez simplement le paquet]] **[[apt>​apache2|apache2]]**. +
- +
-Pour installer Apache avec PHP et MySQL ou MariaDB, reportez vous à l'​[[:​lamp#​installation|installation de LAMP]]. +
- +
-À la suite de cette installation votre serveur doit fonctionner et être accessible à l'​adresse [[http://​localhost]] (à partir de la même machine). +
- +
-Un message //It Works!// devrait s'​afficher dans votre navigateur. Il s'agit du contenu du fichier ///​var/​www/​html/​index.html//​ qui est affiché par défaut. +
- +
-===== Lancement ===== +
- +
-Apache 2 se lance par défaut dès son installation,​ et se relance automatiquement à chaque démarrage. +
- +
-==== Empêcher Apache de démarrer automatiquement ​ ==== +
- +
-Pour empêcher cela : +
-<​code>​sudo systemctl disable apache2</​code>​ +
-==== Réactiver le démarrage automatique ==== +
- +
-Pour de nouveau relancer Apache automatiquement au démarrage de la machine, c'est simple : +
-<​code>​sudo systemctl enable apache2</​code>​ +
- +
-==== Autres commandes utiles ==== +
- +
-Pour arrêter apache2 ​: +
-<​code>​​sudo systemctl stop apache2</​code>​ +
- +
-Pour lancer apache2 ​: +
-<​code>​​sudo systemctl start apache2</​code>​ +
- +
-Pour relancer apache2 :  +
-<​code>​​sudo systemctl restart apache2</​code>​ +
- +
-Pour recharger la configuration d'​​apache2 : +
-<​code>​​sudo systemctl reload apache2</​code>​ +
-  +
-Pour voir la version d'​​Apache utilisée : +
-<​code>​sudo apache2ctl ​-v</​code>​ +
- +
-Pour tester l'​​ensemble de la configuration d'​​Apache : +
-<​code>​​sudo apache2ctl ​-t</​code>​ +
- +
-Pour tester la configuration des hôtes virtuels ​: +
-<​code>​​sudo apache2ctl -t DUMP_VHOSTS</​code>​ +
- +
-Pour voir les modules d'​​Apache chargés : +
-<​code>​sudo apache2ctl -M</​code>​ +
-===== Mode de fonctionnement sommaire ===== +
- +
-Lorsqu'​il démarre, Apache charge les fichiers de configuration et se met en attente de requêtes sur les interfaces réseaux. On dit qu'il écoute (//listen// en anglais) certains ports. +
- +
-Lorsqu'​on utilise un navigateur web, que l'on clique sur un lien ou qu'on rentre directement une [[web#​url|URL]] dans la barre d'​adresse,​ on effectue une requête :  +
-  * Le navigateur résout le nom de domaine (il obtient l'​adresse IP du serveur). +
-  * Il envoie une requête HTTP avec la méthode GET à l'IP du serveur sur le port 80 (ou HTTPS sur le port 443) pour lui demander de retourner un contenu particulier. +
-  * Le serveur HTTP reçoit la requête, et en fonction de divers paramètres (URL appelée, configuration du serveur, etc.), va chercher un contenu dans un fichier ou lance un script qui va générer un contenu. +
-  * Le serveur renvoie ce contenu à l'IP du navigateur sur le même port (80 ou 443). +
-  * Le navigateur traite le contenu et le rend accessible à l'​internaute (en l'​affichant à l'​écran par ex.). +
- +
-Voilà comment fonctionne (grossièrement ;-) ) un serveur web. +
- +
-===== 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 donc morcelée, mais 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 [[:​lien_physique_et_symbolique|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 [[:​lien_physique_et_symbolique|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 [[:​lien_physique_et_symbolique|liens symboliques]] vers les configurations,​ dans //​mods-available//,​ des modules activés +
- +
-<note important>​​Normalement les fichiers de configuration globale ​//​apache2.conf//,​ //envars// et //​ports.conf//​ n'ont pas à être modifiés. Toute la configuration devrait se faire dans les sous dossiers //​xxx-available//​.</​note>​ +
- +
-Les diverses configurations sont activées (//a2en// pour //Apache 2 enable//) ou désactivées (//a2dis// pour //Apache 2 disable//) avec les commandes suivantes : +
- +
-<​code>​sudo a2ensite [configuration d'un site à activer]</​code>​ +
-<​code>​sudo a2dissite [configuration d'un site à désactiver]</​code>​ +
- +
-<​code>​sudo a2enconf [configuration d'un service à activer]</​code>​ +
-<​code>​sudo a2disconf [configuration d'un service à désactiver]</​code>​ +
- +
-<​code>​sudo a2enmod [configuration d'un module à activer]</​code>​ +
-<​code>​sudo a2dismod [configuration d'un module à désactiver]</​code>​ +
- +
-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 : +
-<​code>​sudo systemctl reload apache2</​code>​ +
- +
-<​note>​Par défaut Apache ne prend en compte que les fichiers portant l'​extension //.conf// (ou //.load//, seulement pour les modules).</​note>​ +
- +
-==== Configuration des ports 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 [[#​https|module SSL]] est activé. +
- +
-Sauf cas très particulier,​ il n'est pas nécessaire de toucher à cette configuration. +
- +
-===== Hôtes virtuels ===== +
- +
-Sur Apache, chaque site ou service correspond en principe à un hôte virtuel (//​**[[https://​httpd.apache.org/​docs/​current/​fr/​vhosts/​examples.html|VirtualHost]]**//​ en anglais). +
- +
-==== Par défaut ==== +
- +
-Par défaut, il existe 2 hôtes virtuels.  +
- +
-Le premier est défini dans le fichier ///​etc/​apache2/​sites-available/​000-default.conf//​ : +
- +
-<​code><​VirtualHost *:80> +
- ServerAdmin webmaster@localhost +
- DocumentRoot /​var/​www/​html +
- ErrorLog ${APACHE_LOG_DIR}/​error.log +
- CustomLog ${APACHE_LOG_DIR}/​access.log combined +
-</​VirtualHost></​code>​ +
- +
-  * //<​**VirtualHost** *:80>// : on déclare l'​hôte virtuel, il doit répondre à toutes les adresses IP qui s'​adressent à lui (*) sur le port 80. On peut ici éventuellement spécifier une adresse IP unique à laquelle répondra Apache pour un hôte virtuel donné (par ex. pour des raisons de sécurité ou de privauté), ou choisir d'​écouter un port exotique. +
-  * //​**ServerAdmin** webmaster@localhost//​ : c'est le courriel de l'​administrateur système. Cette directive n'est ni très utile, ni indispensable. +
-  * //​**DocumentRoot** /​var/​www/​html//​ : c'est le chemin absolu vers l'​emplacement local (sur l'​espace disque du serveur) qui sera la racine de l'​hôte. Apache recherche en premier un fichier //​index.html//​ ou //​index.php//​ à afficher par défaut à l'​emplacement spécifié. On constate que c'est donc bien cet hôte virtuel qui affiche le message //It Works!// contenu dans le fichier ///​var/​www/​html/​index.html//​. +
-  * //​**ErrorLog**//​ et //​**CustomLog**//​ sont des directives relatives au log d'​erreur et au log d'​accès de cet hôte virtuel. Ceux-ci seront donc écrits dans le répertoire //​APACHE_LOG_DIR//,​ qui est par défaut ///​var/​log/​apache2//​ sur ubuntu. +
-  * //</​VirtualHost>//​ : fin de la section concernant cet hôte virtuel. +
- +
-Le second VirtualHost est défini dans le fichier ///​etc/​apache2/​sites-available/​default-ssl.conf//​ et contient une configuration par défaut pour HTTPS. Il écoute donc sur le port 443 et énonce des directives spécifiques à l'​usage de SSL. La racine de l'​hôte (directive //​DocumentRoot//​) correspond également à ///​var/​www/​html//​. +
- +
-<note tip>On remarque donc ici que si on a un seul site à mettre en place, on peut déjà le rendre disponible simplement en le déployant dans le répertoire ///​var/​www/​html//​ : par défaut Apache affichera la page d'​accueil qui doit en principe être écrite dans un fichier //​index.html//​ ou générée par un script //​index.php//​ (voir [[#​index]]).</​note>​ +
- +
-==== Création d'​hôtes virtuels ==== +
- +
-<​note>​Pour en savoir plus sur les hôtes virtuels d'​Apache,​ référez-vous à la [[http://​httpd.apache.org/​docs/​current/​mod/​core.html#​virtualhost|documentation officielle]] et à ses [[https://​httpd.apache.org/​docs/​current/​fr/​vhosts/​examples.html|exemples]].</​note>​ +
- +
-Une configuration courante pour un serveur web mettant à disposition plusieurs sites internet, est d'​avoir plusieurs noms de domaine (ou sous-domaines) pointant sur le serveur, chacun affichant un site différent.\\ +
-Pour mettre en place cette configuration il faut donc créer un hôte virtuel par nom de domaine ou sous-domaine. +
- +
-Pour faire les choses dans les règles, chaque hôte virtuel doit avoir 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 : +
- +
-<​code><​VirtualHost *:80> +
- DocumentRoot "/​var/​www/​example"​ +
- ServerName example.com +
- ServerAlias www.example.com +
- <​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></​code>​ +
- +
-  * //<​VirtualHost *:80>// : On accepte les connections de n'​importe quelle IP (//*//) sur le port 80. +
-  * //​DocumentRoot "/​var/​www/​example"//​ : On placera les fichiers du site dans le répertoire ///​var/​www/​example//​. +
-  * //​ServerName example.com//​ : Cet hôte virtuel sera seulement appelé pour le nom de domaine //​example.com//​... +
-  * //​ServerAlias <​nowiki>​www.example.com</​nowiki>//​ : ...ainsi que pour le sous-domaine //<​nowiki>​www.example.com</​nowiki>//​. 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. +
-  * //<​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. Voir la [[https://​httpd.apache.org/​docs/​current/​fr/​mod/​mod_authz_core.html#​require|documentation officielle]] pour modifier ce comportement. +
-  * //​ErrorLog//​ et //​CustomLog//​ : il est important d'​​avoir des logs séparés pour chaque hôte virtuel, afin de ne pas mélanger toutes les informations. +
- +
-<note tip>On peut exploiter cette fonctionnalité par nom de domaine même sans avoir de nom de domaine enregistré chez un registrar : il suffit de résoudre l'IP de n'​importe quel domaine dans le fichier ///​etc/​hosts//​ du côté client : +
-<​code>​127.0.0.1 example</​code>​ +
-L'​hôte virtuel sera accessible à l'​adresse http://​example/​ +
- +
-Cela peut être très pratique lorsqu'​on développe de nombreux projets sur une machine ou un réseau local, par exemple.</​note>​ +
-===== HTTPS ===== +
- +
-Pour rendre disponible les sites de manière sécurisée via HTTPS avec des certificats valides, la solution la plus simple est d'​utiliser l'​outil **[[https://​certbot.eff.org/​|Cerbot]]** de [[https://​letsencrypt.org/​|Let'​s Encrypt]]. +
-<​note>​Vous trouverez une documentation plus détaillée à ce sujet sur [[:​tutoriel:​securiser_apache2_avec_ssl|cette page de la documentation]],​ mais nous verrons ici une méthode spécifique à Apache.</​note>​ +
- +
-==== Activation du module SSL ==== +
- +
-Pour que le **protocole TLS** (successeur du **SSL**) puisse fonctionner avec Apache2, il faut activer le module //ssl// avec la commande : +
-<​code>​sudo a2enmod ssl</​code>​ +
-puis recharger la configuration d'​Apache 2 : +
-<​code>​sudo systemctl reload apache2</​code>​ +
- +
-==== Mise en place de HTTPS avec Certbot ==== +
- +
-Prérequis :  +
-  * avoir un ou plusieurs noms de domaine enregistrés,​ pointant sur le serveur depuis plus de 48 heures. +
-  * avoir un serveur web apache déjà configuré, fonctionnel et accessible publiquement. +
- +
-<​note>​Les instructions pour installer et utiliser simplement certbot sont disponibles en anglais [[https://​certbot.eff.org/​docs/​|sur le site officiel]]. En voici un récapitulatif.</​note>​ +
- +
-=== Installation de Certbot === +
- +
-Il faut d'​abord [[:​ppa#​ajout_d_un_ppa_a_vos_sources_logicielles|installer le dépôt PPA]] officiel, puis installer le paquet //certbot// : +
- +
-<​code>​sudo apt install software-properties-common +
-sudo add-apt-repository ppa:​certbot/​certbot +
-sudo apt update +
-sudo apt install certbot</​code>​ +
- +
-=== Utilisation de Certbot === +
- +
-Certbot permet ensuite de générer tous les certificats et d'​adapter les configurations d'​Apache pour tous les noms de domaine associés aux hôtes virtuels au moyen d'une seule commande : +
-<​code>​sudo certbot --apache</​code>​ +
- +
-Lors de l'​opération le script nous invite à cocher les domaines pour lesquels on souhaite obtenir les certificats et à choisir de forcer l'​usage de HTTPS ou pas. Pour des raisons de sécurité, c'est généralement une très bonne idée de forcer HTTPS. +
- +
-Après cette opération les sites devraient être accessibles en HTTPS de manière sécurisée,​ sans que les navigateurs affichent de message d'​alerte. +
- +
-<​note>​Grâce à l'​option //​--apache//,​ Certbot s'​occupe automatiquement de créer des fichiers de configuration de la forme ///​etc/​apache2/​sites-available/​example.com-le-ssl.conf//​ pour les hôtes virtuels en HTTPS sur le port 443 et de les activer (//​-le-ssl//​ pour //​Let'​s Encrypt//​).</​note>​ +
- +
-=== Renouvellement automatique === +
- +
-On peut renouveler automatiquement les certificats simplement en ajoutant la commande //certbot renew// à un [[:​cron|cron job]] : +
-<​code>​sudo crontab -e</​code>​ +
-et ajouter la ligne : +
-<​code>​30 3 * * * /​usr/​bin/​certbot -q renew</​code>​ +
-Le script sera lancé tous les jours à 3h30, mais les certificats ne seront renouvelés que si nécessaire. +
- +
-===== .htaccess ​ ===== +
- +
-En plus des fichiers de configuration situés dans ///​etc/​apache2//,​ Apache nous permet de définir des configurations tierces pour notre contenu web 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 **[[https://​httpd.apache.org/​docs/​current/​fr/​mod/​core.html#​allowoverride|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//. +
- +
-<note tip>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 [[#​mod_rewrite|réécriture d'​URL]]).</​note>​ +
- +
-===== Index  ===== +
- +
-L'​index est le contenu affiché par défaut par Apache lorsqu'​on appelle un répertoire sans spécifier de FIXME[[:​web#​URL|page web]] particulière. +
- +
-L'​index est définit par la directive **[[https://​httpd.apache.org/​docs/​current/​mod/​mod_dir.html#​directoryindex|DirectoryIndex]]** qui détermine quels fichiers Apache doit traiter par défaut. Chaque nom de fichier est séparé par un espace et listé par ordre de priorité.\\ +
-Par défaut, //​DirectoryIndex//​ a la valeur //​index.html index.cgi index.pl index.php index.xhtml index.htm//​. +
- +
-Si Apache ne trouve aucun des fichiers mentionnés par //​DirectoryIndex//,​ il essaie de récupérer une liste du contenu du répertoire,​ afin que le navigateur l'​affiche de la même manière qu'un gestionnaire de fichier.\\ +
-On peut activer ou désactiver ce listing avec respectivement les directives **[[https://​httpd.apache.org/​docs/​current/​mod/​core.html#​options|Options +Indexes]]** ou **[[https://​httpd.apache.org/​docs/​current/​mod/​core.html#​options|Options -Indexes]]**.\\ +
-Pour des raisons de sécurité, il est généralement préférable de laisser cette option désactivée. Dans ce cas, et faute de fichier index, c'est une erreur 403 qui s'​affiche,​ car l'​utilisateur n'a pas la permission de lister le contenu du répertoire. +
- +
-<​note>​Toutes ces directives peuvent être définies dans une section //​[[#​hotes_virtuels|<​Directory>​]]//​ ou dans un fichier //​[[#​.htaccess]]//​.</​note>​ +
- +
-===== Modules ​ ===== +
- +
-Il est possible d'​ajouter des modules à Apache afin d'​étendre les fonctionnalités du serveur web.\\ +
-Les modules disponibles sont répertoriés ici : ///​etc/​apache2/​mods-available//​ +
- +
-==== mod_php ==== +
- +
-[[:PHP]] est un langage de programmation et un interpréteur qui permet principalement de générer du contenu HTML. C'est donc une solution très largement utilisée pour créer des applications web ou des [[wpfr>​Page_web_dynamique|sites internet dynamiques]]. +
- +
-Il est très couramment utilisé en conjonction d'​Apache. Voir [[:​LAMP]]. +
- +
-Le module //mod_php// permet de l'​utiliser comme une extension d'​Apache. C'est la méthode la plus simple pour utiliser PHP avec Apache. +
- +
-Une autre méthode consiste à utiliser PHP [[http://​php.net/​manual/​fr/​install.fpm.php|en FastCGI]]. C'est une solution plus souple et mieux optimisée pour des sites destinés à supporter un traffic important, mais elle est plus complexe à mettre en oeuvre. Nous ne traiterons pas de ce cas ici. +
- +
-Pour installer et activer //mod_php// sous ubuntu, on utilise cette commande : +
-<​code>​sudo apt install libapache2-mod-php</​code>​ +
- +
-Mais encore une fois, mieux vaut vous reporter à la documentation de [[:LAMP]] à ce sujet. +
- +
-==== mod_rewrite ==== +
- +
-**//​[[https://​httpd.apache.org/​docs/​current/​fr/​mod/​mod_rewrite.html|mod_rewrite]]//​** permet de réécrire des [[wpfr>​Uniform_Resource_Locator|URL]]. +
- +
-Il s'agit généralement de remplacer le chemin, le nom de la page, et la chaîne de requête de l'​FIXME[[:​https://​doc.ubuntu-fr.org/​utilisateurs/​krodelabestiole/​brouillon/​web|URL]] par une chaîne de caractère en concordance avec la structure et le contenu du site. +
- +
-De nombreux services on recour à cette pratique afin d'​augmenter leur référencement et de clarifier leur contenu.\\ +
-Ces services utilisent parfois une terminologie exotique pour mentionner cette pratique : [[:​WordPress]] parle par ex. de //​permalinks//​.\\ +
-On peut aussi s'en servir pour déployer une [[https://​fr.wikipedia.org/​wiki/​Interface_de_programmation|API]] web propre.\\ +
-On utilise aussi parfois cette méthode afin de mettre en place des [[https://​httpd.apache.org/​docs/​current/​fr/​rewrite/​remapping.html|redirections web]] un peu complexes. +
- +
-Pour activer ce module on utilisera la commande +
-<​code>​sudo a2enmod rewrite</​code>​ +
- +
-<​note>​L'​utilisation de //​mod_rewrite//​ est relativement complexe et fait appel à des [[wpfr>​Expression_régulière|expressions régulières]]. N'​hésitez pas à consulter [[https://​httpd.apache.org/​docs/​current/​fr/​rewrite/​intro.html|la documentation officielle]] à ce sujet.\\ +
-Pour la rédaction des expressions régulières,​ vous pouvez vous aider de services en ligne tels que [[https://​regex101.com/​|regex101.com]] ou [[https://​regexr.com/​|regexr.com]]</​note>​ +
- +
-Un petit exemple : +
- +
-<​code>​RewriteEngine on +
- +
-# Lorsque l'on tape dans la barre d'​adresse www.example.com/​page-* c'est la page www.example.com/​page.php?​id=* qui s'​affiche +
-# ^ et $ dans le bloc modèle signifient respectivement le début et la fin d'une ligne. +
-# $1 est une variable qui récupère la valeur entre les premières parenthèses du bloc modèle +
-# [L]=[last] signifie que si cette règle s'​applique on n'en cherche pas d'​autre +
-RewriteRule ^page-([0-9]+)$ /​page.php?​id=$1 [L]</​code>​ +
- +
-<​note>​On peut écrire ces règles de réécriture dans une section //​[[#​hotes_virtuels|<​VirtualHost>​]]//​ ou  //​[[#​hotes_virtuels|<​Directory>​]]//​ (le comportement n'est pas le même), ou dans un fichier //​[[#​.htaccess]]//​.</​note>​ +
- +
-==== mod_proxy==== +
- +
-Comme [[:​proxy|son nom l'​indique]],​ **//​[[https://​httpd.apache.org/​docs/​current/​fr/​mod/​mod_proxy.html|mod_proxy]]//​** permet à apache de relayer des requêtes depuis ou vers un service tiers. +
- +
-Ce module peut par exemple être utile lorsqu'​on utilise d'​autres serveurs HTTP en plus d'​Apache sur un même serveur web, afin d'​éviter d'​avoir à accéder au contenu web sur d'​autres ports que le port 80 ou 443. +
- +
-<note warning>​L'​activation de ce module sur un serveur ouvert sur le web est dangereuse. Une mauvaise configuration permet par exemple à un intrus d'​accéder aux services disponibles sur le réseau local.\\ +
-N'​activez ce module que si vous êtes certain de ce que vous faites. +
- +
-Voir [[https://​httpd.apache.org/​docs/​current/​fr/​mod/​mod_proxy.html#​access|la documentation officielle à ce sujet]].</​note>​ +
- +
-Pour activer ce module : +
-<​code>​sudo a2enmod proxy +
-sudo systemctl reload apache2</​code>​ +
- +
-Voici un exemple de configuration qui permet d'​accéder à un serveur [[https://​emby.media|emby]] à l'​adresse http://​example.com/​emby plutôt que http://​example.com:​8096 : +
-<​code><​Location /emby> +
- ProxyPass http://​localhost:​8096/​ +
- ProxyPassReverse http://​localhost:​8096/​ +
- Require all granted +
- SetEnv proxy-nokeepalive 1 +
- SetEnv proxy-sendchunked 1 +
-</​Location></​code>​ +
-==== mod_userdir ==== +
- +
-<​note>​Ce module est également documenté sur [[:​xampp#​modifier_le_dossier_racine_du_serveur_apache|la page xampp]].</​note>​ +
- +
-Il peut être utile, et c'est prévu par Apache, que chaque utilisateur puisse mettre un contenu web à disposition depuis son espace personnel (dans le répertoire //​home//​).\\ +
-Ce contenu sera accessible à l'​adresse //<​nowiki>​http://​example.com/​~nom_de_lutilisateur</​nowiki>//,​ ou dans la plupart des cas : //<​nowiki>​http://​localhost/​~nom_de_lutilisateur</​nowiki>//​. +
- +
-Pour mettre cette configuration en place, on crée un répertoire //​public_html//​ dans son espace personnel et on lui donne les droits de lecture et d'​exécution : +
-<​code>​mkdir ~/​public_html +
-echo 'Mon site personnel'​ > ~/​public_html/​index.html +
-chmod -R 755 ~/​public_html</​code>​ +
- +
-On active ensuite le module //​mod_userdir//​ : +
-<​code>​sudo a2enmod userdir +
-sudo systemctl reload apache2</​code>​ +
- +
-Le message //Mon site personnel// devrait alors être lisible à l'​adresse http://​localhost/​~nom_de_lutilisateur +
- +
-==== mod_headers ==== +
- +
-Le module [[https://​httpd.apache.org/​docs/​current/​fr/​mod/​mod_headers.html|headers]] permet de personnaliser les en-têtes HTTP. C'est à dire les informations envoyées par le serveur avant le document lui-même. +
- +
-C'est utile notamment pour améliorer la sécurité des sites web. Voici quelques en-têtes qui peuvent être ajoutées à cette fin. +
- +
-Pour appliquer globalement les directives proposées, ouvrez (ou créez s'il n’existe pas) le fichier ///​etc/​apache2/​mods_available/​headers.conf//​ et placez-y ceci : +
- +
-<​code>​ +
-# Cet en-tête empêche MSIE d'​interpréter des fichiers comme quelque chose +
-# d'​autre que ce qui est défini en dans que type de contenu dans les en-tes HTTP +
-+
-Header set X-Content-Type-Options:​ "​nosniff"​ +
- +
-# Cet en-tête empêchera les autres sites d'​intégrer les pages de ce site dans des frames. +
-# C'est une mesure de portection contre les attaques par détournement de clic (clickjacking) +
-# Attention cet en-tête est rendue obsolète par les CSP +
-+
-#Header set X-Frame-Options:​ "​sameorigin"​ +
- +
-# Cet en-tête oblige les navigateurs à utiliser la protection XSS même s'il l'ont désactivé +
-+
-Header always set X-XSS-Protection "1; mode=block"​ +
- +
-# En-tête qui permet de masquer la technologie utilisée (par exemple PHP 7.0) +
-# Pas une sécurité, mais inutile de transmettre cette information aux clients +
-+
-Header always unset "​X-Powered-By"​ +
-</​code>​ +
- +
-Vous pouvez ensuite activer le module : +
-<​code>​sudo a2enmod headers</​code>​ et recharger la configuration d'​Apache. +
- +
-Les en-têtes peuvent également être définies au niveau de chaque site dans les fichier d'​hôte virtuels. +
- +
-Si vous utilisez HTTPS, vous voudrez certainement définir l'​en-tête [[wpfr>​HTTP_Strict_Transport_Security|Strict-Transport-Security]],​ exemple : +
-<​code><​VirtualHost *:443> +
- … +
- Header always set Strict-Transport-Security:​ "​max-age=31536000;​includeSubDomains;​preload"​ +
-</​VirtualHost></​code>​ +
- +
-Enfin, toujours dans un objectif de sécurité, vous pourrez être amené à utiliser les en-têtes [[https://​developer.mozilla.org/​en-US/​docs/​Web/​HTTP/​CSP|Content-Security-Policy]],​ exemple : +
- +
-<​code>​Header always set Content-Security-Policy:​ "​default-src '​self';​ img-src *; media-src media1.com media2.com; script-src userscripts.example.com"</​code>​ +
- +
-Pour voir les en-têtes envoyées par votre serveur vous pouvez utiliser des outils en ligne de commande comme : +
-<​code>​curl -I https://​example.com</​code>​ ou une extension du navigateur web qui permet d'​afficher les en-têtes HTTP. +
- +
-===== Sécurité ​ ===== +
- +
-<note important>​Sans chiffrer les communication avec le module //SSL//, toutes les informations échangées entre le navigateur et le serveur, contenu web et variables d'​authentification,​ transitent en clair sur Internet. Une des premières règles de sécurité pour Apache est donc de forcer l'​utilisation de [[#​HTTPS]].</​note>​ +
- +
-==== Permissions ==== +
- +
-Par défaut sur Ubuntu, Apache est exécuté par l'​utilisateur //​www-data//,​ qui appartient au groupe //​www-data//​. Il prend donc les permissions de cet utilisateur.\\ +
-Quand Apache créé un fichier sur l'​espace disque (via par exemple un [[:#​mod_php|script PHP]]), celui-ci appartient 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//​. +
- +
-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//​ : +
-<​code>​sudo chown $USER:​www-data /​var/​www/​example -R</​code>​ +
- +
-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. +
- +
-On attribue donc les [[:droits]] 750 (rwx r-x ---) pour les répertoires,​ et 640 (rw- r-- ---) pour les fichiers : +
-<​code>​sudo find /​var/​www/​example -type d -exec chmod 750 {} \; +
-sudo find /​var/​www/​example -type f -exec chmod 640 {} \;</​code>​ +
- +
-Si Apache doit pouvoir modifier du contenu (pour un répertoire d'​upload par exemple), on ne modifie que la permission concernant le groupe (le second numéro), donc 770 (rwx rwx ---) pour les répertoires et 660 (rw- rw- ---) pour les fichiers : +
-<​code>​sudo find /​var/​www/​example/​upload -type d -exec chmod 770 {} \; +
-sudo find /​var/​www/​example/​upload -type f -exec chmod 660 {} \;</​code>​ +
- +
-==== Fail2ban ==== +
- +
-Pour contrer les attaques par force brute sur un système d'​authentification d'une application web, il est vivement recommandé d'​utiliser l'​application [[:​Fail2ban]]. +
- +
-===== Problèmes courants ===== +
- +
-En cas d'​erreur du serveur, consultez avant tout les rapports d'​erreurs dans le répertoire ///​var/​log/​apache2//​. +
- +
-Pour afficher les dernières 40 lignes du journal d'​erreur par défaut : +
-<​code>​sudo tail /​var/​log/​apache2/​error.log -n 40</​code>​ +
-===== Liens utiles ===== +
- +
-   * (en) [[https://​apache.org/​|Site officiel du projet Apache]] +
-   * [[https://​httpd.apache.org/​docs/​current/​|Documentation Apache officielle en français]] +
-   * [[tutoriel/​securiser_apache2_avec_ssl|Sécuriser Apache 2 avec SSL]] +
-   * [[:​lamp|installer un serveur LAMP]] +
-   * [[:​docker_lamp|installer un serveur LAMP avec Docker]] +
-   * [[https://​www.it-connect.fr/​cours-tutoriels/​administration-systemes/​serveur-web/​apache/​|Plusieurs tutoriels sur la configuration d'​Apache sur IT-Connect]] +
-   * discussion au sujet de cette documentation sur le forum : https://​forum.ubuntu-fr.org/​viewtopic.php?​pid=21886288 +
-    +
- +
----- +
-// Contributeurs : [[:​utilisateurs:​krodelabestiole]],​ [[:​utilisateurs:​benje]],​ [[:​utilisateurs:​Pepou06]],​ [[:​utilisateurs:​Oxossi]],​ [[:​utilisateurs:​Karting06]],​ [[:​utilisateurs:​albanmartel]]. //+


Le contenu de ce wiki est sous licence : CC BY-SA v3.0