Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

Publier une application avec Nginx : proxy_pass, en-têtes transmis et certificats

Par mis à jour le

Améliorer cette page

Logo NGINX

Pour publier une application avec Nginx, on déclare un server qui écoute sous le nom public, un location qui envoie les requêtes vers l'application avec proxy_pass, et quatre en-têtes qui disent à l'application qui l'appelle vraiment. Sans ces en-têtes, l'application croit que tout vient de 127.0.0.1 en HTTP. Cette leçon est le module facultatif Nginx de la formation : elle reprend les gestes de publication déjà vus avec Traefik, dans la syntaxe de Nginx.

La leçon suit l'ordre d'une publication : router, transmettre, répartir, puis sécuriser par un certificat.

  • Publier une application sous un nom avec proxy_pass.
  • Préserver le chemin et l'hôte de la requête d'origine.
  • Transmettre les en-têtes X-Forwarded-* attendus par l'application.
  • Déclarer un upstream et comprendre ses sondes passives.
  • Obtenir un certificat par le module ACME de Nginx (en preview) ou par certbot.

Cette leçon suppose que vous comprenez le trajet d'une requête et que vous avez déjà vu un fichier de configuration Nginx.

Comment Nginx route-t-il une requête vers une application ?

Section intitulée « Comment Nginx route-t-il une requête vers une application ? »

Nginx choisit d'abord le bloc server à partir du nom demandé, puis le bloc location à partir du chemin, et proxy_pass envoie la requête au backend. C'est le même découpage que le routeur de Traefik, avec une différence : tout est écrit dans des fichiers de configuration que vous testez puis rechargez, sans découverte automatique de conteneurs.

server {
listen 80;
server_name app.lab.test;
location / {
proxy_pass http://127.0.0.1:8080;
}
}

Ce fichier publie l'application qui écoute sur le port 8080 de la machine sous le nom app.lab.test. Le server_name sert à choisir le bon bloc quand plusieurs noms partagent la même adresse, et location / attrape tous les chemins.

Transmettez l'hôte d'origine, l'adresse du client, la chaîne des relais et le protocole utilisé. Par défaut, Nginx réécrit Host avec le nom et le port du backend et ne dit rien du client réel. L'application ne peut alors ni générer les bonnes adresses absolues, ni journaliser la bonne origine, ni savoir que le client est arrivé en HTTPS.

location / {
proxy_pass http://127.0.0.1:8080;
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;
}

La variable $proxy_add_x_forwarded_for ajoute l'adresse du client à la chaîne déjà reçue au lieu de l'écraser : c'est ce qui préserve la trace quand un autre relais se trouve en amont. Gardez en tête qu'un client peut envoyer lui-même un en-tête X-Forwarded-For : l'application ne doit lui faire confiance que derrière un proxy qu'elle connaît.

Un bloc upstream nomme un groupe de serveurs, et proxy_pass le désigne par son nom. La répartition par défaut tourne tour à tour sur les serveurs du groupe. Avec Nginx open source, la détection d'une panne est passive : un serveur est écarté quand des requêtes échouent, selon max_fails et fail_timeout, mais Nginx n'envoie pas de requête de sonde de lui-même.

upstream app_backend {
server 127.0.0.1:8080 max_fails=2 fail_timeout=10s;
server 127.0.0.1:8081 max_fails=2 fail_timeout=10s;
}

Cette différence compte à l'exploitation : avec Traefik, une sonde active retire un backend avant qu'un utilisateur ne le rencontre ; avec Nginx open source, ce sont les premières requêtes en échec qui déclenchent le retrait. Les sondes actives (health_check) relèvent de l'offre commerciale de Nginx.

Deux chemins existent : le module ACME de Nginx (en preview), qui renouvelle de lui-même, ou l'outil externe certbot, qui modifie la configuration et planifie le renouvellement. Dans les deux cas, le principe est celui de la leçon sur les certificats automatiques : prouver à l'autorité que vous contrôlez le nom, puis récupérer un certificat renouvelé avant son expiration.

Le module ngx_http_acme_module se configure dans Nginx lui-même : un bloc acme_issuer décrit l'autorité (adresse du répertoire ACME, contact, state_path où sont conservées la clé du compte et les certificats), un acme_shared_zone partage l'état entre les processus, et le server en HTTPS déclare acme_certificate puis lit le certificat dans $acme_certificate et $acme_certificate_key. Un server sur le port 80 doit rester joignable pour le défi HTTP-01. Le module accepte aussi le défi tls-alpn-01.

Testez toujours la configuration avec nginx -t avant de la recharger, puis vérifiez la réponse réelle avec curl. Un rechargement d'une configuration invalide est refusé et garde l'ancienne, mais seule une requête de test prouve que le chemin, l'hôte et les en-têtes arrivent comme prévu au backend.

Fenêtre de terminal
nginx -t
curl -sS -H 'Host: app.lab.test' http://127.0.0.1/

Si la réponse n'est pas celle attendue, lisez le journal d'erreurs de Nginx : un 502 indique un backend injoignable, un 504 un backend trop lent, et un 404 un bloc server ou location qui ne correspond pas au nom ou au chemin.

Mettre en pratique : publier une application avec Nginx

Section intitulée « Mettre en pratique : publier une application avec Nginx »

Le lab part d'une petite application qui tourne sur la machine, avec un conteneur Nginx et sa configuration de départ. Il vous demande de configurer Nginx comme reverse proxy de app.lab.test vers l'application locale, de préserver le chemin et l'hôte de la requête et de transmettre les en-têtes attendus d'une application derrière un proxy.

Nginx publie une application par un server, un location et proxy_pass.

  • server_name choisit le bloc, location choisit le chemin.
  • Transmettez Host, X-Real-IP, X-Forwarded-For et X-Forwarded-Proto.
  • Un upstream open source détecte les pannes de façon passive.
  • Le module ACME (en preview, donc pas un statut stable) ou certbot renouvellent les certificats.
  • nginx -t valide, curl prouve.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

8 questions
8 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn