Apache en tant que serveur reverse proxy
Introduction
La grande diversité des modules permet d’utiliser Apache pour différents types de besoins. Parmi ces derniers, la fonction dite « reverse proxy » est l’une des utilisations les plus fréquentes du logiciel, en dehors bien entendu du serveur web.
Un reverse proxy (ou proxy inverse) est un service placé en amont d’un ou plusieurs serveurs web. Dans un contexte Internet, il permet à des utilisateurs (internautes) d’accéder à des ressources hébergées sur un serveur web n’étant pas directement accessible depuis les réseaux publics, et cela, de manière transparente.
L’ensemble du trafic HTTP transitant donc par ce dernier, il sera alors possible d’y effectuer des traitements afin de sécuriser les échanges, de gérer une répartition de charge ou d’optimiser le service rendu.
Mise en place d’un reverse proxy
1. Activation du module
L’utilisation d’Apache en tant que reverse proxy HTTP ou « proxy inverse » nécessite l’activation des modules mod_proxy et mod_proxy_http.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
L’activation des modules peut également se faire grâce à l’outil a2enmod fourni par Apache :
marty@vm-compilation-eni:~$ sudo a2enmod proxy proxy_http
2. Configuration du module mod_proxy
a. ProxyPass
Directive permettant d’indiquer le ou les serveurs distants depuis l’espace d’URL du serveur local.
Syntaxe : ProxyPass [chemin] !|url [clé=valeur [clé=valeur ...]] [nocanon] [interpolate] [noquery]
Contexte : configuration du serveur, serveur virtuel, répertoire.
L’objectif est de servir un site web hébergé sur un serveur non accessible directement depuis Internet, avec un nom de domaine uniquement défini sur le serveur reverse proxy.
Le contenu délivré par le serveur web se trouvant derrière le reverse proxy correspond au site répondant au nom d’hôte défini dans les directives ProxyPass et ProxyPassReverse :
ServerName www.eni.labs
<Location /app2/>
ProxyPass http://app2.eni.labs.priv/
</Location>
Dans l’exemple ci-dessus, l’appel de la page http://www.eni.labs/app2/ affichera le contenu du site http://app2.eni.labs.priv/.
Le serveur app2.eni.labs.priv recevra donc une requête HTTP comme si un internaute y accédait directement, avec comme hôte demandé app2.eni.labs.priv.
Il en est de même pour toute l’arborescence du site, à savoir toutes les pages commençant par /app2.
Exemples :
-
http://www.eni.labs/app2/ma_page.html affichera la page http://app2.eni.labs.priv/ma_page.html
-
http://www.eni.labs/app2/repertoire/img.gif affichera l’image http://app2.eni.labs.priv/repertoire/img.gif
Il est possible de définir dans cette arborescence, des répertoires ou fichiers pour lesquels on se souhaite pas qu’Apache agisse en tant que reverse proxy.
Dans l’exemple ci-dessous, le chemin /app2/login ne sera pas renvoyé vers le serveur app2.eni.labs.priv, mais sera traité en local :
<Location /app2/login>...
Mise en place d’un reverse proxy/load balancer
En complément du module mod_proxy, le module mod_proxy_balancer apporte la fonctionnalité de load balancer ou répartiteur de charge.
Comme son nom l’indique, il s’agit de pouvoir répartir le trafic sur plusieurs serveurs « backend » afin d’apporter des notions de performance et de haute disponibilité.
1. Activation du module
L’objectif étant de faire de la répartition de charge pour des serveurs web, il est nécessaire de charger les modules suivants :
-
mod_proxy et mod_proxy_http pour la fonction de reverse proxy.
-
mod_proxy_balancer pour la fonction de répartition de charge.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
Afin de prendre en compte les modifications, il est nécessaire de relancer le service Apache, ce qui génère l’erreur ci-dessous dans le fichier défini par ErrorLog :
[Tue Feb 17 10:47:56 2015] [vm-compilation-eni] [emerg] [pid
31433] [client AH01177: Failed to lookup provider 'shm' for
'slotmem': is mod_slotmem_shm loaded??
Le module mod_proxy_balancer possède effectivement une dépendance : le module mod_slotmem_shm permettant la création et l’accès à un segment de mémoire partagée.
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Le service Apache peut alors être relancé.
2. Configuration du module mod_proxy_balancer
Pour illustrer l’utilisation d’Apache en tant que load balancer, trois environnements seront employés :
-
Un serveur Apache en tant que répartiteur de charge et reverse proxy.
-
Deux serveurs Apache en tant que serveurs web.
Le serveur ayant pour adresse IP 10.75.0.107 va donc répartir la charge vers les deux serveurs App_108 et App_109 ayant respectivement les adresses IP 10.75.0.108 et 10.75.0.109.
Trois algorithmes de répartition de charge sont disponibles, basés sur :
-
le nombre de requêtes (byrequests, qui est le mode par défaut),
-
le trafic (bytraffic) en fonction du nombre d’octets transmis,
-
en fonction des requêtes en attente (bybusyness)
Le choix de la méthode de répartition se fait...