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 :

schema-reverse-proxy

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

You might also enjoy