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.
Mise en place
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;
#Indique au serveur final le port destination utilisé par le client pour se connecter au proxy
proxy_set_header X-Forwarded-Port $server_port;
}
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;
#Indique au serveur final le port destination utilisé par le client pour se connecter au proxy
proxy_set_header X-Forwarded-Port $server_port;
}
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 celle-ci ne fonctionne pas dans toutes les situations, je ne recommande pas son utilisation.

