Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
configuration_de_nginx_comme_reverse_proxy_web [2023/04/01 12:23] – [Introduction] superadminconfiguration_de_nginx_comme_reverse_proxy_web [2023/09/11 16:50] (Version actuelle) superadmin
Ligne 3: Ligne 3:
 ===== Introduction ===== ===== 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 d'un serveur web, ce qui constitue un premier rempart de sécurité pour ce dernier, et permet d'accélérer l'accès aux pages web grâce à la mise en cache.+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".
  
-Nous verrons aussi comment utiliser les virtual hosts pour desservir plusieurs hôtes utilisant le même port de connexion (comme des conteneurs) et comment vérrouiller l'accès à un site par mot de passe.+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 ===== ===== 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.
 +
 +{{ ::topologies_reverseproxyweb.png?600 |}}
 +
 +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 ===== ===== Pré-requis =====
  
 __Pour ce LAB il faudra :__ __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 serveur sous Linux qui aura le rôle de reverse proxy, si possible avec 2 cartes réseau.
-  * Un autre serveur web fonctionnel sous n'importe quel OS, et connecté au même réseau LAN que le premier.+  * 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 =====+===== Instructions ===== 
 + 
 +Créer un virtualhost pour le site1 :  
 + 
 +<code>nano /etc/nginx/sites-available/site1.conf</code> 
 + 
 +Y rédiger la configuration suivante : 
 + 
 +<code> 
 +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; 
 +    } 
 +   </code> 
 + 
 +Activer le virtual host en créant un lien symbolique de ce fichier dans ''/etc/nginx/sites-enabled''
 +    
 +<code>ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/site1.conf</code> 
 +    
 +Relancer le service nginx pour appliquer les changements : 
 +    
 +<code>systemctl restart nginx</code> 
 +    
 +Il est possible de tester la validité de la configuration nginx en cas de doute : 
 +    
 +<code>nginx -t</code> 
 + 
 +C'est OK : 
 +    
 +{{ ::nginx_test.png?800 |}} 
 + 
 +Maintenant on peut faire de même avec le second site : 
 + 
 +Création du virtual host :  
 + 
 +<code>nano /etc/nginx/sites-available/site2.conf</code> 
 + 
 +Y rédiger la configuration suivante : 
 + 
 +<code> 
 +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; 
 +    } 
 +   </code> 
 + 
 +Activer le virtual host en créant un lien symbolique de ce fichier dans ''/etc/nginx/sites-enabled''
 +    
 +<code>ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/site2.conf</code> 
 +    
 +Relancer le service nginx pour appliquer les changements : 
 +    
 +<code>systemctl restart nginx</code> 
 + 
 +:!: 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.
  
 ===== Sources ===== ===== Sources =====
  
 +https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/How-to-setup-Nginx-reverse-proxy-servers-by-example
 +
 +https://serverfault.com/questions/706438/what-is-the-difference-between-nginx-variables-host-http-host-and-server-na
  
 +https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto