Linux

Nginx Proxy Manager

Déployer Nginx Proxy Manager via Docker Compose pour gérer un reverse proxy avec une interface web (sans HTTPS ni certificat).

← Retour aux tutoriels Linux
📚 C'est quoi un reverse proxy ? Un reverse proxy est un serveur qui se place devant vos applications web et redirige le trafic vers le bon service. Par exemple, quand quelqu'un tape nextcloud.labo.local dans son navigateur, le reverse proxy sait qu'il doit envoyer la requête vers le container Nextcloud (port 8081). Ça permet d'avoir un seul point d'entrée (port 80) pour plusieurs applications. Nginx Proxy Manager ajoute une interface graphique pour configurer tout ça sans toucher aux fichiers de config.
ⓘ Environnement de travail Ce tuto est réalisé dans un environnement de test sous WSL avec VS Code. Docker Desktop doit être installé sur Windows avec l'intégration WSL activée. Les ports 80 et 81 doivent être libres.
⚠ Pas de HTTPS Ce tuto configure Nginx Proxy Manager en HTTP uniquement (pas de certificat SSL). C'est adapté pour un labo ou un réseau interne.
⚠ Adaptez les noms de domaine à votre réseau Les domaines *.labo.local utilisés dans ce tuto sont des exemples. Remplacez-les par vos propres noms de domaine de test. L'IP 192.168.1.50 dans le fichier hosts doit être remplacée par l'IP réelle de votre machine Windows (ipconfig dans PowerShell).

Créer le répertoire du projet

Schéma de l'architecture

🌐 Architecture Reverse Proxy Internet / Réseau local │ ▼ ┌────────────────────┐ │ Nginx Proxy Mgr │ ← Écoute sur :80 et :81 │ (reverse proxy) │ :81 = panneau admin └────────┬───────────┘ │ Proxy les requêtes selon le domaine │ ┌─────┼──────────┐ ▼ ▼ ▼ ┌──────┐ ┌────────┐ ┌───────────┐ │ WP │ │ WP2 │ │ Portainer │ │ :80 │ │ :80 │ │ :9000 │ └──┬───┘ └───┬────┘ └───────────┘ ▼ ▼ ┌──────┐ ┌────────┐ │MySQL │ │MySQL 2 │ │:3306 │ │ :3306 │ └──────┘ └────────┘ wordpress.labo.local → WP wordpress2.labo.local → WP2 portainer.labo.local → Portainer
# Créer le dossier du projet (-p = crée les sous-dossiers si besoin)
mkdir -p ~/nginx-proxy-manager

# Se déplacer dans le dossier
cd ~/nginx-proxy-manager

# Ouvrir le dossier dans VS Code pour éditer les fichiers
code .

Créer le docker-compose.yml

Ce fichier déploie Nginx Proxy Manager + des applications web de test à proxifier. Tous les volumes sont en ./data/ pour rester dans le même dossier.

Créez le fichier docker-compose.yml dans VS Code :

services:

  # ========================
  #  NGINX PROXY MANAGER
  # ========================
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - "80:80"      # Port HTTP public
      - "81:81"      # Interface d'administration
    environment:
      DISABLE_IPV6: "true"
    volumes:
      - ./data/npm:/data
      - ./data/npm-letsencrypt:/etc/letsencrypt
    networks:
      - proxy-net

  # ========================
  #  APP 1 : Site statique
  # ========================
  site1:
    image: nginx:alpine
    container_name: site1
    restart: unless-stopped
    volumes:
      - ./site1:/usr/share/nginx/html:ro
    networks:
      - proxy-net

  # ========================
  #  APP 2 : WordPress
  # ========================
  wordpress-db:
    image: mariadb:10.11
    container_name: wp-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: Password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: Password
    volumes:
      - ./data/wp-db:/var/lib/mysql
    networks:
      - proxy-net

  wordpress:
    image: wordpress:latest
    container_name: wordpress
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: wordpress-db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: Password
    volumes:
      - ./data/wordpress:/var/www/html
    depends_on:
      - wordpress-db
    networks:
      - proxy-net

  # ========================
  #  APP 3 : Portainer
  # ========================
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer:/data
    networks:
      - proxy-net

networks:
  proxy-net:
    driver: bridge

Créer la page du site 1

Créez le dossier site1/ et le fichier site1/index.html dans VS Code :

<!DOCTYPE html>
<html>
<head><title>Site 1</title></head>
<body style="font-family:Arial;text-align:center;padding:60px;background:#1a1a2e;color:#eee;">
  <h1 style="color:#7ecfff;">Site 1</h1>
  <p>Ce site est servi via Nginx Proxy Manager.</p>
</body>
</html>

Lancer la stack

# Lancer tous les services en arrière-plan
# -d = "detached" → le terminal reste libre
# Docker va télécharger les images puis créer les conteneurs
docker compose up -d

Vérifier que tout tourne

# Afficher l'état de chaque conteneur de la stack
# Tous doivent être "Up" (en cours d'exécution)
docker compose ps

Tous les containers doivent être en état Up.

Accéder à l'interface d'administration

Ouvrez un navigateur et allez sur :

http://localhost:81

Connexion initiale

Champ Valeur
Email [email protected]
Password changeme

Au premier login, vous serez invité à changer l'email et le mot de passe.

Créer les Proxy Hosts

Dans l'interface NPM, cliquez sur Hosts → Proxy Hosts → Add Proxy Host.

Proxy Host pour Site 1

Champ Valeur
Domain Names site1.labo.local
Scheme http
Forward Hostname / IP site1 (nom du container)
Forward Port 80

Proxy Host pour WordPress

Champ Valeur
Domain Names wordpress.labo.local
Scheme http
Forward Hostname / IP wordpress
Forward Port 80

Proxy Host pour Portainer

Champ Valeur
Domain Names portainer.labo.local
Scheme http
Forward Hostname / IP portainer
Forward Port 9000
ⓘ Aucun certificat SSL Laissez l'onglet SSL vide — pas de certificat, tout reste en HTTP.

Configurer la résolution DNS

Pour que les noms de domaine pointent vers votre serveur, configurez-les dans votre DNS :

Sur votre PC Windows (fichier hosts)

Ouvrez un terminal PowerShell en administrateur et éditez le fichier hosts :

# Ouvrir le fichier hosts dans le Bloc-notes (en mode admin !)
# Ce fichier permet de forcer la résolution d'un nom → IP
# Sans ça, votre PC ne saura pas où envoyer "site1.labo.local"
notepad C:\Windows\System32\drivers\etc\hosts

Ajoutez ces lignes (remplacez l'IP par celle de votre machine, voir ipconfig) :

# ⭐ Remplacez 192.168.x.x par l'IP réelle de votre PC Windows
# Chaque ligne dit : "quand je tape ce nom, va à cette IP"
# C'est comme un annuaire local qui court-circuite le DNS
192.168.1.50    site1.labo.local
192.168.1.50    wordpress.labo.local
192.168.1.50    portainer.labo.local

Ou créez des enregistrements A dans votre serveur DNS Windows (voir le tuto DNS).

Tester les accès

Depuis un poste client :

# Tester Site 1 depuis le terminal
# curl = outil qui fait une requête HTTP (comme un navigateur en texte)
# Si ça affiche du HTML, le reverse proxy fonctionne !
curl http://site1.labo.local

# Ouvrir dans le navigateur pour voir le résultat visuel
# Chaque URL passe par NPM (port 80) qui redirige vers le bon conteneur
http://site1.labo.local       → Site statique  (conteneur site1, port 80)
http://wordpress.labo.local    → WordPress      (conteneur wordpress, port 80)
http://portainer.labo.local    → Portainer      (conteneur portainer, port 9000)

Nginx Proxy Manager routera automatiquement chaque requête vers le bon container en fonction du nom de domaine.

Structure du dossier

nginx-proxy-manager/
├── docker-compose.yml
├── site1/
│   └── index.html
└── data/
    ├── npm/              # Config Nginx Proxy Manager
    ├── npm-letsencrypt/  # Certificats (vide en HTTP)
    ├── wp-db/            # Base de données WordPress
    ├── wordpress/        # Fichiers WordPress
    └── portainer/        # Données Portainer
✔ Résultat Nginx Proxy Manager est opérationnel et route le trafic HTTP vers vos différentes applications Docker. Toute la configuration se fait via l'interface web sur le port 81. Les données sont dans ./data/, visible dans VS Code.