Nginx Proxy Manager te installeren en te gebruiken met Docker

Een reverse proxy is een webserver die voor een andere webserver of een webdienst kan zitten. Hij kan uitgaand verkeer versleutelen, fungeren als load balancer, verkeer omleiden en bescherming bieden. Nginx webserver kan worden gebruikt als proxyserver voor traditionele servers, maar soms kan het instellen ervan vervelend zijn en problemen veroorzaken als het niet goed gebeurt.

Nginx Proxy Manager is een toepassing die het instellen van Nginx als proxyserver eenvoudiger maakt door een grafische gebruikersinterface (GUI) te bieden met functies als ingebouwde SSL-ondersteuning met Let’s Encrypt, ondersteuning voor meerdere hosts, HTTP-authenticatie, toegangslijsten en gebruikersbeheer.

Deze tutorial leert je hoe je de Nginx proxy manager op een Linux server installeert met behulp van Docker. We behandelen alle populaire Linux distributies in één tutorial.

Voorwaarden

  • Een Linux server met Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux met minimaal 1 GB RAM.
  • Een niet-root gebruiker met sudo privileges.
  • Een volledig gekwalificeerde domeinnaam (FQDN) zoals npm.example.com die naar de server wijst.

Stap 1 – Firewall configureren

Cent OS/Rocky Linux/Alma Linux

Je zou de Firewalld firewall geïnstalleerd moeten hebben. Controleer de status van de firewall.

$ sudo firewall-cmd --state
running

Open de poorten 80, 81 en 443.

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

Herlaad de firewall om de veranderingen in te schakelen.

$ sudo firewall-cmd --reload

Ubuntu/Debian

Ubuntu en Debian systemen gebruiken standaard ufw (Uncomplicated Firewall).

Controleer of de firewall draait.

$ sudo ufw status

Als hij draait, open dan de poorten 80, 81 en 443.

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

Open de SSH-poort als de firewall niet draait.

$ sudo ufw allow "OpenSSH"

Schakel de firewall in als hij niet draait.

$ sudo ufw enable

Als hij wel draait, herlaad hem dan om de wijzigingen toe te passen.

$ sudo ufw reload

Stap 2 – Installeer Docker

Cent OS/Rocky Linux/Alma Linux

Voer het volgende commando uit om Docker te installeren.

$ 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

Activeer en start de Docker service.

$ sudo systemctl start docker --now

Voeg je gebruikersnaam toe aan de Docker groep.

$ sudo usermod -aG docker $USER

Log uit van het systeem en log weer in om de wijziging toe te passen.

Stap 3 – Installeer Docker Compose

Download en installeer Docker compose binary.

$ 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

Pas uitvoerbare toestemming toe op de binary.

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

Stap 4 – Docker Compose bestand maken

Maak een directory aan voor de Nginx proxy manager.

$ mkdir ~/nginx-proxy

Ga naar de directory.

$ cd ~/nginx-proxy

Maak mappen aan voor gebruikersgegevens en SSL-certificaten.

$ mkdir {data,letsencrypt}

Maak en open het bestand docker-compose.yml om te bewerken.

$ nano docker-compose.yml

Plak er de volgende code in.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom wordt gevraagd.

Laten we het bestand doornemen. Het eerste deel van het bestand is waar we het Nginx proxy manager image importeren en enkele omgevingsvariabelen instellen in de vorm van database credentials. We stellen ook de poorten 80, 81 en 443 bloot aan de server voor toegang. Je kunt meer poorten blootstellen, zoals 21, voor FTP-toegang. Je kunt IPV6 ondersteuning uitschakelen door de regel DISABLE_IPV6: 'true' uit te zetten. We hebben verschillende mappen van onze host naar de Docker in kaart gebracht voor data en SQL opslag.

We gebruiken hier twee netwerken. Het ene is het interne netwerk npm-internal om de proxy manager en de database met elkaar te verbinden. Deze is optioneel omdat hij automatisch wordt aangemaakt. Maar hier doen we het handmatig door het een naam naar keuze te geven.

We hebben een extern netwerk toegevoegd aan de proxy manager container met de naam npm-nw. Dit netwerk is essentieel omdat je het kunt gebruiken om de proxy manager te verbinden met andere docker containers die je installeert. Door een netwerk te gebruiken kun je elke container direct verbinden zonder dat je zijn poorten aan de server hoeft bloot te stellen.

Stap 5 – Voer Nginx Proxy Manager uit

Voordat we de Docker-container lanceren, moeten we het externe netwerk npm-nw aanmaken. Interne netwerken worden automatisch aangemaakt. Voer het volgende commando uit om het externe netwerk aan te maken.

$ docker network create npm-nw

Start de Docker Container met het volgende commando.

$ docker-compose up -d

Controleer de status van de containers.

$ 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

Stap 6 – Toegang tot de Nginx Proxy Manager

Je hebt nu toegang tot je Nginx proxy manager via de URL http://yourserverIP:81. Je zou het volgende inlogscherm moeten krijgen.

Nginx Proxy Manager Inlogscherm

Voer de volgende standaardgegevens in om je aan te melden.

E-mailadres: [email protected] Wachtwoord: changeme

Vervolgens wordt je meteen gevraagd om een naam en een e-mailadres in te stellen.

Nginx Proxy Manager Bewerk Gebruiker Popup

Klik op de knop Opslaan, en je wordt gevraagd een nieuw wachtwoord in te stellen.

Nginx Proxy Manager Wachtwoord instellen popup

Klik nogmaals op de knop Opslaan, en je kunt de applicatie nu gaan gebruiken.

Nginx Proxy Manager Dashboard

Als je de URL http://yourserverIP in je browser opent, kom je op een standaardpagina die de proxy manager heeft ingesteld.

Nginx Proxy Manager Standaardsite

Stap 7 – Domeinnaam en SSL instellen voor Nginx Proxy Manager

Laten we een domeinnaam instellen voor de toegang tot Nginx Proxy Manager. Deze stap is optioneel, maar is handig als je de applicatie achter SSL wilt zetten.

Klik op Hosts >> Proxy Hosts in het dashboard menu om de Proxy Hosts pagina te openen. Klik vanaf daar op de knop Proxy Host toevoegen om verder te gaan.

Nginx Proxy Manager Nieuw Proxy Host Scherm

Voeg de FQDN naam (npm.example.com) toe en klik erop. Voer het IP-adres van je server in en 81 als doorlaatpoort.

Ga naar het tabblad SSL.

Nginx Proxy Manager SSL configureren

Selecteer Request a new SSL Certificate uit het dropdown menu. Selecteer de opties Forceer SSL en HTTP/2 ondersteuning. Als je HSTS wilt inschakelen, kun je dat ook inschakelen. Als je je domein via Cloudflare hebt geconfigureerd, schakel dan de optie Forceer SSL niet in, anders kom je vast te zitten in een omleidingslus.

Voer je e-mailadres in, ga akkoord met de Let’s Encrypt Terms of Service (TOS) en klik op de knop Opslaan om te eindigen.

Nginx Proxy Manager Proxy Host Lijst

Je domein zou live moeten zijn en moeten werken. Probeer https://npm.example.com te openen in je browser, en je zou het inlogscherm van Nginx Proxy Manager moeten krijgen.

Je kunt dit ook doen voor de standaard landingspagina en deze toewijzen aan een domeinnaam als https://example.com. Verander gewoon de poort van 81 naar 81 tijdens het instellen van de proxy host.

Stap 8 – Gebruik Nginx Proxy Manager met een andere Docker webapplicatie

Nu we de proxy manager hebben geïnstalleerd, is het tijd om hem te gebruiken. Het eerste wat we gaan doen is hem gebruiken om een andere Docker webapplicatie te hosten. Hiervoor zullen we de Ghost blog installeren. Als je meer wilt weten, bekijk dan onze tutorial over het installeren van Ghost met behulp van Docker op een Ubuntu server.

Maak een andere map aan voor je Ghost blog.

$ mkdir ~/ghost

Ga naar de map Ghost.

$ cd ~/ghost

Maak twee mappen aan voor de inhoud en de database.

$ mkdir {content,mysql}

Zelfs als je dezelfde MySQL image gebruikt, moet je de gegevens en hun containers gescheiden houden van die van de Proxy manager. Dit helpt bij het isoleren van eventuele problemen die je tegenkomt en stelt je in staat om spullen te verplaatsen als dat nodig is.

Maak en open het Docker compose bestand om te bewerken.

$ nano docker-compose.yml

Plak de volgende code. Vervang example.com door je eigenlijke domeinnaam voor je Ghost blog. Voer SMTP-gegevens in als je e-mails wilt ontvangen. Je kunt ze verwijderen als je ze niet nodig hebt.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom wordt gevraagd.

Zoals je kunt zien, hebben we de Ghost container verbonden met de Nginx proxy manager via het externe netwerk npm-nw. Op deze manier stellen we de poorten van Ghost niet bloot aan het systeem. We hebben ook een intern netwerk ghost-network gebruikt om onze Ghost app en de bijbehorende database container te verbinden.

Start de container.

$ docker-compose up -d

Ghost configureren in Nginx Proxy Manager

Nu moeten we de reverse proxy instellen voor onze Ghost installatie. Open Nginx Proxy manager in je browser, ga naar Dashboard >> Hosts >> Proxy Host, en voeg een nieuwe Proxy Host toe.

Ghost Blog Nginx Proxy Manager configureren

Voeg de domeinnaam toe die je hebt gekozen voor je Ghost blog. Voer voor de Hostname/IP waarde de naam van je container in. In dit geval zou dat ghost-app zijn. We kunnen het IP adres hier niet toevoegen, omdat we de poort van Ghost niet hebben blootgesteld aan de server, en de Nginx proxy zal Ghost niet kunnen bereiken via het IP. Vandaar dat we de containernaam gebruiken, die NPM kan bereiken via Docker’s netwerk npm-nw, dat we hebben aangemaakt. Gebruik 2368 als poort, de standaardpoort die door het Ghost Blog wordt gebruikt. Controleer de andere opties zoals in de schermafbeelding hierboven.

Ga vervolgens naar het tabblad SSL en maak een nieuw SSL-certificaat aan volgens stap 6. Omdat je inhoud gaat uploaden naar je Ghost blog, zou het goed zijn om een maximale uploadgrootte in te stellen voor je uploads.

Gelukkig kun je met NPM aangepaste configuraties toevoegen. Ga naar het tabblad Geavanceerd en vul in het vak client_max_body_size 50m; in.

Ghost Blog NPM geavanceerde configuratie

Klik op de knop Opslaan om het toevoegen van de proxy host af te ronden. Je zou je Ghost blog moeten kunnen benaderen via de URL https://ghost.exampl.com

Spookblog Home

Stap 9 – Gebruik Nginx Proxy Manager als omleidingsdienst

Laten we eens kijken hoe je NPM kunt gebruiken om een domein eenvoudig om te leiden naar een ander domein. Ga daarvoor naar Dashboard >> Hosts >> Omleidingshosts. Klik vanaf daar op de knop Redirection Host toevoegen om te beginnen.

Nginx Proxy Manager Redirection Host

Voer de domeinnaam in die je wilt doorsturen. En voer het doorstuurdomein in. Het doorstuurdomein zou al geconfigureerd moeten zijn. Laat het schema op auto staan. Afhankelijk van je behoefte kun je kiezen voor http of https. Selecteer de juiste HTTP-code en vink Preserve Path en Block Common Exploits opties aan. Als je een auto of https schema gebruikt, zorg er dan voor dat je een SSL certificaat hebt geselecteerd of aangemaakt met NPM. Klik op Opslaan om het toevoegen van je omleidingshost te voltooien.

Je domein example.com zou moeten beginnen om te leiden naar blog.example.com.

Ander gebruik van Nginx Proxy Manager

Er zijn nog twee andere manieren waarop je Nginx Proxy Manager kunt gebruiken. Je kunt het gebruiken als 404 host, wat betekent dat je een domein kunt gebruiken als landingspagina om de zoekmachines te laten zien dat de domeinpagina’s niet bestaan. De stap omvat alleen het invoeren van een domein en het instellen van SSL ervoor. Je kunt dit ook gebruiken om de logs voor de domeinnaam bij te houden en het referrerverkeer te bekijken.

De andere mogelijkheid is om NPM te gebruiken als stream host. Je kunt deze functie gebruiken om TCP/UDP poorten door te sturen naar een andere computer op het netwerk. Dit is handig als je spelservers host. Het enige wat je hiervoor nodig hebt is dat je de inkomende poort, het doorstuurdomein of IP adres, de doorstuurpoort en het type poort selecteert.

Nginx Proxy Manager Nieuwe Stream Host Popup

Gebruik Nginx Proxy Manager om een statische website te hosten

Nginx Proxy Manager kan ook eenvoudige statische of dynamische websites hosten. Voeg daarvoor een nieuwe proxy host toe en kies 127.0.0.1 als het Doorstuurdomein en 80 als de poort.

Nginx Proxy Manager Statische Website Host

Voer onder het tabblad Geavanceerd de configuratie in die de hoofddirectory specificeert. Zorg ervoor dat de hoofddirectory voor de site is gemount in de initiële Docker compose configuratie. Hier gebruiken we de /data/static directory om onze statische website te hosten.

Nginx Proxy Manager Statische Site Geavanceerde Configuratie

Klik op Opslaan om te eindigen, en je site zou toegankelijk moeten zijn. Je kunt ook elk type site hosten met de proxy manager.

Statische site demopagina

Stap 10 – Diverse functies

Gebruik de toegangscontrolefunctie van Nginx Proxy Manager

Je kunt de toegangslijstfunctie van NPM gebruiken om HTTP-authenticatie in te schakelen of IP-bereiken te blokkeren. Open NPM en ga naar de pagina Dashboard >> Toegangslijsten.

Klik op de knop Toegangslijst toevoegen om te beginnen.

Nginx Proxy Manager Nieuwe toegangslijst

Je kunt je Access List(ACL) configuratie een naam geven. Het tabblad Satisfy Any, indien aangevinkt, zal toegang toestaan als de cliënt aan een van de opgegeven voorwaarden voldoet. Als een cliënt de HTTP-authenticatie doorstaat, maar de IP-gebaseerde toegang niet doorstaat, wordt hij toegelaten. Maar als de optie Satisfy Any niet is aangevinkt, moet de cliënt aan alle voorwaarden voldoen.

De functie Pass Auth to Host stuurt de authenticatie door naar de hostserver.

Ga vervolgens naar het tabblad Autorisatie. Hier kun je een gebruikersnaam en wachtwoord aanmaken voor de HTTP-authenticatiemethode. Om meer dan één gebruiker toe te voegen, klik je op de knop Toevoegen. Je kunt slechts maximaal 5 gebruikers toevoegen. En er is een bug met de knop Toevoegen, dus gebruik eerst de knop en vul dan de details in. Als je de details invult en later op de knop klikt om nog een gebruiker toe te voegen, wist hij de vorige gebruikersgegevens.

Nginx Proxy Manager Autorisatie instelling

Ga naar het tabblad Toegang. Hier kun je instellen welke IP adressen toegang moeten krijgen of geweigerd worden.

Nginx Proxy Manager IP Toegang Tab

Klik op Opslaan om te eindigen.

Om deze Toegangslijst te gebruiken, moet je hem selecteren bij het toevoegen van je proxy host. Zoals in het voorbeeld voor Ghost Blog hieronder, hebben we onze Toegangslijst geselecteerd.

Ondersteuning voor Nginx Proxy Manager Proxy Access List

Ondersteuning voor meer domeinnamen inschakelen

Als het aantal hosts en domeinen groeit, kan je Nginx zonder hashruimte komen te zitten of tegen geheugenproblemen aanlopen. We kunnen een aangepaste configuratie toevoegen die geldt voor alle hosts om dit probleem op te lossen.

Maak hiervoor de directory custom aan binnen ~/nginx-proxy/data/nginx.

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

Maak en open het bestand http.conf in deze map.

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

Plak de volgende regels erin.

proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom wordt gevraagd.

Nginx zou deze waarden automatisch moeten accepteren. Als dat niet gebeurt, kun je de NPM-container opnieuw starten met het volgende commando.

$ docker restart npm-app

Standaard landingspagina omleiden

In stap 6 zie je de standaardpagina als je de URL http://<yourserverIP> intypt. Als je dat wilt veranderen, is dat mogelijk. Ga daarvoor naar de pagina Instellingen. Klik op de drie puntjes aan de rechterkant en klik op de knop Bewerken.

Nginx Proxy Manager Landingspagina bewerken

Je kunt de landingspagina instellen als 404-pagina, omleidingspagina, of er aangepaste HTML aan toevoegen met de optie Aangepaste pagina. Als je Redirect kiest, moet je de doel-URL opgeven.

Nginx Proxy Manager Standaard Site Instellingen

Dit is de aangepaste HTML die we voor ons doel hebben gebruikt.

<!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>

Klik op Opslaan om te eindigen. Je landingspagina zou veranderd moeten zijn in iets als hieronder.

Nginx Proxy Manager aangepaste landingspagina

Stap 11 – Update Nginx Proxy Manager

Om NPM bij te werken, stop je eerst de containers.

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

Haal de nieuwste images op.

$ docker-compose pull

Start de containers opnieuw.

$ docker-compose up -d

Conclusie

Dit besluit onze tutorial waarin je Nginx Proxy Manager hebt geïnstalleerd en hebt geleerd hoe je het kunt gebruiken om een proxy host toe te voegen voor een andere docker container, het te gebruiken als omleidingsdienst, en de toegang ermee te controleren. Als je vragen hebt, plaats ze dan in de opmerkingen hieronder.