Bannière
visitor@aschnoebelen.fr:~/2023/07/14/aide-memoire-nginx$ login_

Aide mémoire Nginx

  Le 14 juillet 2023     Aurélien Schnoebelen     #nginx  

Petit mémo pour récapituler quelques points de config pour nginx

1. Reverse proxy avec Nginx

Exemple de configuration dans /etc/nginx/sites_available/default :

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_pass https://192.168.1.202;
        }

        location /extranet/ {
                proxy_set_header Host extranet.mon-site.com;
                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 container 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 container 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 domaines. 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 config 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 server 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 très intéressante, permettant de forcer la redirection en https dans le cas ou on n’a qu’un seul port d’écoute en https (dans mon exemple, si j’essaye de me connecter en HTTP sur mon port ssl 192, nginx renverra un code 497 qui va entraîner une redirection 301 vers ma page en https).
  • location / : à la racine de mon site
  • proxy_pass https://192.168.1.202; : Je redirige vers la patte publique
  • location /extranet/ : Très important ne pas oublier le / à la fin !!! Si je demande la page /extranet il me redirigera automatiquement vers /extranet/ ce qui évitera des soucis avec le proxy…
  • proxy_set_header Host extranet.mon-site.com; : J’envoie dans mes header mon host pour qu’apache me renvoie le contenu de mon vhost extranet.mon-site.com
  • proxy_pass https://192.168.1.202/; : Je redirige vers la pate publique. Attention, le / est très important à la fin !! En effet :
    • Si j’ai https://192.168.1.202/, l’url https://localhost:192/sous-dossier/tralala/ pointera vers https://192.168.1.202/tralala/
    • Si j’ai https://192.168.1.202, l’url https://localhost:192/sous-dossier/tralala/ pointera vers https://192.168.1.202/sous-dossier/tralala/
  • error_log et access_log : Les lignes pour donner les fichiers où écrire les logs d’erreur et d’accès.