Comment installer et utiliser Nginx Proxy Manager avec Docker

Un reverse proxy est un serveur Web qui peut se placer devant un autre serveur Web ou un service Web. Il peut crypter le trafic sortant, agir comme un équilibreur de charge, rediriger le trafic et offrir une protection. Le serveur Web Nginx peut être utilisé comme serveur proxy devant des serveurs traditionnels, mais sa configuration peut parfois être fastidieuse et causer des problèmes si elle n’est pas faite correctement.

Nginx Proxy Manager est une application qui facilite la configuration de Nginx en tant que serveur proxy en fournissant une interface utilisateur graphique (GUI) avec des fonctionnalités telles que la prise en charge intégrée de SSL avec Let’s Encrypt, la prise en charge de plusieurs hôtes, l’authentification HTTP, les listes d’accès et la gestion des utilisateurs.

Ce tutoriel t’apprendra à installer le gestionnaire de proxy Nginx sur un serveur Linux à l’aide de Docker. Nous couvrirons toutes les distributions Linux populaires dans un seul tutoriel.

Conditions préalables

  • Un serveur Linux exécutant Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux avec un minimum de 1 Go de RAM.
  • Un utilisateur non-root avec des privilèges sudo.
  • Un nom de domaine pleinement qualifié (FQDN) comme npm.example.com pointant vers le serveur.

Étape 1 – Configurer le pare-feu

Cent OS/Rocky Linux/Alma Linux

Le pare-feu Firewalld doit être installé. Vérifie l’état du pare-feu.

$ sudo firewall-cmd --state
running

Ouvre les ports 80, 81 et 443.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --permanent --add-port=81/tcp

Recharge le pare-feu pour activer les changements.

$ sudo firewall-cmd --reload

Ubuntu/Debian

Les systèmes Ubuntu et Debian utilisent ufw (Uncomplicated Firewall) par défaut.

Vérifie si le pare-feu est en cours d’exécution.

$ sudo ufw status

S’il est en marche, ouvre les ports 80, 81 et 443.

$ sudo ufw allow 80
$ sudo ufw allow 81
$ sudo ufw allow 443

Ouvre le port SSH si le pare-feu ne fonctionne pas.

$ sudo ufw allow "OpenSSH"

Active le pare-feu s’il n’est pas en cours d’exécution.

$ sudo ufw enable

S’il est en cours d’exécution, recharge-le pour appliquer les modifications.

$ sudo ufw reload

Étape 2 – Installe Docker

Cent OS/Rocky Linux/Alma Linux

Exécute la commande suivante pour installer Docker.

$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io

Ubuntu

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Debian

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Active et démarre le service Docker.

$ sudo systemctl start docker --now

Ajoute ton nom d’utilisateur au groupe Docker.

$ sudo usermod -aG docker $USER

Déconnecte-toi du système et reconnecte-toi pour appliquer la modification.

Étape 3 – Installer Docker Compose

Télécharge et installe le binaire Docker compose.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Applique la permission d’exécution au binaire.

$ sudo chmod +x /usr/local/bin/docker-compose

Étape 4 – Créer le fichier Docker Compose

Crée un répertoire pour le gestionnaire de proxy Nginx.

$ mkdir ~/nginx-proxy

Passe dans le répertoire.

$ cd ~/nginx-proxy

Crée des répertoires pour les données utilisateur et les certificats SSL.

$ mkdir {data,letsencrypt}

Crée et ouvre le fichier docker-compose.yml pour le modifier.

$ nano docker-compose.yml

Colle le code suivant dans celui-ci.

version: "3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "npm-db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment the line below if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - npm-db
    networks:
      - npm-nw
      - npm-internal

  npm-db:
    image: 'mariadb:latest'
    container_name: npm-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - npm-internal

networks:
  npm-internal:
  npm-nw:
    external: true

Enregistre le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque tu y es invité.

Parcourons le fichier. La première partie du fichier est celle où nous importons l’image du gestionnaire de proxy Nginx et définissons certaines variables d’environnement sous la forme d’informations d’identification de la base de données. Nous exposons également les ports 80, 81 et 443 au serveur pour l’accès. Tu peux exposer d’autres ports, comme le 21, pour l’accès FTP. Tu peux désactiver la prise en charge d’IPV6 en décommentant la ligne DISABLE_IPV6: 'true'. Nous avons mappé plusieurs répertoires de notre hôte vers le Docker pour le stockage des données et de SQL.

Nous utilisons deux réseaux ici. L’un est le réseau interne npm-internal pour connecter le gestionnaire de proxy et la base de données. Celui-ci est facultatif puisqu’il est créé automatiquement. Mais ici, nous le faisons manuellement en lui donnant un nom de notre choix.

Nous avons ajouté un réseau externe au conteneur du gestionnaire de proxy appelé npm-nw. Ce réseau est essentiel car tu peux l’utiliser pour connecter le gestionnaire de proxy à tout autre conteneur docker que tu installes. L’utilisation d’un réseau te permettra de connecter directement n’importe quel conteneur sans avoir besoin d’exposer ses ports au serveur.

Étape 5 – Exécute le gestionnaire de proxy Nginx

Avant de lancer le conteneur Docker, nous devons créer le réseau externe npm-nw. Les réseaux internes sont automatiquement créés. Exécute la commande suivante pour créer le réseau externe.

$ docker network create npm-nw

Lance le conteneur Docker à l’aide de la commande suivante.

$ docker-compose up -d

Vérifie l’état des conteneurs.

$ docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED              STATUS              PORTS                                                                                  NAMES
c91ca0ddca97   jc21/nginx-proxy-manager:latest   "/init"                  About a minute ago   Up About a minute   0.0.0.0:80-81->80-81/tcp, :::80-81->80-81/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   npm-app
1738d71b95da   mariadb:latest                    "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp                                                                               npm-db

Étape 6 – Accéder à Nginx Proxy Manager

Tu peux maintenant accéder à ton gestionnaire de proxy Nginx via l’URL http://yourserverIP:81. Tu devrais obtenir l’écran de connexion suivant.

Écran de connexion de Nginx Proxy Manager

Saisis les informations d’identification par défaut suivantes pour te connecter.

Adresse e-mail : [email protected] Mot de passe : changeme

Ensuite, il te sera immédiatement demandé de définir un nom et une adresse e-mail.

Nginx Proxy Manager Edit User Popup

Clique sur le bouton Enregistrer, et il te sera demandé de définir un nouveau mot de passe.

La fenêtre popup Set Password du Proxy Manager de Nginx

Clique à nouveau sur le bouton Enregistrer, et tu peux maintenant commencer à utiliser l’application.

Tableau de bord de Nginx Proxy Manager

Si tu ouvres l’URL http://yourserverIP dans ton navigateur, tu seras dirigé vers une page par défaut que le gestionnaire de proxy a définie.

Site par défaut du gestionnaire de proxy Nginx

Étape 7 – Configuration du nom de domaine et de SSL pour Nginx Proxy Manager

Définissons un nom de domaine pour accéder à Nginx Proxy Manager. Cette étape est facultative mais elle est utile si tu veux mettre l’application derrière SSL.

Clique sur Hôtes >> Hôtes Proxy dans le menu du tableau de bord pour ouvrir la page Hôtes Proxy. À partir de là, clique sur le bouton Ajouter un hôte proxy pour continuer.

Écran Nouvel hôte de proxy du gestionnaire de proxy Nginx

Ajoute le nom FQDN (npm.example.com) et clique dessus. Saisis l’adresse IP de ton serveur et 81 comme port de transfert.

Passe à l’onglet SSL.

Nginx Proxy Manager Configure SSL

Sélectionne Demander un nouveau certificat SSL dans le menu déroulant. Sélectionne les options Force SSL et HTTP/2 support. Si tu veux activer HSTS, tu peux aussi l’activer. Si ton domaine est configuré via Cloudflare, n’active pas l’option Forcer le SSL, sinon tu seras coincé dans une boucle de redirection.

Saisis ton adresse e-mail, accepte les conditions d’utilisation de Let’s Encrypt (TOS) et clique sur le bouton Enregistrer pour terminer.

Liste d'hôtes proxy du gestionnaire de proxy Nginx

Ton domaine devrait être en ligne et fonctionner. Essaie d’ouvrir https://npm.example.com dans ton navigateur et tu devrais obtenir l’écran de connexion de Nginx Proxy Manager.

Tu peux faire de même pour la page de destination par défaut et l’attribuer à un nom de domaine comme https://example.com. Change simplement le port de 81 à 81 pendant la configuration de l’hôte proxy.

Étape 8 – Utilise le gestionnaire de proxy Nginx avec une autre application Web Docker

Maintenant que nous avons installé le gestionnaire de proxy, il est temps de l’utiliser. La première chose que nous allons faire est de l’utiliser pour héberger une autre application Web Docker. Pour cela, nous allons installer le blog Ghost. Si tu veux en savoir plus, consulte notre tutoriel sur l’installation de Ghost à l’aide de Docker sur un serveur Ubuntu.

Crée un autre répertoire pour ton blog Ghost.

$ mkdir ~/ghost

Passe dans le répertoire Ghost.

$ cd ~/ghost

Crée deux répertoires pour le contenu et la base de données.

$ mkdir {content,mysql}

Même si tu utilises la même image MySQL, tu dois garder les données et leurs conteneurs séparés de ceux du gestionnaire de proxy. Cela aidera à isoler les problèmes que tu pourrais rencontrer et te permettra de déplacer les choses en cas de besoin.

Crée et ouvre le fichier Docker compose pour le modifier.

$ nano docker-compose.yml

Colle le code suivant. Remplace example.com par ton nom de domaine réel pour ton blog Ghost. Entre les détails SMTP si tu veux recevoir des emails. Tu peux les supprimer si tu n’en as pas besoin.

version: '3.3'
services:

  ghost-app:
    image: ghost:latest
    container_name: ghost-app
    restart: always
    depends_on:
      - ghost-db
    environment:
      url: https://ghost.example.com
      database__client: mysql
      database__connection__host: ghost-db
      database__connection__user: ghost
      database__connection__password: ghostdbpass
      database__connection__database: ghostdb
      mail__transport: SMTP
      mail__options__host: {Your Mail Service host}
      mail__options__port: {Your Mail Service port}
      mail__options__secureConnection: {true/false}
      mail__options__service: {Your Mail Service}
      mail__options__auth__user: {Your User Name}
      mail__options__auth__pass: {Your Password}
    volumes:
      - /home/<username>/ghost/content:/var/lib/ghost/content
    networks:
      - npm-nw
      - ghost-network

  ghost-db:
    image: mariadb:latest
    container_name: ghost-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostdbpass
      MYSQL_DATABASE: ghostdb
    volumes:
      - /home/<username>/ghost/mysql:/var/lib/mysql
    networks:
      - ghost-network

networks:
  ghost-network:
  npm-nw: 
    external: true

Enregistre le fichier en appuyant sur Ctrl + X et en entrant Y lorsque tu y es invité.

Comme tu peux le voir, nous avons connecté le conteneur Ghost avec le gestionnaire de proxy Nginx en utilisant le réseau externe npm-nw. De cette façon, nous n’exposons pas les ports du Ghost au système. Nous avons également utilisé un réseau interne ghost-network pour connecter notre application Ghost et le conteneur de base de données correspondant.

Démarre le conteneur.

$ docker-compose up -d

Configurer Ghost dans Nginx Proxy Manager

Maintenant, nous devons définir le proxy inverse pour notre installation Ghost. Ouvre le gestionnaire de proxy Nginx dans ton navigateur, va dans Dashboard >> Hosts >> Proxy Host, et ajoute un nouvel hôte proxy.

Ghost Blog Nginx Proxy Manager Configurer

Ajoute le nom de domaine que tu as choisi pour ton blog Ghost. Pour la valeur Hostname/IP, entre le nom de ton conteneur. Dans ce cas, ce serait ghost-app. Nous ne pouvons pas ajouter l’adresse IP ici car nous n’avons pas exposé le port de Ghost au serveur et le proxy Nginx ne pourra pas atteindre Ghost via l’IP. Nous utilisons donc le nom du conteneur, auquel NPM peut accéder en utilisant le réseau de Docker npm-nw, que nous avons créé. Utilise 2368 comme port, le port par défaut utilisé par le Ghost Blog. Vérifie les autres options comme indiqué dans la capture d’écran ci-dessus.

Ensuite, passe à l’onglet SSL et crée un nouveau certificat SSL en suivant l’étape 6. Comme tu vas télécharger du contenu sur ton blog Ghost, il serait bon de définir une taille maximale pour tes téléchargements.

Heureusement, NPM te permet d’ajouter des configurations personnalisées. Passe à l’onglet Avancé et entre client_max_body_size 50m; dans la case.

Configuration avancée de Ghost Blog NPM

Clique sur le bouton Enregistrer pour finir d’ajouter l’hôte proxy. Tu devrais pouvoir accéder à ton blog Ghost via l’URL suivante https://ghost.exampl.com

Accueil Ghost Blog

Étape 9 – Utilise Nginx Proxy Manager comme service de redirection

Voyons comment tu peux utiliser NPM pour rediriger facilement un domaine vers un autre. Pour ce faire, rends-toi sur Dashboard >> Hosts >> Hosts de redirection. De là, clique sur le bouton Ajouter un hôte de redirection pour commencer.

Hôte de redirection du gestionnaire de proxy Nginx

Saisis le nom du domaine que tu veux rediriger. Et entre le domaine de redirection. Le domaine de redirection devrait déjà être configuré. Laisse le schéma comme auto. En fonction de tes besoins, tu peux choisir http ou https. Sélectionne le bon code HTTP et coche les options Préserver le chemin et Bloquer les exploits courants. Si tu utilises un schéma auto ou https, assure-toi que tu as sélectionné ou créé un certificat SSL à l’aide de NPM. Clique sur Enregistrer pour finir d’ajouter ton hôte de redirection.

Ton domaine example.com devrait commencer à être redirigé vers blog.example.com.

Autres utilisations de Nginx Proxy Manager

Il y a deux autres façons d’utiliser Nginx Proxy Manager. Tu peux l’utiliser comme hôte 404, ce qui signifie que tu peux utiliser un domaine comme page de destination pour montrer aux moteurs de recherche que les pages du domaine n’existent pas. L’étape consiste simplement à entrer un domaine et à configurer SSL pour celui-ci. Tu peux aussi en profiter pour suivre les journaux pour le nom de domaine et voir le trafic des référents.

L’autre fonctionnalité consiste à utiliser NPM comme hôte de flux. Tu peux utiliser cette fonction pour transférer des ports TCP/UDP vers un autre ordinateur du réseau. C’est utile si tu héberges des serveurs de jeux. Il te suffit d’entrer le port entrant, le domaine ou l’adresse IP de redirection, le port de redirection et de sélectionner le type de port.

Popup du gestionnaire de proxy Nginx New Stream Host

Utilise Nginx Proxy Manager pour héberger un site Web statique

Nginx Proxy Manager peut aussi héberger de simples sites Web statiques ou dynamiques. Pour ce faire, ajoute un nouvel hôte proxy et choisis 127.0.0.1 comme domaine de redirection et 80 comme port.

Gestionnaire de proxy Nginx Hôte de site web statique

Sous l’onglet Avancé, entre la configuration spécifiant le répertoire racine. Assure-toi que le répertoire racine du site est monté dans la configuration initiale de Docker compose. Ici, nous utilisons le répertoire /data/static pour héberger notre site Web statique.

Configuration avancée du site statique de Nginx Proxy Manager

Clique sur Enregistrer pour terminer, et ton site devrait être accessible. Tu peux de la même façon héberger n’importe quel type de site en utilisant le gestionnaire de proxy.

Page de démonstration du site statique

Étape 10 – Fonctions diverses

Utilise la fonction de contrôle d’accès de Nginx Proxy Manager

Tu peux utiliser la fonction Listes d’accès de NPM pour activer l’authentification HTTP ou bloquer des plages d’adresses IP. Ouvre NPM et visite la page Tableau de bord >> Listes d’accès.

Clique sur le bouton Ajouter une liste d’accès pour commencer.

Nouvelle liste d'accès du gestionnaire de proxy Nginx

Tu peux nommer ta configuration de liste d’accès (ACL). L’onglet Satisfaire tout, s’il est coché, autorisera l’accès si le client remplit l’une des conditions spécifiées. Si un client réussit l’authentification HTTP mais risque d’échouer à l’accès par IP, il sera autorisé. Mais si l’option Satisfaire tout est décochée, le client devra remplir toutes les conditions.

La fonction Passer l’authentification à l’hôte transmettra la fonction d’authentification au serveur hôte.

Ensuite, passe à l’onglet Autorisation. Ici, tu peux créer un nom d’utilisateur et un mot de passe pour la méthode d’authentification HTTP. Pour ajouter plus d’un utilisateur, clique sur le bouton Ajouter. Tu ne peux ajouter que 5 utilisateurs au maximum. Il y a un bug avec le bouton Ajouter, alors utilise d’abord le bouton et remplis ensuite les détails. Si tu remplis les détails et clique plus tard sur le bouton pour ajouter un autre utilisateur, cela efface les données de l’utilisateur précédent.

Paramètres d'autorisation du gestionnaire de proxy Nginx

Passe à l’onglet Accès. Ici, tu peux définir les adresses IP auxquelles l’accès doit être donné ou refusé.

Nginx Proxy Manager IP Access Tab

Clique sur Enregistrer pour terminer.

Pour utiliser cette liste d’accès, tu dois la sélectionner lorsque tu ajoutes ton hôte proxy. Comme dans l’exemple pour Ghost Blog ci-dessous, nous avons sélectionné notre liste d’accès.

Prise en charge de la liste d'accès au proxy du gestionnaire de proxy Nginx

Activer la prise en charge de plus de noms de domaine

Lorsque le nombre d’hôtes et de domaines augmente, ton Nginx peut manquer d’espace de hachage ou rencontrer des problèmes de mémoire. Nous pouvons ajouter une configuration personnalisée qui s’appliquera à tous les hôtes pour résoudre ce problème.

Pour ce faire, crée le répertoire custom à l’intérieur de ~/nginx-proxy/data/nginx.

$ sudo mkdir ~/nginx-proxy/data/nginx/custom

Crée et ouvre le fichier http.conf à l’intérieur de ce répertoire.

$ sudo nano ~/nginx-proxy/data/nginx/custom/http.conf

Colle les lignes suivantes dans ce fichier.

proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;

Enregistre le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque tu y es invité.

Nginx devrait automatiquement accepter ces valeurs. Si ce n’est pas le cas, tu peux redémarrer le conteneur NPM à l’aide de la commande suivante.

$ docker restart npm-app

Redirige la page d’atterrissage par défaut

À l’étape 6, tu vois la page par défaut lorsque tu tapes l’URL http://<yourserverIP>. Si tu veux changer cela, il est possible de le faire. Pour ce faire, rends-toi sur la page des paramètres. Clique sur les trois points sur le côté droit et clique sur le bouton Modifier.

Modification de la page d'atterrissage de Nginx Proxy Manager

Tu peux définir la page de destination pour qu’elle agisse comme une page 404, une page de redirection ou y ajouter du HTML personnalisé en utilisant l’option Page personnalisée. Si tu sélectionnes Redirection, tu devras indiquer l’URL cible.

Paramètres du site par défaut de Nginx Proxy Manager

C’est le HTML personnalisé que nous avons utilisé pour notre objectif.

<!doctype html>
<html>
  <head>
    <title>Nothing Here</title>
    <meta charset="utf-8"/>
    <meta name="robots" content="noindex"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
      body { 
          text-align: center; 
          padding: 20px; 
          font: 20px Helvetica, sans-serif; 
          color: #333; 
        }
      @media (min-width: 768px){
          body{ padding-top: 150px; 
        }
      }
      h1 { 
          font-size: 50px; 
        }
      article { 
          display: block; 
          text-align: left; 
          max-width: 650px; 
          margin: 0 auto; 
        }
    </style>
  </head>
  <body>
    <article>
        <h1>Oops!</h1>
        <div>
            <p>Sorry for the inconvenience but you are not supposed to be here. You won't get anything here. This page was set for HowtoForge Nginx Proxy Manager Guide.  Maybe, someday it will show something.</p>
        </div>
    </article>
  </body>
</html>

Clique sur Enregistrer pour terminer. Ta page de renvoi devrait être modifiée comme ci-dessous.

Page d'atterrissage personnalisée de Nginx Proxy Manager

Étape 11 – Mets à jour Nginx Proxy Manager

Pour mettre à jour NPM, commence par arrêter les conteneurs.

$ cd ~/nginx-proxy
$ docker-compose down --remove-orphans

Tire les dernières images.

$ docker-compose pull

Redémarre les conteneurs.

$ docker-compose up -d

Conclusion

Ceci conclut notre tutoriel dans lequel tu as installé Nginx Proxy Manager et appris à l’utiliser pour ajouter un hôte proxy pour un autre conteneur docker, l’utiliser comme service de redirection et contrôler l’accès à l’aide de celui-ci. Si tu as des questions, publie-les dans les commentaires ci-dessous.

Vous aimerez aussi...