Ricerca nel sito web

Come installare e utilizzare Nginx Proxy Manager con Docker


Su questa pagina

  1. Prerequisiti
  2. Passaggio 1: configurazione del firewall
    1. Cent OS/Rocky Linux/Alma Linux
    2. Ubuntu/Debian

    1. Cent OS/Rocky Linux/Alma Linux
    2. Ubuntu
    3. Debian

    1. Configura Ghost in Nginx Proxy Manager

    1. Altri usi di Nginx Proxy Manager
    2. Utilizza Nginx Proxy Manager per ospitare un sito web statico

    1. Utilizza la funzione di controllo degli accessi dei gestori proxy di Nginx
    2. Abilita il supporto per più nomi di dominio
    3. Reindirizza la pagina di destinazione predefinita

    Un proxy inverso è un server Web che può trovarsi di fronte a un altro server Web o a un servizio Web. Può crittografare il traffico in uscita, fungere da bilanciatore del carico, reindirizzare il traffico e offrire protezione. Il server web Nginx può essere utilizzato come server proxy davanti ai server tradizionali, ma a volte configurarlo può essere noioso e causare problemi se non eseguito correttamente.

    Nginx Proxy Manager è un'applicazione che semplifica la configurazione di Nginx come server proxy fornendo un'interfaccia utente grafica (GUI) con funzionalità come il supporto SSL integrato utilizzando Lets Encrypt, il supporto per più host, l'autenticazione HTTP, gli elenchi di accesso e l'utente gestione.

    Questo tutorial ti insegnerà come installare il gestore proxy Nginx su un server Linux utilizzando Docker. Tratteremo tutte le distribuzioni Linux più diffuse in un unico tutorial.

    Prerequisiti

    • Un server Linux che esegue Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux con un minimo di 1 GB di RAM.
    • Un utente non root con privilegi sudo.
    • Un nome di dominio completo (FQDN) come npm.example.com che punta al server.

    Passaggio 1: configurare il firewall

    Sistema operativo Cent/Rocky Linux/Alma Linux

    Dovresti avere il firewall Firewalld installato. Controlla lo stato dei firewall.

    $ sudo firewall-cmd --state
    running
    

    Aprire le porte 80, 81 e 443.

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

    Ricarica il firewall per abilitare le modifiche.

    $ sudo firewall-cmd --reload
    

    Ubuntu/Debian

    I sistemi Ubuntu e Debian utilizzano ufw (Uncomplicated Firewall) per impostazione predefinita.

    Controlla se il firewall è in esecuzione.

    $ sudo ufw status
    

    Se è in esecuzione, apri le porte 80, 81 e 443.

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

    Apri la porta SSH se il firewall non è in esecuzione.

    $ sudo ufw allow "OpenSSH"
    

    Abilita il firewall se non è in esecuzione.

    $ sudo ufw enable
    

    Se è in esecuzione, ricaricalo per applicare le modifiche.

    $ sudo ufw reload
    

    Passaggio 2: installa Docker

    Sistema operativo Cent/Rocky Linux/Alma Linux

    Eseguire il seguente comando per installare 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
    

    Abilita e avvia il servizio Docker.

    $ sudo systemctl start docker --now
    

    Aggiungi il tuo nome utente al gruppo Docker.

    $ sudo usermod -aG docker $USER
    

    Disconnettersi dal sistema e riconnettersi per applicare la modifica.

    Passaggio 3: installa Docker Compose

    Scarica e installa il binario di composizione di Docker.

    $ 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
    

    Applicare l'autorizzazione eseguibile al file binario.

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

    Passaggio 4: crea il file di composizione Docker

    Crea una directory per il gestore proxy Nginx.

    $ mkdir ~/nginx-proxy
    

    Passa alla rubrica.

    $ cd ~/nginx-proxy
    

    Crea directory per dati utente e certificati SSL.

    $ mkdir {data,letsencrypt}
    

    Crea e apri il file docker-compose.yml per la modifica.

    $ nano docker-compose.yml
    

    Incolla il seguente codice al suo interno.

    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
    

    Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

    Esaminiamo il file. La prima parte del file è dove importiamo l'immagine dei gestori proxy Nginx e impostiamo alcune variabili di ambiente sotto forma di credenziali del database. Esponiamo anche le porte 80, 81 e 443 al server per l'accesso. È possibile esporre più porte, ad esempio 21, per l'accesso FTP. Puoi disabilitare il supporto IPV6 rimuovendo il commento dalla riga DISABLE_IPV6: true. Abbiamo mappato diverse directory dal nostro host al Docker per l'archiviazione di dati e SQL.

    Stiamo usando due reti qui. Uno è la rete interna npm-internal per connettere il proxy manager e il database. Questo è facoltativo poiché viene creato automaticamente. Ma qui lo stiamo facendo manualmente dandogli un nome a nostra scelta.

    Abbiamo aggiunto una rete esterna al contenitore del gestore proxy chiamato npm-nw. Questa rete è essenziale perché puoi usarla per connettere il gestore proxy a qualsiasi altro contenitore docker che installi. L'utilizzo di una rete ti consentirà di connettere direttamente qualsiasi contenitore senza la necessità di esporre le sue porte al server.

    Passaggio 5: eseguire Nginx Proxy Manager

    Prima di avviare il contenitore Docker, dobbiamo creare la rete esterna npm-nw. Le reti interne vengono create automaticamente. Eseguire il comando seguente per creare la rete esterna.

    $ docker network create npm-nw
    

    Avvia il contenitore Docker utilizzando il seguente comando.

    $ docker-compose up -d
    

    Controlla lo stato dei contenitori.

    $ 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
    

    Passaggio 6: accedere a Nginx Proxy Manager

    Ora puoi accedere al tuo gestore proxy Nginx tramite l'URL http://yourserverIP:81. Dovresti ottenere la seguente schermata di accesso.

    Immettere le seguenti credenziali predefinite per accedere.

    Indirizzo email: [email  Password: changeme

    Successivamente, ti verrà immediatamente chiesto di impostare un nome e un indirizzo email.

    Fai clic sul pulsante Salva e ti verrà chiesto di impostare una nuova password.

    Fai di nuovo clic sul pulsante Salva e ora puoi iniziare a utilizzare l'applicazione.

    Se apri l'URL http://yourserverIP nel tuo browser, verrai indirizzato a una pagina predefinita impostata dal gestore proxy.

    Passaggio 7: configurazione del nome di dominio e SSL per Nginx Proxy Manager

    Impostiamo un nome di dominio per accedere a Nginx Proxy Manager. Questo passaggio è facoltativo ma è utile se si desidera mettere l'applicazione dietro SSL.

    Fai clic su Host >> Host proxy dal menu del dashboard per aprire la pagina Host proxy. Da lì, fai clic sul pulsante Aggiungi host proxy per procedere.

    Aggiungi il nome FQDN (npm.example.com) e fai clic su di esso. Inserisci l'indirizzo IP del tuo server e 81 come porta di inoltro.

    Passa alla scheda SSL.

    Seleziona Richiedi un nuovo certificato SSL dal menu a discesa. Selezionare le opzioni Forza SSL e supporto HTTP/2. Se vuoi abilitare HSTS, puoi abilitare anche quello. Se hai configurato il tuo dominio tramite Cloudflare, non abilitare l'opzione Forza SSL altrimenti rimarrai bloccato in un ciclo di reindirizzamento.

    Inserisci il tuo indirizzo e-mail, accetta i Termini di servizio (TOS) di Lets Encrypt e fai clic sul pulsante Salva per terminare.

    Il tuo dominio dovrebbe essere attivo e funzionante. Prova ad aprire https://npm.example.com nel tuo browser e dovresti visualizzare la schermata di accesso di Nginx Proxy Managers.

    Puoi farlo allo stesso modo per la pagina di destinazione predefinita e assegnarla a un nome di dominio come https://example.com. Basta cambiare la porta da 81 a 81 durante la configurazione dell'host proxy.

    Passaggio 8: utilizzare Nginx Proxy Manager con un'altra applicazione Web Docker

    Ora che abbiamo installato il proxy manager, è il momento di metterlo a frutto. La prima cosa che faremo è usarla per ospitare un'altra applicazione web Docker. Per questo, installeremo il blog Ghost. Se vuoi saperne di più, consulta il nostro tutorial sull'installazione di Ghost utilizzando Docker su un server Ubuntu.

    Crea un'altra directory per il tuo blog Ghost.

    $ mkdir ~/ghost
    

    Passa alla directory Ghost.

    $ cd ~/ghost
    

    Creare due directory per il contenuto e il database.

    $ mkdir {content,mysql}
    

    Anche se stai usando la stessa immagine MySQL, dovresti mantenere i dati e i loro contenitori separati dai gestori proxy. Ciò contribuirà a isolare eventuali problemi che potresti incontrare e ti consentirà di spostare le cose in caso di necessità.

    Crea e apri il file di composizione Docker per la modifica.

    $ nano docker-compose.yml
    

    Incolla il seguente codice. Sostituisci example.com con il tuo vero nome di dominio per il tuo blog Ghost. Inserisci i dettagli SMTP se desideri ricevere e-mail. Puoi rimuoverli se non ti servono.

    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
    

    Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

    Come puoi vedere, abbiamo connesso il container Ghost con il gestore proxy Nginx utilizzando la rete esterna npm-nw. In questo modo, non esponiamo le porte Ghosts al sistema. Abbiamo anche utilizzato una rete interna ghost-network per connettere la nostra app Ghost e il contenitore del database corrispondente.

    Avvia il contenitore.

    $ docker-compose up -d
    

    Configura Ghost in Nginx Proxy Manager

    Ora, dobbiamo impostare il proxy inverso per la nostra installazione di Ghost. Apri Nginx Proxy manager nel tuo browser, vai su Dashboard >> Host >> Host proxy e aggiungi un nuovo host proxy.

    Aggiungi il nome di dominio che hai scelto per il tuo blog Ghost. Per il valore Hostname/IP, inserisci il nome del tuo contenitore. In questo caso, sarebbe ghost-app. Non possiamo aggiungere l'indirizzo IP qui perché non abbiamo esposto la porta Ghosts al server e il proxy Nginx non sarà in grado di raggiungere Ghost tramite l'IP. Quindi, utilizziamo il nome del contenitore, a cui NPM può accedere utilizzando la rete Docker npm-nw, che abbiamo creato. Usa 2368 come porta, la porta predefinita utilizzata dal Ghost Blog. Controlla le altre opzioni come mostrato nello screenshot qui sopra.

    Successivamente, passa alla scheda SSL e crea un nuovo certificato SSL seguendo il passaggio 6. Dal momento che caricherai i contenuti sul tuo blog Ghost, sarebbe utile impostare una dimensione massima di caricamento per i tuoi caricamenti.

    Fortunatamente, NPM ti consente di aggiungere configurazioni personalizzate. Passa alla scheda Avanzate e inserisci client_max_body_size 50m; nella casella.

    Fare clic sul pulsante Salva per completare l'aggiunta dell'host proxy. Dovresti essere in grado di accedere al tuo blog Ghost tramite l'URL https://ghost.exampl.com

    Passaggio 9: utilizzare Nginx Proxy Manager come servizio di reindirizzamento

    Vediamo come utilizzare NPM per reindirizzare facilmente un dominio a un altro. Per farlo, visita Dashboard >> Host >> Host di reindirizzamento. Da lì, fai clic sul pulsante Aggiungi host di reindirizzamento per iniziare.

    Inserisci il nome di dominio che desideri inoltrare. E inserisci il dominio di inoltro. Il dominio di inoltro dovrebbe essere già configurato. Lascia lo schema come automatico. A seconda delle tue esigenze, puoi scegliere http o https. Selezionare il codice HTTP corretto e selezionare le opzioni Mantieni percorso e Blocca exploit comuni. Se utilizzi uno schema automatico o https, assicurati di aver selezionato o creato un certificato SSL utilizzando NPM. Fai clic su Salva per completare l'aggiunta dell'host di reindirizzamento.

    Il tuo dominio example.com dovrebbe iniziare a reindirizzare a blog.example.com.

    Altri usi di Nginx Proxy Manager

    Esistono altri due modi in cui è possibile utilizzare Nginx Proxy Manager. Puoi usarlo come host 404, il che significa che puoi usare un dominio come landing page per mostrare ai motori di ricerca che le pagine del dominio non esistono. Il passaggio include solo l'inserimento di un dominio e l'impostazione di SSL per esso. Puoi anche utilizzare questa opportunità per tenere traccia dei log per il nome di dominio e visualizzare il traffico dei referrer.

    L'altra caratteristica consiste nell'utilizzare NPM come host di streaming. È possibile utilizzare questa funzione per inoltrare le porte TCP/UDP a un altro computer sulla rete. Questo è utile se stai ospitando server di gioco. L'unica cosa che richiede è che tu inserisca la porta in entrata, il dominio di inoltro o l'indirizzo IP, la porta di inoltro e selezioni il tipo di porta.

    Usa Nginx Proxy Manager per ospitare un sito web statico

    Nginx Proxy Manager può ospitare anche semplici siti Web statici o dinamici. Per farlo, aggiungi un nuovo host proxy e scegli 127.0.0.1 come dominio di inoltro e 80 come porta.

    Nella scheda Avanzate, inserisci la configurazione specificando la directory principale. Assicurati che la directory radice per il sito sia montata nella configurazione iniziale di Docker Compose. Qui stiamo usando la directory /data/static per ospitare il nostro sito web statico.

    Fai clic su Salva per terminare e il tuo sito dovrebbe essere accessibile. Allo stesso modo puoi ospitare qualsiasi tipo di sito utilizzando il proxy manager.

    Passaggio 10 - Funzioni varie

    Utilizza la funzione di controllo degli accessi dei gestori proxy Nginx

    È possibile utilizzare la funzionalità degli elenchi di accesso NPM per abilitare l'autenticazione HTTP o bloccare gli intervalli IP. Apri NPM e visita la pagina Dashboard >> Elenchi di accesso.

    Fai clic sul pulsante Aggiungi elenco di accesso per iniziare.

    È possibile assegnare un nome alla configurazione dell'elenco di accesso (ACL). La scheda Soddisfa qualsiasi, se selezionata, consentirà l'accesso se il client soddisfa una qualsiasi delle condizioni specificate. Se un client passa l'autenticazione HTTP ma potrebbe fallire l'accesso basato su IP, sarà consentito. Ma se l'opzione Soddisfa qualsiasi è deselezionata, il cliente dovrà soddisfare tutte le condizioni.

    La funzione Pass Auth to Host inoltrerà la funzione di autenticazione al server host.

    Successivamente, passa alla scheda Autorizzazione. Qui puoi creare un nome utente e una password per il metodo di autenticazione HTTP. Per aggiungere più di un utente, fare clic sul pulsante Aggiungi. Puoi aggiungere solo fino a 5 utenti. E c'è un bug con il pulsante Aggiungi, quindi usa prima il pulsante e poi inserisci i dettagli. Se inserisci i dettagli e fai clic sul pulsante in un secondo momento per aggiungere un altro utente, i dati dell'utente precedente verranno cancellati.

    Passa alla scheda Accesso. Qui è possibile impostare gli indirizzi IP a cui concedere o negare l'accesso.

    Fare clic su Salva per terminare.

    Per utilizzare questo elenco di accesso, devi selezionarlo quando aggiungi il tuo host proxy. Come nell'esempio per Ghost Blog di seguito, abbiamo selezionato la nostra lista di accesso.

    Abilita il supporto per più nomi di dominio

    Con l'aumentare del numero di host e domini, il tuo Nginx potrebbe esaurire lo spazio hash o incorrere in problemi di memoria. Possiamo aggiungere una configurazione personalizzata che verrà applicata a tutti gli host per risolvere questo problema.

    Per fare ciò, crea la directory personalizzata all'interno di ~/nginx-proxy/data/nginx.

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

    Crea e apri il file http.conf all'interno di questa directory.

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

    Incolla le seguenti righe al suo interno.

    proxy_headers_hash_max_size 1024;
    proxy_headers_hash_bucket_size 128;
    

    Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

    Nginx dovrebbe accettare automaticamente questi valori. Se ciò non accade, puoi riavviare il contenitore NPM utilizzando il seguente comando.

    $ docker restart npm-app
    

    Reindirizza la pagina di destinazione predefinita

    Nel passaggio 6, viene visualizzata la pagina predefinita quando si digita l'URL http://. Se vuoi cambiarlo, è possibile farlo. Per farlo, visita la pagina delle impostazioni. Fare clic sui tre punti sul lato destro e fare clic sul pulsante Modifica.

    Puoi impostare la pagina di destinazione in modo che funga da pagina 404, reindirizzare o aggiungere codice HTML personalizzato utilizzando l'opzione Pagina personalizzata. Se selezioni Reindirizzamento, dovrai specificare l'URL di destinazione.

    Questo è l'HTML personalizzato che abbiamo utilizzato per il nostro scopo.

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

    Fare clic su Salva per terminare. La tua pagina di destinazione dovrebbe essere modificata in qualcosa di simile al seguente.

    Passaggio 11: aggiornare Nginx Proxy Manager

    Per aggiornare NPM, innanzitutto arrestare i contenitori.

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

    Estrai le immagini più recenti.

    $ docker-compose pull
    

    Riavvia i contenitori.

    $ docker-compose up -d
    

    Conclusione

    Questo conclude il nostro tutorial in cui hai installato Nginx Proxy Manager e hai imparato come usarlo per aggiungere un host proxy per un altro contenitore docker, usarlo come servizio di reindirizzamento e controllare l'accesso utilizzandolo. Se hai domande, pubblicale nei commenti qui sotto.