Logo Khaganat

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édentesRévision précédente
Prochaine révision
Révision précédente
fr:apache [2023/06/21 06:38] – [Un serveur pare-feu et d'autres derrières] zatalyzfr:apache [2024/10/26 15:22] (Version actuelle) – [Les arguments proxy] zatalyz
Ligne 63: Ligne 63:
  
         <Directory /var/www/monsite/ >         <Directory /var/www/monsite/ >
-                Options Indexes FollowSymLinks MultiViews+                Options FollowSymLinks MultiViews
                 AllowOverride All                 AllowOverride All
-                Order allow,deny +                Require all granted
-                allow from all+
         </Directory>         </Directory>
  
Ligne 77: Ligne 76:
   * ''SSLCertificateFile'' et ''SSLCertificateKeyFile'' : indique le chemin des deux fichiers du certificat. Il faut évidement adapter le chemin au nom de domaine, et avoir généré le certificat (on voit ça plus bas).    * ''SSLCertificateFile'' et ''SSLCertificateKeyFile'' : indique le chemin des deux fichiers du certificat. Il faut évidement adapter le chemin au nom de domaine, et avoir généré le certificat (on voit ça plus bas). 
   * ''Alias'' : permet de faire des URL plus élégantes. Une option parmi d'autres... Ici, sans alias, le dokuwiki serait accessible avec le lien "monsite.org/undossier/unautredossier/dokuwiki" ce qui est longuet ; l'alias permet que le lien "monsite.org/dokuwiki" serve le dokuwiki. On peut même pointer un dossier hors de ''/var/www'' (par exemple ''/home/moi/unboutdesite''. Il y a parfois des bonnes raisons de le faire ;). Voir plus bas le détail !   * ''Alias'' : permet de faire des URL plus élégantes. Une option parmi d'autres... Ici, sans alias, le dokuwiki serait accessible avec le lien "monsite.org/undossier/unautredossier/dokuwiki" ce qui est longuet ; l'alias permet que le lien "monsite.org/dokuwiki" serve le dokuwiki. On peut même pointer un dossier hors de ''/var/www'' (par exemple ''/home/moi/unboutdesite''. Il y a parfois des bonnes raisons de le faire ;). Voir plus bas le détail !
-  * ''Directory'' : va permettre de déclarer diverses options, rendant le dossier (et donc le site web associé) utilisable pour la navigation web, en tirant partie par exemple des possibilités de php, mais aussi en indiquant ce qui est permis et interdit et contribue donc un peu à la sécurité. Ici, ce sont des options classiques qui fonctionnent dans 90% des cas. +  * ''Directory'' : va permettre de déclarer diverses options, rendant le dossier (et donc le site web associé) utilisable pour la navigation web, en tirant partie par exemple des possibilités de php, mais aussi en indiquant ce qui est permis et interdit et contribue donc un peu à la sécurité. Ici, ce sont des options classiques qui fonctionnent dans 90% des cas. Mais il faut adapter parfois suivant les dossiers : 
 +    * ''Options'' : attention à déclarer uniquement ce qui est utile. 
 +      * ''Indexes'' permet de lister les fichiers dans un répertoire si aucun fichier index (comme index.html ou index.php) n'est présent, ce qui peut poser des problèmes de sécurité. Donc on peut éviter ? 
 +      * ''FollowSymLinks'' : Autorise Apache à suivre les liens symboliques (symlinks) dans le répertoire. Voir aussi la doc sur ''SymLinksIfOwnerMatch'' (usage plus spécifique).  
 +      * ''MultiViews'' : Permet à Apache de servir différentes versions d'un même fichier selon la requête du client (langue, type de contenu, etc.) 
 +      * ''ExecCGI'', ''Includes'', ''IncludesNOEXEC'' sont intéressants mais allez voir la doc officielle, parce que c'est assez pointu comme usage.  
 +      * ''None'' : pour interdire toutes les options dans un répertoire. 
 +    * ''AllowOverride All'' permet l'utilisation de fichiers .htaccess ; cela peut avoir un impact sur les performances. Mais pas mal de CMS utilisent les htaccess. 
 +    * ''Require all granted'' : Remplace les anciennes directives ''Order allow,deny'' et ''allow from all''. Cela autorise toutes les requêtes à accéder à ce répertoire. 
 +      * ''Require all denied'' pour interdire l'accès (utile pour s'assurer que certains dossiers ne seront pas du tout accessibles) 
 +      * ''Require ip'' : Permet de restreindre l'accès à des adresses IP spécifiques ou à des plages d'adresses IP. 
 +      * ''Require host'' : Permet d'autoriser l'accès basé sur le nom d'hôte de la requête. 
 +      * ''Require user'' et ''Require valid-user'' : Permet d'accorder l'accès à des utilisateurs spécifiques ce qui demande d'utiliser des mécanismes d'authentification 
 +      * ''Require env'' : Permet d'accorder l'accès en fonction d'une variable d'environnement, ça commence à être assez pointu comme usage. 
 +      * ''Require expr'' : Permet d'utiliser une expression conditionnelle pour contrôler l'accès. Par exemple toutes les ip du réseau interne. 
 + 
  
 Après chaque modification de ces fichiers, afin que ce soit pris en compte, vérifiez la configuration et relancez le service apache Après chaque modification de ces fichiers, afin que ce soit pris en compte, vérifiez la configuration et relancez le service apache
Ligne 354: Ligne 369:
  
 ==== Options lorsqu'un proxy est actif ==== ==== Options lorsqu'un proxy est actif ====
 +Le proxy permet d'avoir un intermédiaire qui relaie les requêtes aux serveurs cibles. Typiquement quand on a une seule ipv4 et des VM sur le réseau interne, c'est un peu obligé ; mais cela peut aussi s'appliquer dans d'autres cas, par exemple pour faire du load balancing, de la mise en cache, pour des aspects de sécurité, etc.
 +
 +Il faut bien activer les modules apache correspondants : 
 +<code>
 +a2enmod proxy
 +a2enmod proxy_http
 +</code>
 +
 +=== Les arguments proxy ===
 +  * ''ProxyPass'' indique qu’Apache redirige toutes les requêtes du nom de domaine renseigné avec ''ServerName'' vers l'adresse ip et le port du serveur cible.
 +    * ''ProxyPass [path] [url] [key=value ...]'', par exemple ''ProxyPass / http://backend_server:8080/''
 +    * ''path'' peut être un chemin, par exemple ''/app'' ; dans ce cas seules les requêtes à ''http://example.org/app'' seront redirigées vers le serveur backend. 
 +    * les key=value peuvent être ''retry'', ''timeout'', etc.
 +  * ''ProxyPassReverse'' ajuste les en-têtes HTTP (''Location'', ''Content-Location'' et ''URI'') pour que les liens dans les réponses du serveur backend soient corrects pour le client.
 +    * ''ProxyPassReverse / http://backend_server:8080/''
 +  * ''ProxyPreserveHost'' permet de contrôler si le serveur Apache transmet l'en-tête ''Host'' d'origine du client au serveur backend. Si c'est sur On, on aura donc l'ip/le domaine du visiteur disponible sur le serveur backend dans les logs, sinon l'ip/le domaine du proxy. C'est plutôt utile sur la modération.
 +    * ''ProxyPreserveHost On''
 +  * ''ProxyPassMatch'' est similaire à ''ProxyPass'', mais permet d'utiliser des expressions régulières pour définir les chemins à rediriger. Puissant mais pas toujours évident.
 +    * ''ProxyPassMatch ^/api/(.*)$ http://backend_server/api/$1''
 +  * ''ProxyErrorOverride'' force Apache sur le proxy à renvoyer ses propres pages d'erreur au lieu de celles du serveur backend
 +    * ''ProxyErrorOverride On''
 +  * ''ProxyVia'' permet d'ajouter des en-têtes Via aux requêtes traitées par un serveur proxy. Utile au débogage mais a un impact sur la confidentialité (permet à des tiers de savoir qu'il y a un proxy).
 +  * ''ProxyRequests'' : permet (ou non) au serveur de servir de proxy à des clients externes.
 +    * ''On'' : proxy ouvert, ce qui peut poser des soucis de sécurité, il faut bien paramétrer <Proxy *> ensuite. En dehors de cas d'usages très spécifique, à éviter. 
 +    * ''Off'' : mettez ça par défaut.
 +
 +
 +Les options concernant le cache et les buffers (absolument dispensable) :
 +  * ''ProxyTimeout'' définit le temps d'attente maximum pour une connexion vers le serveur backend. Utile pour éviter les temps d'attente trop longs si le backend est lent.
 +  * ''ProxyReceiveBufferSize'' configure la taille du buffer de réception (des histoires de cache).
 +  * ''ProxyIOBufferSize'' contrôle la taille des buffers d'entrée/sortie.
 +
 +Load Balancing (voir plus bas pour un exemple plus concret) :
 +  * BalancerMember : adresses des serveurs qui serviront à répartir la charge
 +  * ProxySet pour configurer des paramètres supplémentaires (timeout, retry, status, etc)
 +    * ''lbmethod=byrequests'' distribue les requêtes équitablement entre les serveurs
 +    * ''status=+H'' indique l’hôte principal
 +
 +
 +
 +
 === Sur le serveur même : servir un port particulier === === Sur le serveur même : servir un port particulier ===
  
Ligne 453: Ligne 509:
  
 Cela devrait marcher. À répeter sur chaque VM du réseau. Cela devrait marcher. À répeter sur chaque VM du réseau.
 +
 +=== Load balancing ===
 +C'est utile pour les services critiques ou fortement sollicités. Je met la doc ici mais nous n'avons pas (encore) eu l'occasion de vraiment essayer ça. 
 +
 +Un fichier de conf sur le proxy ressemblera à ceci : 
 +<code><VirtualHost *:80>
 +    ServerName example.org
 +
 +    # Proxy vers un backend principal avec timeout
 +    ProxyPass /app http://backend_server/app retry=5 timeout=60
 +    ProxyPassReverse /app http://backend_server/app
 +
 +    # Configuration d'un cluster de load balancing
 +    <Proxy balancer://mycluster>
 +        BalancerMember http://backend1.example.org
 +        BalancerMember http://backend2.example.org status=+H
 +        ProxySet lbmethod=byrequests
 +    </Proxy>
 +
 +    ProxyPass /cluster balancer://mycluster/
 +    ProxyPassReverse /cluster balancer://mycluster/
 +    
 +    # Ajustement des en-têtes
 +    ProxyPreserveHost On
 +    ProxyErrorOverride On
 +</VirtualHost>
 +</code>
 +Lorsqu'une visiteuse arrive sur ''example.org'', elle est renvoyée aléatoirement vers le serveur backend1 ou backend2, afin d'éviter de surcharger. ''retry=5'' pour la directive ProxyPass indique qu'Apache essaiera jusqu'à cinq fois de se reconnecter au serveur backend, et s'arrêtera après 60 secondes à chercher (ce qui est long !).
  
 ===== Configuration personnalisées ===== ===== Configuration personnalisées =====
Ligne 485: Ligne 569:
 Astuce tirée de [[https://blog.paranoidpenguin.net/2018/12/how-to-remove-facebooks-fbclid-parameter-using-mod_rewrite-on-apache-2-4/|ce site]] avec quelques aménagements.  Astuce tirée de [[https://blog.paranoidpenguin.net/2018/12/how-to-remove-facebooks-fbclid-parameter-using-mod_rewrite-on-apache-2-4/|ce site]] avec quelques aménagements. 
  
 +==== Could not reliably determine the server's fully qualified domain name ====
 +À chaque modif du serveur, vous avez sans doute droit à ce message d'erreur :
 +  apache2: Could not reliably determine the server's fully qualified domain name, using [IP]. Set the 'ServerName' directive globally to suppress this message
 +
 +On va donc configurer ça... juste pour ne pas avoir ce message. Nos sites sont configurés par ailleurs, donc cette demande a peu de sens ; on peut l'ignorer, on peut aussi la supprimer. On va créer un fichier de conf globale pour ça !
 +
 +  sudo nano /etc/apache2/conf-available/full-qualified-domain-name.conf
 +
 +Ajoutez uniquement la ligne suivante (sans rien changer) :
 +  ServerName localhost
 +
 +Puis activez tout cela :
 +  sudo a2enconf full-qualified-domain-name
 +  sudo apachectl graceful
 +
 +Et voilà.
 ===== Liens utiles ===== ===== Liens utiles =====
  
CC Attribution-Share Alike 4.0 International Driven by DokuWiki
fr/apache.1687329524.txt.gz · Dernière modification : 2023/06/21 06:38 de zatalyz

Licences Mentions légales Accueil du site Contact