Apache Reverse Proxy

I. Présentation

Aujourd’hui nous allons étudier la mise en oeuvre d’Apache en tant que reverse proxy en premier-plan (Front-end) d’un autre serveur apache qui sera lui l’arrière-plan (back-end). Nous utiliserons pour cela le module mod_proxy et mod_proxy_http d’Apache. Nous allons juste chercher à rediriger les flux arrivant sur un serveur en destination d’un certain nom de domaine vers un serveur situé plus en amont dans l’architecture. Nous ne prendrons pas ici les sujets de répartition de charge ou de Load-Balancing que peut effectuer le rôle de reverse proxy. Le système de reverse proxy peut ici être schématisé comme suivant

On a donc un premier serveur en front-end qui reçoit l’ensemble des requêtes et plusieurs serveurs web back-end qui contient chacun un site web différent (ou le même dans le cadre d’une répartition de charge). On va donc configurer le serveur reverse proxy pour rediriger chaque requêtes en fonction de l’URL et du contenu demandé. Cela peut s’opérer par dossier (rediriger juste /image vers un serveur spécifique par exemple) ou pour une URL complète, ce que nous allons voir ici.

II. Architecture

Pour illustrer la mise en place de notre reverse proxy Apache dans ce tutoriel, nous suivrons le schéma suivant :

J’ai donc un premier serveur avec l’IP publique 192.168.1.12 qui va recevoir l’ensemble des requêtes des clients. Il contient le www.site1.tuto. J’ai ensuite un second serveur qui lui contient le site www.site2.tuto. Nous allons donc configurer notre premier serveur Reverse Proxy afin qu’il redirige les requêtes www.site2.tuto par le second serveur, remplissant ainsi son rôle de reverse proxy. En revanche il continuera de répondre aux requêtes pour www.site1.tuto, ceci pour illustrer le fonctionnement pour un site normal et site utilisant un reverse proxy.

Je pars ici du principe que les machines sont en place au niveau OS, réseau et ont un service Apache fonctionnel avec un site web par machine répondant chacun aux bonnes URL.

III. Installation et configuration

Nous allons dans un premier temps activer le proxy_http sur le serveur reverse proxy. Celui-ci est le module mod_proxy spécifique au protocole HTTP avec lequel nous travaillons ici. Pour cela, on saisi la commande suivante :

a2enmod proxy_http

Le module “proxy” devrait s’activer en même temps :

On va ensuite redémarrer apache2 pour que les modules soient actifs :

service apache2 restart

Nous allons maintenant créer deux hôtes virtuels. Un qui dirigera les requêtes site1.tuto vers le contenu local, un autre qui aura le rôle du reverse proxy et qui dirigera les requête site2.tuto vers le second serveur avec une configuration standard.

touch /etc/apache2/sites-avaliable/site1.tuto touch /etc/apache2/sites-avaliable/site2.tuto

On va maintenant remplir ces configurations, je mets volontairement uniquement les informations nécessaires pour garder l’essentiel en vu :

Voici la configuration du site1.tuto

< VirtualHost *:80 >
      ServerName www.site1.tuto
      DocumentRoot /var/www/site1
< /VirtualHost >

Voici la configuration du site2.tuto qui est celui sur lequel agira le reverse proxy :

< VirtualHost *:80 >
      ServerName www.site2.tuto
      ProxyPreserveHost On
      ProxyRequests On
      ProxyPass / http://192.168.248.131/
      ProxyPassReverse / http://192.168.248.131
< /VirtualHost >
  • ServerName permet de spécifier le nom de domaine voulu
  • ProxyPass et ProxyPassReverse donnent la correspondance entre le path voulu et l’adresse du serveur destinataire et ajustent l’URL dans les en-têtes HTTP.
  • ProxyRequests permet d’activer et de désactiver la fonctionnalité de serveur mandataire, doit être à Off pour des raisons de sécurité expliquée ici.

Puis on pourra les activer :

a2ensite site1.tuto a2ensite site2.tuto

On peut maintenant recharger la configuration d’Apache2 :

service apache2 reload

On va maintenant passer à la période de test.

A ce stade, il faut également vérifier que les sites testés (ici site1.tuto et site2.tuto) soient bien résolus au niveau DNS pour amener vers le premier serveur ayant le rôle de reverse proxy.

Pour cela il suffit simplement d’aller sur chacun des deux sites, le plus important étant bien sûr d’avoir une réponse du second serveur qui se situe derrière le reverse proxy :

Nous avons donc un serveur reverse proxy en place.

IV. Mise en place du reverse proxy SSL

Liens :

https://www.vincentliefooghe.net/content/apache-reverse-proxy-https
http://www.martinbranda.eu/proxy-pass-sous-apache2-debian-avec-http-et-https/
https://homeserver-diy.net/wiki/index.php?title=Utilisation_d%27Nginx_comme_reverse_proxy_avec_un_certificat_auto-sign%C3%A9,_Let%27s_Encrypt_et_un_chiffrement_fort

<VirtualHost *:443>
  # Activation de SSL pour le trafic entrant, cas dans le cas d'un
  # serveur web classique.
  SSLEngine On
  SSLCertificateFile    /etc/ssl/certs/example.com.crt
  SSLCACertificateFile  /etc/ssl/certs/example.com-intermediate.crt
  SSLCertificateKeyFile /etc/ssl/private/example.com.key
  # Activation de SSL pour la communication avec les backends.
  # On vérifie au passage que le certificat fourni par le backend est
  # bien valide.
  SSLProxyEngine          On
  SSLProxyCheckPeerExpire On
  SSLProxyVerifyDepth     10
  # Configuration classique du mod_proxy, mis à part qu'on spécifie bien
  # https dans l'URL du backend.
  ProxyRequests     Off
  ProxyPreserveHost On
  ProxyPass         / https://192.0.2.42:443/ keepalive=On retry=5
  ProxyPassReverse  / https://192.0.2.42:443/
  ErrorLog  /var/log/apache2/example.com_error.log
  CustomLog /var/log/apache2/example.com_access.log combined
</VirtualHost>