# Modificare la configurazione Nginx di un sito Laravel o PHP

> Come Vimonto Deploy scrive la configurazione Nginx di un sito, come modificarla in sicurezza con nginx -t e rollback automatico e dove aggiungere direttive.

Ogni sito in Vimonto Deploy ha la sua configurazione Nginx: un unico file con i server block per i suoi domini, HTTPS e l'applicazione. Vimonto Deploy scrive questo file per te e lo mantiene aggiornato quando cambi domini, certificati o impostazioni.

La pagina **Nginx** di un sito mostra la configurazione e ti permette di modificarla. Ogni modifica viene verificata con `nginx -t` prima di andare online; se Nginx la rifiuta, resta attiva la configurazione precedente. Trovi la pagina nella barra laterale del sito, sotto **Nginx**.

![La pagina Nginx di un sito con i server block generati in un editor di codice e il pulsante Verifica e salva](https://ops.vimonto.com/docs-media/it/site-nginx.webp?v=161e760d "La configurazione Nginx di un sito")

## Dove si trova la configurazione sul server?

| Percorso | Che cos'è |
| --- | --- |
| `/etc/nginx/sites-available/site-{id}` | La configurazione del sito. `{id}` è il numero del sito in Vimonto Deploy; il percorso è indicato in cima alla pagina. |
| `/etc/nginx/sites-enabled/site-{id}` | Un symlink al file qui sopra, che fa sì che Nginx lo carichi. |
| `/etc/nginx/vimonto-conf/site-{id}/*.conf` | Direttive aggiuntive, caricate all'interno del server block del sito. |
| `/var/log/nginx/site-{id}-access.log` e `-error.log` | I log delle richieste e degli errori del sito, consultabili nella pagina [Log](https://ops.vimonto.com/docs/it/sites/logs). |

Non modificare questi file a mano sul server: la prossima volta che Vimonto Deploy scrive la configurazione, le tue modifiche vengono sovrascritte. Modifica la configurazione nella pagina Nginx, oppure metti le direttive aggiuntive nella cartella include.

## Cosa contiene la configurazione generata?

La configurazione generata dipende dai domini del sito, dal suo certificato e dal suo tipo.

- **Domini.** Il sito risponde sui suoi domini e sul suo indirizzo generato. L'impostazione www di ogni dominio diventa un blocco di redirect, per esempio da `www.example.com` a `example.com`. Vedi [domini e SSL](https://ops.vimonto.com/docs/it/sites/domains-and-ssl).
- **HTTPS.** Con un certificato attivo, la porta 80 risponde solo alle verifiche di Let's Encrypt e reindirizza tutto il resto su HTTPS. Il blocco HTTPS è in ascolto sulla porta 443 con HTTP/2 (`listen 443 ssl http2;`, che funziona con il Nginx di ogni versione di Ubuntu supportata), TLS 1.2 e 1.3, una cache condivisa delle sessioni TLS e un header HSTS (`max-age=31536000`).
- **Web root.** `root` punta alla directory web del sito nella release attiva, per esempio `/home/vimonto/example.com/current/public`.
- **Log.** Ogni sito scrive il proprio log degli accessi e degli errori.
- **Include.** La cartella include per le direttive aggiuntive viene caricata all'interno del server block.
- **Applicazione.** Dipende dal tipo di sito:

| Tipo di sito | Cosa fa la configurazione |
| --- | --- |
| Laravel e PHP | Invia a `index.php` le richieste che non corrispondono a un file e passa PHP a PHP-FPM tramite un socket Unix. I siti Laravel inviano a `index.php` anche gli errori 404. |
| Statico | Serve i file provando `$uri`, `$uri/` e `$uri.html`, altrimenti un 404. |
| Node.js | Inoltra ogni richiesta alla tua app su `127.0.0.1` e sulla porta che hai impostato, con supporto WebSocket e header `X-Forwarded-*`. |
| Load balancer | Inoltra ogni richiesta agli app server in un blocco `upstream`, oppure risponde `503` finché non ce n'è nessuno. Vedi [bilanciamento del carico](https://ops.vimonto.com/docs/it/sites/load-balancing#come-appare-la-configurazione-nginx). |

- **Protezione.** I file nascosti come `.env` e `.git` sono bloccati, tranne `/.well-known`. Le richieste di `favicon.ico` e `robots.txt` non vengono registrate nei log.
- **Dietro un load balancer.** Su un app server dietro uno dei tuoi [load balancer](https://ops.vimonto.com/docs/it/sites/load-balancing), il sito si fida di quel load balancer, e solo di quello, per l'indirizzo IP del visitatore (`set_real_ip_from`) e per HTTPS (`X-Forwarded-Proto`). Un sito lì con un proprio certificato serve anche il load balancer in HTTP semplice invece di reindirizzarlo a HTTPS, così i due non si rimandano le richieste all'infinito; tutti gli altri vengono comunque reindirizzati.

Un esempio abbreviato per un sito Laravel con HTTPS:

```nginx
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/certificate-3/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/certificate-3/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:VimontoSSL:10m;
    add_header Strict-Transport-Security "max-age=31536000" always;

    root /home/vimonto/example.com/current/public;
    index index.html index.htm index.php;
    charset utf-8;

    access_log /var/log/nginx/site-12-access.log;
    error_log /var/log/nginx/site-12-error.log error;

    # Direttive aggiuntive per questo sito, mantenute quando la configurazione viene riscritta.
    include /etc/nginx/vimonto-conf/site-12/*.conf;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
        fastcgi_read_timeout 120;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

`$realpath_root` fa vedere a PHP la vera directory della release invece del symlink `current`, così una nuova release viene usata non appena va online. Un [sito isolato](https://ops.vimonto.com/docs/it/sites/site-settings#isolamento-del-sito) usa il proprio socket PHP-FPM, `/run/php/site-{id}.sock`.

## Aggiungere direttive senza sostituire la configurazione

Per la maggior parte delle modifiche non serve toccare la configurazione stessa. Metti un file `.conf` nella cartella include del sito, `/etc/nginx/vimonto-conf/site-{id}/`. Nginx carica ogni file `.conf` presente lì all'interno del server block principale del sito, e la cartella viene mantenuta ogni volta che Vimonto Deploy riscrive la configurazione.

Per esempio, per aggiungere header di sicurezza, crea `/etc/nginx/vimonto-conf/site-12/headers.conf` nel [terminale](https://ops.vimonto.com/docs/it/servers/terminal):

```nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
```

Poi verifica e ricarica Nginx con `sudo nginx -t && sudo systemctl reload nginx`, oppure fai clic su **Ricarica** accanto a Nginx nella pagina [Servizi](https://ops.vimonto.com/docs/it/servers/services) del server.

Le [funzionalità del sito](https://ops.vimonto.com/docs/it/sites/site-features) usano la stessa cartella: **Protezione con password**, **Reverb** e **Hardening** di WordPress scrivono ciascuna il proprio file `feature-{key}.conf` lì.

## Modificare la configurazione

1. Apri il sito e scegli **Nginx** nella barra laterale.
2. Modifica la configurazione nell'editor.
3. Fai clic su **Verifica e salva**, oppure premi Cmd+S (Ctrl+S su Windows e Linux).

Il salvataggio avviene come task in background chiamato *Salvataggio della configurazione Nginx di* seguito dal tuo dominio:

1. Vimonto Deploy conserva una copia della configurazione attuale e scrive la tua.
2. Esegue `nginx -t` per verificare l'intera configurazione di Nginx.
3. Se la verifica riesce, Nginx viene ricaricato e la tua configurazione viene salvata.
4. Se la verifica fallisce, viene ripristinata la configurazione precedente, Nginx continua a funzionare senza modifiche e il task fallisce con **Nginx ha rifiutato la configurazione; quella precedente è ancora attiva**. L'output del task mostra l'errore di `nginx -t`.

Un errore di battitura non può quindi mai mettere offline gli altri siti del server.

### Cosa cambia quando usi una configurazione tua?

Dopo che hai salvato una configurazione tua, la pagina mostra **Configurazione personalizzata**. Da quel momento Vimonto Deploy non scrive più la configurazione per te, e sei tu a gestire:

- domini e alias, e il redirect www;
- HTTPS: quando installi un certificato, il task ti indica i percorsi del certificato da aggiungere tu stesso;
- la directory web, la versione di PHP (il socket PHP-FPM) e la porta di un'app Node.js, quando le cambi nelle [impostazioni del sito](https://ops.vimonto.com/docs/it/sites/site-settings);
- per un sito con bilanciamento del carico, gli app server e il metodo: le modifiche nella pagina Bilanciamento del carico vengono salvate ma non applicate, finché non ripristini la configurazione predefinita;
- per un sito dietro un load balancer, le righe che si fidano del load balancer.

Mantieni la riga `include /etc/nginx/vimonto-conf/site-{id}/*.conf;` nella tua configurazione. Senza di essa, le funzionalità del sito che aggiungono direttive Nginx non possono essere attivate.

> [!TIP]
> Preferisci la cartella include a una configurazione personalizzata. Mantieni domini e HTTPS automatici, e le tue direttive sopravvivono a ogni modifica.

### Ripristinare la configurazione generata

Fai clic su **Ripristina predefinita** e conferma. Le tue modifiche vanno perse, la configurazione generata viene scritta e verificata allo stesso modo, e Vimonto Deploy torna a gestire per te domini e HTTPS.

## Chi può modificare la configurazione?

Ogni membro può leggere la configurazione. Per salvare e ripristinare serve il permesso di gestire i siti (proprietario, amministratore, manager e sviluppatore), e il sito e il server devono essere attivi; altrimenti l'editor è in sola lettura. Vedi [membri e ruoli](https://ops.vimonto.com/docs/it/organization/members-and-roles).

## Domande frequenti

### Come aumento la dimensione massima di upload per il mio sito Laravel?

Cambia la dimensione massima di upload nella pagina [PHP](https://ops.vimonto.com/docs/it/servers/php) del server. Imposta i limiti di upload di PHP e il `client_max_body_size` di Nginx per l'intero server (64 MB di default), quindi non devi modificare la configurazione del sito.

### Come aggiungo header o redirect?

Usa la cartella include per gli header (`add_header`) e i redirect semplici (`location = /old { return 301 /new; }`). Per modifiche al di fuori del server block, come un nuovo blocco `server`, modifica la configurazione nella pagina Nginx.

### Perché la mia modifica non è andata online?

Apri il task nell'attività del server o nella [pagina attività](https://ops.vimonto.com/docs/it/organization/activity) e leggi l'output di `nginx -t`. Indica il file e la riga che Nginx ha rifiutato.

### Posso vedere la configurazione di ogni sito su un server?

La configurazione di ogni sito si trova nella sua pagina Nginx. Tutti i file sono in `/etc/nginx/sites-available` sul server.
