Configurer un reverse proxy avec HTTP Apache
Cet article présente la configuration d’un reverse proxy avec HTTP Apache.
Il peut être intéressant d’en installer un pour les raisons suivantes:
- Sécurité : le reverse proxy peut cacher les serveurs backend aux yeux de l’utilisateur
- Performance : il est possible de répartir la charge entre différence serveur backend avec du load balancing
- scalabilité : il est plus facile d’ajouter de nouveaux serveurs backend à infrastructure.
Schéma
Un reverse proxy se situe du côté du serveur. Voici un schéma pour mieux illustrer cela :

Configuration de base
| Directive | Explication |
|---|---|
| ServerName | Permet identifier un serveur, correspondant au nom de domaine voulue.Lien doc apache |
| ProxyPreserveHost On | Va transmettre l0en host de la requête entrante, plutôt que d’utiliser celle fournit par ProxyPass Lien doc apache |
| ProxyPass | Permet de rediriger les requête entrantes ers un serveur en backend ou vers cluster de server appelé Balancer. |
| ProxyPassReverse | A normalement la même configuration que le proxyPass. Cette directive va réecrire les en-têtes des réponses envoyés par le serveur en backend. Cela permet de rendre le serveur backend anonyme auprès du client. |
Exemple :
<VirtualHost *:80>
ServerName incroyable.ch
ProxyPass "/api/animals" "http://172.17.0.3:3000/"
ProxyPassReverse "/api/animals" "http:/172.17.0.3:3000"
ProxyPass "/" "http://172.17.0.2:80/"
ProxyPassReverse "/" "http:/172.17.0.2:80"
</VirtualHost>
Une explication plus détaillée, avec des conteneurs Docker se trouve sur mon repo github à l’adresse suivante : https://github.com/rya-sge/http-infra/tree/fb-apache-reverse-proxy
Load Balancing
Le load balancing permet de rediriger les requêtes en direction de plusieurs serveurs en backend. Cela permet d’ajouter de la redondance au proxy.
Par défaut la répartition des charges est du Round Robin. Les requêtes sont réparties en fonction du nombre de requêtes traitées par chacun des serveurs backend afin de répartir les requêtes.
Ex :
<Proxy balancer://dynamic>
BalancerMember 'http://<?php print "$DYNAMIC_APP_1"?>'
BalancerMember 'http://<?php print "$DYNAMIC_APP_2"?>'
</Proxy>
ProxyPreserveHost On
ProxyPass '/api/animals' "balancer://dynamic/"
ProxyPassReverse '/api/animals' "balancer://dynamic/"
ProxyPass '/' "balancer://static/"
ProxyPassReverse '/' "balancer://static/"
Une explication plus détaillée, avec des conteneurs Docker se trouve sur mon repo github à l’adresse suivante : http-infra/tree/load-balancing-multiple-server-nodes
Sticky Session / Round Robin
Les sticky session permettent d’assigner un serveur particulier à un client lors de sa 1ère requête. Cela permet de ne pas repartir à zéro, au niveau des données, à chaque requête du client, par exemple dans le cas d’un panier d’achat ou d’une authentification.
Directive :
ProxySet stickysession=ROUTEID
Une explication plus détaillée, avec des conteneurs Docker se trouve sur mon repo github à l’adresse suivante : http-infra/tree/fb-load-balancer-sticky-session
Sources
Documentation apache
- Réaliser un reverse proxy : https://httpd.apache.org/docs/2.4/fr/howto/reverse_proxy.html
- proxy balancer : https://httpd.apache.org/docs/2.4/fr/mod/mod_proxy_balancer.html
Autres sources
-
Définition, exemple avec apache httpd : https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/
-
Article très complet en anglais : https://www.digitalocean.com/community/tutorials/how-to-use-apache-as-a-reverse-proxy-with-mod_proxy-on-ubuntu-16-04
-
Cours de Réseaux(RES) enseigné à l’HEIG-VD en 2021