51 06/04/2026 9 min

Installare Nginx Proxy Manager su Ubuntu 22.04

Nginx Proxy Manager (NPM) è una soluzione comoda per gestire reverse proxy, certificati TLS e host virtuali da interfaccia web. Su Ubuntu 22.04 l’approccio più pulito è usarlo in container Docker: installazione rapida, aggiornamenti semplici e rollback immediato.

Qui sotto trovi una procedura pratica, pensata per un server Linux recente, con attenzione a prerequisiti, sicurezza di base e controlli finali. L’obiettivo è arrivare a un’istanza funzionante, esposta solo dove serve, senza complicare inutilmente la macchina.

Prerequisiti e scelte architetturali

Prima di installare, chiarisci il ruolo del server. NPM deve ricevere traffico HTTP/HTTPS dall’esterno e inoltrarlo verso servizi interni o esterni. Se lo usi in produzione, considera che il container avrà accesso a porte 80, 81 e 443, quindi il firewall va allineato.

Assumiamo:

  • Ubuntu 22.04 aggiornato.
  • Accesso sudo.
  • Un dominio o sottodominio già pronto, se vuoi emettere certificati Let’s Encrypt.
  • DNS del nome host puntato verso il server o verso il bilanciatore che lo espone.

Se il server è già occupato da un web server sulla porta 80/443, devi decidere prima chi resta in ascolto su quelle porte. NPM non può condividere in modo semplice le stesse porte con un’altra istanza che ascolta direttamente sul bind host, salvo architetture più articolate.

Scelta consigliata: se NPM deve fare da front-end per più servizi, lascialo gestire lui 80/443 e sposta gli altri servizi su porte interne o su una rete Docker dedicata.

Aggiornare il sistema e preparare il repository

Parti con un update completo e installa i pacchetti minimi richiesti per Docker. Questo riduce problemi banali di dipendenze o kernel vecchi.

sudo apt update
sudo apt -y upgrade
sudo apt -y install ca-certificates curl gnupg lsb-release

Verifica la versione di Ubuntu e il kernel, utile se poi devi fare troubleshooting su rete o storage:

lsb_release -a
uname -r

Atteso: Ubuntu 22.04 e un kernel recente della serie HWE o standard supportata. Se il sistema è molto indietro, aggiorna prima di introdurre Docker.

Installare Docker Engine su Ubuntu 22.04

Per Nginx Proxy Manager serve Docker. Puoi installare il pacchetto da repository ufficiale Docker, che è la strada più stabile per un server gestito.

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 -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Controlla che il demone sia attivo:

systemctl status docker --no-pager

Atteso: stato active (running). Se non lo è, leggi i log:

journalctl -u docker -n 50 --no-pager

Se vuoi usare Docker senza sudo per il tuo utente amministrativo, aggiungilo al gruppo docker. Fallo solo se sai cosa comporta: chi può usare Docker ha di fatto privilegi molto elevati sulla macchina.

sudo usermod -aG docker $USER

Poi esegui logout/login e verifica:

docker version
docker ps

Creare la directory di lavoro

Usa una directory dedicata per mantenere ordine su configurazione e dati persistenti. Questo semplifica backup e migrazioni.

sudo mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager

Struttura consigliata:

  • /opt/nginx-proxy-manager/data per i dati applicativi.
  • /opt/nginx-proxy-manager/letsencrypt per i certificati.
  • /opt/nginx-proxy-manager/docker-compose.yml per lo stack.

Questa separazione ti aiuta in caso di restore o cambio host.

Creare il file docker-compose

Ora definisci il servizio. NPM usa tipicamente un database SQLite locale per installazioni semplici; per carichi più seri o esigenze di HA, il discorso cambia, ma per una singola istanza questa è la via più diretta.

sudo tee /opt/nginx-proxy-manager/docker-compose.yml > /dev/null <<'EOF'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_SQLITE_FILE: /data/database.sqlite
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
EOF

Note operative:

  • 80 e 443 servono per il traffico pubblico dei proxy host.
  • 81 è la web UI amministrativa.
  • I volumi persistenti sono fondamentali per non perdere configurazione e certificati al riavvio.

Se sulla macchina ci sono già servizi in ascolto su 80/443, prima di avviare NPM verifica chi occupa le porte:

sudo ss -ltnp | egrep ':(80|81|443)'

Se trovi Apache, Nginx o un altro reverse proxy, devi cambiare architettura o liberare le porte. Non forzare senza un piano di rollback.

Avviare il container

Dal percorso del compose, avvia lo stack:

cd /opt/nginx-proxy-manager
sudo docker compose up -d

Controlla subito lo stato:

sudo docker ps

Atteso: container nginx-proxy-manager in stato Up. Se non parte, guarda i log:

sudo docker logs nginx-proxy-manager --tail 100

Il primo avvio può impiegare qualche decina di secondi. Se il container esce subito, i problemi più comuni sono porte già occupate, permessi sulle directory persistenti o immagine non scaricata correttamente.

Aprire il firewall in modo minimo

Se usi UFW, consenti solo le porte necessarie. Non aprire altro per comodità.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 81/tcp

Controlla lo stato:

sudo ufw status verbose

Se la UI admin non deve essere pubblica, non esporre la porta 81 su Internet. Meglio limitarla per IP o tenerla accessibile solo da VPN o rete interna. In quel caso, sostituisci la regola con un allow restrittivo sul tuo range amministrativo.

Accedere alla dashboard

La UI è disponibile su http://IP_DEL_SERVER:81 oppure sul nome host se il DNS è già pronto. Al primo accesso, le credenziali di default sono quelle previste dal progetto, ma vanno cambiate subito dopo il login.

Verifica che la pagina risponda con:

curl -I http://127.0.0.1:81

Atteso: risposta HTTP valida, tipicamente 200 o 302 a seconda del punto di accesso. Se il curl locale funziona ma da fuori no, il problema è quasi sempre firewall, security group, NAT o routing.

Nel browser:

  1. Apri la UI su porta 81.
  2. Accedi con le credenziali iniziali.
  3. Cambia subito password amministratore.
  4. Abilita, se disponibile nella tua procedura, l’autenticazione a due fattori o una protezione di accesso aggiuntiva per la UI.

Creare il primo proxy host

La funzione principale di NPM è pubblicare un servizio interno dietro un nome DNS e un certificato TLS. Esempio tipico: vuoi esporre un’app che ascolta su 10.0.0.20:8080 come app.example.com.

In dashboard:

  1. Vai su Proxy Hosts.
  2. Clicca Add Proxy Host.
  3. Compila Domain Names con il FQDN.
  4. Imposta Scheme su http o https in base all’origin.
  5. Inserisci Forward Hostname / IP e Forward Port.
  6. Abilita Websockets Support se l’app lo richiede.
  7. Salva.

Se il backend usa HTTPS con certificato self-signed o interno, verifica prima che NPM possa fidarsi dell’origin. In caso contrario vedrai errori di upstream o handshake.

Abilitare Let’s Encrypt

Per ottenere certificati pubblici, il dominio deve puntare correttamente al server e la porta 80 deve essere raggiungibile dall’esterno per la validazione HTTP-01, salvo casi particolari.

In NPM:

  1. Apri il proxy host creato.
  2. Vai alla scheda SSL.
  3. Seleziona Request a new SSL Certificate.
  4. Spunta Force SSL se vuoi reindirizzare tutto su HTTPS.
  5. Spunta HTTP/2 Support se utile.
  6. Accetta i termini ACME e salva.

Se l’emissione fallisce, verifica questi punti in ordine:

  • DNS del dominio risolto verso l’IP corretto.
  • Porta 80 raggiungibile dall’esterno.
  • Nessun altro servizio sta rispondendo al posto di NPM su 80.
  • Firewall o security group non bloccano il traffico.

Controllo rapido DNS:

dig +short app.example.com

Controllo rapido HTTP dall’esterno:

curl -I http://app.example.com

Atteso: risposta del tuo NPM o redirect coerente. Se vedi un altro server, il DNS o il routing stanno puntando altrove.

Hardening minimo consigliato

Non basta far partire il servizio. Conviene ridurre l’esposizione e proteggere la macchina con alcune misure di base.

  • Limita la porta 81 a IP fidati o VPN.
  • Aggiorna regolarmente Docker e l’immagine NPM.
  • Non montare directory extra inutili nel container.
  • Se possibile, separa i servizi backend in una rete privata.
  • Monitora spazio disco, perché i certificati e i log crescono nel tempo.

Controlla lo spazio residuo:

df -h
docker system df

Se il disco si riempie, i sintomi possono andare dal mancato rinnovo dei certificati fino a errori del database interno. Su una macchina piccola è una delle prime cose da osservare.

Aggiornare Nginx Proxy Manager senza perdere dati

Con Docker l’aggiornamento è semplice, ma va fatto con disciplina. Prima verifica che i volumi siano persistenti e che il compose sia salvato. Poi aggiorni l’immagine e ricrei il container.

cd /opt/nginx-proxy-manager
sudo docker compose pull
sudo docker compose up -d

Verifica che il container riparta correttamente e che la UI sia accessibile. I dati dovrebbero restare invariati perché sono nei volumi montati.

Se vuoi ridurre il rischio, fai un backup della directory prima del cambio:

sudo tar -czf /root/nginx-proxy-manager-backup-$(date +%F).tar.gz /opt/nginx-proxy-manager

Quel file ti dà un punto di ritorno rapido in caso di problema.

Troubleshooting rapido

Se qualcosa non funziona, isola il layer prima di cambiare configurazioni a caso.

  1. Container non parte: controlla docker ps -a e docker logs nginx-proxy-manager --tail 100.
  2. Porta occupata: usa ss -ltnp per vedere chi ascolta su 80/81/443.
  3. UI non raggiungibile: testa in locale con curl -I http://127.0.0.1:81 e poi dal client remoto.
  4. Certificato non emesso: verifica DNS, porta 80, firewall e log ACME nella dashboard.
  5. Backend non risponde: prova l’origine direttamente con curl -I http://IP_BACKEND:PORTA.

Log utili:

  • sudo docker logs nginx-proxy-manager --tail 200
  • journalctl -u docker -n 100 --no-pager

Se il problema è sui backend, NPM spesso mostra sintomi generici; il dettaglio vero lo trovi nel servizio originario, non nel proxy.

Note operative su backup e rollback

Prima di modifiche importanti, salva la configurazione della directory del progetto e annota il file compose. Il rollback più semplice consiste nel ripristinare i volumi e riavviare la versione precedente dell’immagine.

Rollback tipico:

  1. Ferma lo stack con sudo docker compose down.
  2. Ripristina il backup della directory se necessario.
  3. Rimetti il tag immagine precedente nel compose, se hai cambiato versione.
  4. Riavvia con sudo docker compose up -d.

Attenzione al blast radius: agire su porte e firewall può impattare altri servizi già presenti sulla macchina. Verifica sempre chi usa 80/443 prima di prendere possesso di quei bind.

Conclusione operativa

Su Ubuntu 22.04, Nginx Proxy Manager si installa bene via Docker e ti dà una gestione semplice di reverse proxy e certificati. La parte delicata non è l’installazione in sé, ma la convivenza con altri servizi, l’esposizione della porta admin e la corretta pubblicazione dei backend.

Se vuoi una installazione pulita, la sequenza giusta è: aggiornare il sistema, installare Docker, creare i volumi persistenti, avviare il compose, aprire solo le porte necessarie e verificare da subito DNS, accesso UI e rinnovo certificati. Da lì in poi la manutenzione è soprattutto disciplina operativa: backup, aggiornamenti controllati e monitoraggio del disco.