· 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 :
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_certificateetssl_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ètreHostpour qu’Apache renvoie le contenu du VHostextranet.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’URLhttps://localhost:192/extranet/tralala/pointera vershttps://192.168.1.202/tralala/. - Avec
https://192.168.1.202, l’URLhttps://localhost:192/extranet/tralala/pointera vershttps://192.168.1.202/extranet/tralala/.
- Avec
error_logetaccess_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