Ceci est une ancienne révision du document !


Configurer Nginx comme reverse proxy web

Introduction

L'intérêt de cette page est de comprendre comment mettre en place un reverse proxy web avec Nginx. Cette machine aura pour but de relayer les paquets à destination de serveurs web accessibles uniquement en local, ce qui constitue un premier rempart de sécurité pour ceux-ci, et permet d'accélérer l'accès aux pages web grâce à la mise en cache. Pour cela, on va utiliser le principe de “virtual hosts”.

Un virtual host est un fichier de configuration spécifique à un domaine ou sous-domaine web, qui permet de contrôler finement les paramètres accès à ses sites web, et de faire cohabiter plusieurs sites web utilisant le même port de connexion sur une seule machine.

Ce tutoriel est fait pour Nginx mais le serveur web apache fonctionne de la même manière, malgré que la syntaxe de la configuration soit différente.

Topologie du LAB

Il y a ici deux topologies possibles, au choix :

  • Une machine servant de proxy + 2 autres faisant office de serveurs web
  • Une machine unique hébergeant le proxy et les 2 serveurs web sous forme de conteneurs docker exposant leur site chacun sur un port réseau différent de la machine physique.

Dans le cadre de ce tutoriel, on utilisera la seconde. Seule l'IP des serveurs web finaux change puisque dans ce cas c'est celle du proxy qui sera utilisée.

Pré-requis

Pour ce LAB il faudra :

  • Un serveur sous Linux qui aura le rôle de reverse proxy, si possible avec 2 cartes réseau.
  • Un deux autres serveurs web fonctionnels sous n'importe quel OS, et connectés au même réseau LAN que le premier, ou sous forme de conteneurs installés sur la même machine que le proxy.

Procédure

Créer un virtualhost pour le site1 :

nano /etc/nginx/sites-available/site1.conf

Y rédiger la configuration suivante :

server {
    server_name site1.domaine;  #sous-domaine, domaine ou IP de connexion au site utilisé par
    location ^~ / {
    #Remplacer l'adresse de l'hôte source par celle du proxy dans les requêtes HTTP à destination du serveur final
        proxy_set_header Host $host; 
    #Indique au serveur final quelle est l'IP de l'hôte source
        proxy_set_header X-Real-IP $remote_addr; ""
    #Indique vers quel serveur final le proxy doit transférer les requêtes (ici IP:port)
        proxy_pass http://192.168.1.1:8080;
    #Indique  au serveur final quel protocole est utilisé entre l'hôte source et le proxy (pour les logs)
        proxy_set_header X-Forwarded-Proto $scheme;
    }
   

Activer le virtual host en créant un lien symbolique de ce fichier dans /etc/nginx/sites-enabled :

ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/site1.conf

Relancer le service nginx pour appliquer les changements :

systemctl restart nginx

Il est possible de tester la validité de la configuration nginx en cas de doute :

nginx -t

C'est OK :

Maintenant on peut faire de même avec le second site :

Création du virtual host :

nano /etc/nginx/sites-available/site2.conf

Y rédiger la configuration suivante :

server {
    server_name site2.domaine;  #sous-domaine, domaine ou IP de connexion au site utilisé par
    location ^~ / {
    #Remplacer l'adresse de l'hôte source par celle du proxy dans les requêtes HTTP à destination du serveur final
        proxy_set_header Host $host; 
    #Indique au serveur final quelle est l'IP de l'hôte source
        proxy_set_header X-Real-IP $remote_addr; ""
    #Indique vers quel serveur final le proxy doit transférer les requêtes (ici IP:port)
        proxy_pass http://192.168.1.1:8081;
    #Indique  au serveur final quel protocole est utilisé entre l'hôte source et le proxy (pour les logs)
        proxy_set_header X-Forwarded-Proto $scheme;
    }
   

Activer le virtual host en créant un lien symbolique de ce fichier dans /etc/nginx/sites-enabled :

ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/site2.conf

Relancer le service nginx pour appliquer les changements :

systemctl restart nginx

:!: La directive proxy_set_header Host $host; peut être remplacée par proxy_set_header X-Forwarded-Host $host; néanmoins cela ne fonctionne pas dans tous les cas (lire la doc pour plus d'infos).

Sources