Pour installer Nginx Proxy Manager, lancez le conteneur officiel avec Docker Compose, exposez les ports 80, 81 et 443, puis créez votre premier proxy hôte depuis l’interface web. La commande suivante prépare la base de données MariaDB et le gestionnaire de reverse proxy en quelques minutes. L’interface d’administration est ensuite disponible sur http://adresse-du-serveur:81. Ce guide explique la configuration complète, le HTTPS automatique, les erreurs courantes et les bonnes pratiques de sécurité.

Nginx Proxy Manager, définition et cas d’usage

Nginx Proxy Manager est une interface web qui simplifie la configuration de Nginx comme reverse proxy. Au lieu d’écrire manuellement des blocs server, vous indiquez un nom de domaine, une adresse interne et un port. L’application génère la configuration Nginx, la recharge et peut demander un certificat TLS Let’s Encrypt. Elle convient particulièrement à un serveur personnel, un homelab, un VPS, une instance n8n ou plusieurs applications Docker accessibles depuis Internet.

Le reverse proxy reçoit la requête publique, choisit le service correspondant au nom de domaine, puis transmet la requête au conteneur privé. Le port 80 sert généralement la redirection HTTP vers HTTPS, le port 443 chiffre le trafic et le port 81 reste réservé au panneau d’administration. Cette séparation est importante : le panneau ne doit pas être exposé plus largement que nécessaire.

Si votre objectif est plutôt de publier un site WordPress complet dans Docker, consultez aussi notre tutoriel WordPress avec Docker et Nginx. Nginx Proxy Manager intervient ensuite comme couche d’entrée devant vos services.

Préparer le serveur avant l’installation

Il vous faut un serveur Linux récent, Docker Engine, le plugin Docker Compose, une adresse IP publique et un nom de domaine dont les enregistrements DNS pointent vers cette IP. Prévoyez au moins 1 Go de mémoire pour un usage léger, davantage si le serveur héberge déjà plusieurs applications. Vérifiez aussi que les ports 80, 81 et 443 ne sont pas occupés par Apache, Caddy ou une autre instance Nginx.

docker --version
docker compose version
sudo ss -ltnp | grep -E ':80|:81|:443'

Sur un VPS, autorisez uniquement les ports nécessaires dans le pare-feu. Le port 81 est utile pendant l’administration, mais il ne devrait pas être ouvert à tout Internet. Vous pouvez l’autoriser seulement depuis votre adresse IP, ou passer par un tunnel VPN.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 203.0.113.10 to any port 81 proto tcp
sudo ufw enable

Remplacez l’adresse d’exemple par votre IP réelle. Si elle change souvent, n’ouvrez pas durablement le port 81 à tout le monde. Une fois les prérequis terminés, créez un dossier dédié et protégez le fichier contenant les variables de connexion.

Installer Nginx Proxy Manager avec Docker Compose

Créez un fichier compose.yml dans un répertoire réservé à Nginx Proxy Manager. L’exemple utilise MariaDB, une base séparée et des volumes persistants. Les données de la base et les certificats survivent ainsi à la recréation des conteneurs.

mkdir -p ~/nginx-proxy-manager
cd ~/nginx-proxy-manager
nano compose.yml
services:
  app:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm-app
    restart: unless-stopped
    ports:
      - "80:80"
      - "81:81"
      - "443:443"
    environment:
      DB_MYSQL_HOST: db
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: npm
      DB_MYSQL_PASSWORD: changez-ce-secret
      DB_MYSQL_NAME: npm
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db

  db:
    image: jc21/mariadb-aria:latest
    container_name: npm-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: changez-ce-root-secret
      MYSQL_DATABASE: npm
      MYSQL_USER: npm
      MYSQL_PASSWORD: changez-ce-secret
    volumes:
      - ./mysql:/var/lib/mysql

Remplacez les deux secrets avant le démarrage. Utilisez des mots de passe longs et différents, sans les publier dans un dépôt Git. Pour une installation professionnelle, préférez un fichier .env conservé hors du dépôt et une sauvegarde chiffrée des volumes.

docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=50 app

Après le premier démarrage, ouvrez http://adresse-du-serveur:81. Les identifiants initiaux sont affichés dans la documentation officielle du projet. Changez immédiatement l’adresse e-mail et le mot de passe depuis l’interface, puis vérifiez que les deux conteneurs sont en état Up.

Créer un premier Proxy Host

Dans le panneau, ouvrez Proxy Hosts, puis Add Proxy Host. Dans Domain Names, saisissez le nom de domaine public, par exemple app.exemple.fr. Dans Forward Hostname, indiquez le nom du service Docker joignable depuis le même réseau, ou son adresse IP privée. Dans Forward Port, saisissez le port interne de l’application, pas forcément le port public.

Activez Websockets Support pour les applications qui utilisent une connexion persistante, comme certains tableaux de bord et outils collaboratifs. Activez aussi la protection contre les exploits courants, puis enregistrez. Le nom DNS doit déjà résoudre vers le serveur avant de demander le certificat.

# Vérifier la résolution DNS depuis votre poste
dig +short app.exemple.fr

# Vérifier la réponse HTTP après création du proxy
curl -I http://app.exemple.fr

Si l’application cible est un autre conteneur du même projet, utilisez son nom de service et son port interne. Si elle appartient à un autre projet Compose, connectez les deux projets à un réseau Docker externe partagé. Évitez de mettre localhost comme destination depuis le conteneur Nginx Proxy Manager : localhost désigne le conteneur lui-même, pas votre application.

Activer HTTPS avec Let’s Encrypt

Dans l’onglet SSL Certificates, cliquez sur Add SSL Certificate, choisissez Let’s Encrypt, saisissez le ou les domaines et une adresse e-mail valide. Le serveur doit être joignable sur le port 80 pendant la validation HTTP. Une fois le certificat obtenu, retournez dans le Proxy Host, activez SSL, sélectionnez le certificat et activez Force SSL.

Le renouvellement est géré automatiquement par Nginx Proxy Manager. Vous devez cependant conserver le port 80 disponible et surveiller les journaux. Un certificat ne corrige pas un DNS incorrect : le domaine doit pointer vers la bonne adresse et les éventuels enregistrements IPv6 doivent aussi être valides.

curl -I http://app.exemple.fr
curl -I https://app.exemple.fr

# Observer les demandes de certificat et les erreurs
docker compose logs -f app

Pour une API, vérifiez aussi les en-têtes et le comportement des requêtes OPTIONS. Pour un service FastAPI, notre guide de création d’une API REST avec FastAPI complète cette configuration avec les principes d’exposition et de test.

Connecter plusieurs applications Docker proprement

La méthode la plus lisible consiste à créer un réseau externe nommé proxy. Nginx Proxy Manager et les applications à publier y sont connectés. Le reverse proxy peut alors utiliser les noms de services Docker, sans exposer chaque application sur un port public.

docker network create proxy

# Dans le compose de l'application cible
networks:
  proxy:
    external: true

services:
  application:
    networks:
      - proxy

networks:
  proxy:
    external: true

Dans l’interface, utilisez le nom exact du service présent sur le réseau, puis son port d’écoute interne. Cette architecture réduit la surface d’attaque : seuls les ports du reverse proxy sont publics. Les bases de données, les interfaces internes et les ports de développement restent isolés.

Ajoutez des règles de contrôle d’accès quand une application est privée. Nginx Proxy Manager permet de créer une Access List avec identifiants ou adresses autorisées. Cette protection ne remplace pas l’authentification de l’application, mais elle ajoute une barrière utile pour un panneau d’administration.

Erreurs fréquentes et diagnostic

Erreur 502 Bad Gateway

Une erreur 502 signifie généralement que Nginx Proxy Manager ne peut pas joindre la destination. Vérifiez le nom du service, le port interne, le réseau Docker partagé et l’écoute réelle de l’application. Depuis le conteneur, testez la résolution et la connexion.

docker exec -it npm-app getent hosts application
docker exec -it npm-app nc -vz application 3000
docker network inspect proxy

Le certificat Let’s Encrypt échoue

Vérifiez que le domaine pointe vers le bon serveur, que le port 80 est ouvert et qu’aucun autre proxy ne répond à la place de Nginx Proxy Manager. Une ancienne entrée IPv6 erronée peut aussi détourner la validation. Testez depuis un réseau extérieur, pas uniquement depuis le serveur.

Le domaine affiche la mauvaise application

Le problème vient souvent d’un enregistrement DNS encore en cache, d’un nom de domaine saisi avec une faute ou d’un autre service qui écoute sur le port 443. Contrôlez les enregistrements A et AAAA, puis inspectez les ports publiés par Docker.

Le panneau sur le port 81 reste inaccessible

Vérifiez le pare-feu du serveur, le pare-feu du fournisseur VPS et le mappage du port dans Compose. Ne modifiez pas le port interne 81 dans le conteneur. Si vous avez volontairement limité l’accès à votre IP, testez depuis le réseau autorisé.

Sécuriser Nginx Proxy Manager après l’installation

Changez les identifiants initiaux, limitez le port 81, sauvegardez les volumes data, letsencrypt et mysql, puis surveillez les mises à jour de l’image. Évitez le tag latest en production si vous avez besoin de reproduire exactement une version : testez une mise à jour sur une copie et conservez un retour arrière.

Ne publiez jamais directement une base de données. Utilisez des secrets distincts pour MariaDB et l’application. Ajoutez une authentification forte aux services exposés, et n’utilisez pas Nginx Proxy Manager comme unique mécanisme de sécurité. Pour WordPress ou une API publique, complétez avec un pare-feu applicatif et une politique de mises à jour, comme dans notre guide pour configurer un WAF gratuit pour WordPress.

# Sauvegarde simple des volumes
tar -czf npm-backup-$(date +%F).tar.gz data letsencrypt mysql

# Mise à jour contrôlée
docker compose pull
docker compose up -d
docker compose logs --tail=100 app

Testez ensuite chaque domaine en HTTPS, vérifiez le renouvellement des certificats et documentez les ports, réseaux et secrets. Une sauvegarde non testée n’est pas une stratégie de reprise : restaurez régulièrement une copie sur un serveur de test.

FAQ Nginx Proxy Manager

À quoi sert Nginx Proxy Manager ?

Nginx Proxy Manager sert à publier plusieurs applications derrière un même serveur en les associant à des noms de domaine. Son interface configure Nginx, les certificats HTTPS et les redirections sans exiger l’écriture manuelle de fichiers de configuration.

Quel port utiliser pour accéder à Nginx Proxy Manager ?

Le panneau d’administration utilise généralement le port 81, tandis que les services publics utilisent les ports 80 et 443. Le port 81 doit être limité à votre adresse IP ou à un VPN quand cela est possible.

Pourquoi Nginx Proxy Manager renvoie une erreur 502 ?

Une erreur 502 indique que le proxy ne joint pas l’application cible. Contrôlez le nom du conteneur, le port interne et le réseau Docker partagé, puis testez la connexion depuis le conteneur Nginx Proxy Manager.

Nginx Proxy Manager renouvelle-t-il les certificats automatiquement ?

Oui, il gère le renouvellement des certificats Let’s Encrypt, à condition que le domaine reste correctement dirigé vers le serveur et que le port 80 soit disponible pour la validation.

Faut-il exposer chaque application sur un port public ?

Non. La meilleure pratique consiste à connecter les applications au même réseau Docker que Nginx Proxy Manager et à utiliser leur nom de service et leur port interne. Seuls les ports 80 et 443 du reverse proxy restent publics.

Sources et documentation

  1. Documentation officielle de Nginx Proxy Manager
  2. Dépôt GitHub officiel du projet
  3. Docker Docs, Docker Compose
  4. Docker Docs, réseaux de conteneurs
  5. Let’s Encrypt, types de challenge
  6. Nginx, module reverse proxy
G
WP Admin Lab

Architecte web full-stack. WordPress, performance, data et sécurité. Notes de terrain, tests reproductibles et retours d'expérience.