aurelien@aschnoebelen.fr:~/blog $

aurelien@aschnoebelen.fr: ~ $ cat ./articles/aide-memoire-nginx/

· 3 min de lecture · #nginx #reverse-proxy #web-server · dir: Web server

Aide-mémoire Nginx

Mémo pratique pour configurer un reverse proxy Nginx sous Linux, rediriger le trafic HTTP/HTTPS et transmettre les bons en-têtes.

Petit mémo pour récapituler quelques points de configuration pour Nginx.

1. Reverse proxy avec Nginx

Exemple de configuration dans /etc/nginx/sites-available/default :

/etc/nginx/sites-available/default nginx
server {
        listen 192 default_server ssl;

        ssl_certificate /etc/ssl/www/certificat.crt;
        ssl_certificate_key /etc/ssl/www/certificat.key;

        error_page 497 =301 https://$host:$server_port$request_uri/;

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass https://192.168.1.202;
                
        }

        location /extranet/ {
            proxy_set_header Host extranet.mon-site.com;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass https://192.168.1.202;
        }
        error_log /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
}

1.1. Contexte

Dans un conteneur Docker, je fais tourner un serveur Apache possédant deux interfaces : une privée en 150.10.0.202 et une publique en 192.168.1.202 (simulant un serveur avec un intranet et un extranet). Or je ne peux pas accéder à mon conteneur sous Windows par son adresse IP, mais seulement par localhost ou 127.0.0.1.

Pour faire fonctionner mon site, je passe donc par un reverse proxy avec Nginx qui redirige mes ports sur mes interfaces, et mes répertoires vers mes noms de domaine. Pour faire court :

  • localhost:192 : pointe vers mon interface publique en 192.168.1.202
  • localhost:150 : pointe vers mon interface privée en 150.10.0.202
  • / : retourne ma page d’accueil
  • /extranet : retourne mon extranet
  • /admin : retourne mon intranet

Exemple : https://localhost:150/admin/ renvoie ma page d’admin accessible depuis mon interface privée (https://localhost:192/admin/ renvoie 404 Not Found car l’intranet n’est accessible que depuis mon réseau privé), et https://localhost:192/extranet/ renvoie ma page extranet.

1.2. Explications

(Ce fichier de configuration ne montre que la moitié de l’exemple, à savoir la gestion des requêtes pour accéder à l’interface publique)

  • listen 192 default_server ssl; : Nginx écoute en SSL sur le port 192, et c’est mon serveur par défaut.
  • ssl_certificate et ssl_certificate_key : Mes fichiers pour ma connexion sécurisée.
  • error_page 497 =301 https://$host:$server_port$request_uri; : Ligne permettant de forcer la redirection en HTTPS dans le cas où l’on n’a qu’un seul port d’écoute en HTTPS (si l’on tente de se connecter en HTTP sur le port SSL 192, Nginx renvoie un code 497 qui entraîne une redirection 301 vers la page en HTTPS).
  • location / : À la racine du site.
  • proxy_pass https://192.168.1.202; : Redirige vers la patte publique.
  • location /extranet/ : Très important : ne pas oublier le / à la fin ! Si l’on demande la page /extranet, Nginx redirigera automatiquement vers /extranet/, évitant ainsi les problèmes avec le proxy.
  • proxy_set_header Host extranet.mon-site.com; : Envoie dans l’en-tête le paramètre Host pour qu’Apache renvoie le contenu du VHost extranet.mon-site.com.
  • proxy_pass https://192.168.1.202/; : Redirige vers la patte publique. Attention, le / est très important à la fin ! En effet :
    • Avec https://192.168.1.202/, l’URL https://localhost:192/extranet/tralala/ pointera vers https://192.168.1.202/tralala/.
    • Avec https://192.168.1.202, l’URL https://localhost:192/extranet/tralala/ pointera vers https://192.168.1.202/extranet/tralala/.
  • error_log et access_log : Directives indiquant les chemins des fichiers de journaux d’erreur et d’accès.

2. Validation de rechargement

Après toute modification de configuration Nginx, tester la syntaxe avant de recharger le service :

# Vérifier la syntaxe des fichiers de configuration
nginx -t

# Recharger la configuration sans interruption de service
systemctl reload nginx