Salta al contenuto principale

Reverse Proxy con Nginx

Inviato da enzo de simone il
nginx

Reverse Proxy con Nginx - Puntata 6

Ben tornati nella nostra serie. Dopo aver messo in sicurezza l'accesso SSH, oggi impariamo a configurare Nginx come reverse proxy per esporre in modo sicuro i nostri servizi web.

Obiettivo della puntata: Configurare Nginx come reverse proxy per esporre servizi web interni in modo sicuro, gestire certificati SSL e organizzare l'accesso a più servizi sotto un unico dominio.

1. Cos'è un reverse proxy e perché è importante

Un reverse proxy è un server che si frappone tra i client e i server interni, offrendo numerosi vantaggi:

  • Sicurezza: Nasconde l'infrastruttura interna

  • SSL Termination: Gestisce la cifratura SSL una volta sola

  • Compressione: Comprime i dati per velocizzare il trasferimento

  • Load Balancing: Distribuisce il carico tra più server

  • Flessibilità: Permette di esporre servizi su porte diverse tramite un unico punto di ingresso

2. Installazione di Nginx

Iniziamo installando Nginx sul nostro server Debian:

  1. Aggiornare la lista dei pacchetti:

    sudo apt update
  2. Installare Nginx:

    sudo apt install nginx
  3. Verificare che Nginx sia attivo:

    sudo systemctl status nginx
  4. Se necessario, abilitare Nginx al boot:

    sudo systemctl enable nginx
  5. Aprire la porta HTTP (80) e HTTPS (443) sul firewall:

    sudo ufw allow 'Nginx Full'

3. Configurazione base di Nginx

La configurazione di Nginx si trova in /etc/nginx/. I file di configurazione dei siti sono in /etc/nginx/sites-available/ e si abilitano creando un link simbolico in /etc/nginx/sites-enabled/.

Struttura di base di un file di configurazione:

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    
    # Cartella dove verranno serviti i file statici
    root /var/www/tuodominio.com/html;
    
    index index.html index.htm index.nginx-debian.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

4. Configurare Nginx come reverse proxy

Supponiamo di avere un servizio web interno in ascolto sulla porta 8080. Ecco come esporlo tramite Nginx:

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    
    location / {
        # Impostare l'IP e la porta del servizio interno
        proxy_pass http://localhost:8080;
        
        # Headers importanti per il corretto funzionamento
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeout
        proxy_connect_timeout 30;
        proxy_send_timeout 30;
        proxy_read_timeout 30;
    }
}

5. Configurazione di Let's Encrypt per HTTPS

Ora aggiungiamo il supporto HTTPS gratuito con Let's Encrypt:

  1. Installare Certbot e il plugin per Nginx:

    sudo apt install certbot python3-certbot-nginx
  2. Ottenere un certificato SSL (sostituire con il vostro dominio):

    sudo certbot --nginx -d tuodominio.com -d www.tuodominio.com
  3. Verificare il rinnovo automatico:

    sudo certbot renew --dry-run

6. Configurazione avanzata del reverse proxy

Ecco una configurazione più avanzata e sicura per il nostro reverse proxy:

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name tuodominio.com www.tuodominio.com;
    
    # Path ai certificati SSL (generati da Certbot)
    ssl_certificate /etc/letsencrypt/live/tuodominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tuodominio.com/privkey.pem;
    
    # Configurazione SSL avanzata
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # HSTS (HTTP Strict Transport Security)
    add_header Strict-Transport-Security "max-age=63072000" always;
    
    location / {
        proxy_pass http://localhost:8080;
        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeout
        proxy_connect_timeout 30;
        proxy_send_timeout 30;
        proxy_read_timeout 30;
    }
    
    # Bloccare l'accesso a file nascosti
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

7. Gestire più servizi con un unico server

Se abbiamo più servizi, possiamo esporli tramite path diversi:

server {
    listen 443 ssl;
    server_name tuodominio.com;
    
    # ... configurazione SSL ...
    
    # Servizio principale
    location / {
        proxy_pass http://localhost:8080;
        # ... altre impostazioni proxy ...
    }
    
    # Altro servizio su un path specifico
    location /servizio2/ {
        proxy_pass http://localhost:8081/;
        # ... altre impostazioni proxy ...
    }
    
    # API interna
    location /api/ {
        proxy_pass http://localhost:3000/;
        # ... altre impostazioni proxy ...
    }
}

8. Test e troubleshooting

Dopo aver configurato Nginx, è importante testare e verificare il tutto:

  1. Verificare la sintassi del file di configurazione:

    sudo nginx -t
  2. Ricaricare la configurazione di Nginx:

    sudo systemctl reload nginx
  3. Controllare i log di Nginx per errori:

    sudo tail -f /var/log/nginx/error.log
  4. Verificare che i servizi siano raggiungibili:

    curl -I https://tuodominio.com

Consiglio: Utilizzare SSL Labs per testare la configurazione SSL del vostro server.

9. Ottimizzazioni prestazionali

Alcune ottimizzazioni per migliorare le prestazioni di Nginx:

# Aumentare il numero di worker processes
worker_processes auto;

# Ottimizzazioni per SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

# Compressione Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Prepariamoci per la prossima puntata

Ora abbiamo un reverse proxy funzionante che ci permette di esporre servizi in modo sicuro. Nel prossimo articolo installeremo Nextcloud, la soluzione completa per il cloud privato:

  • Installazione e configurazione di Nextcloud

  • Integrazione con il reverse proxy Nginx

  • Configurazione del database

  • Ottimizzazioni per Nextcloud

Problemi con Nginx?

Lascia un commento qui sotto con le tue difficoltà, ti aiuterò a risolverle!


Prossima puntata: Nextcloud - Il cuore del nostro cloud privato

Non dimenticare di iscriverti alla newsletter per non perdere le prossime puntate!