Nginx Reverse Proxy — Cheat Sheet

Tag: nginx, reverse-proxy, devops, load-balancing, networking, http

Livello: intermedio

TL;DR: Nginx intercetta le richieste dei client e le inoltra ai backend applicativi gestendo SSL termination, bilanciamento del carico, header HTTP e caching.

Concetti chiave

Riceve le richieste HTTP/HTTPS pubbliche e le smista verso uno o piu server interni.

Nasconde l'architettura interna, la topologia di rete e gli indirizzi IP dei server applicativi.

Centralizza la terminazione TLS/SSL alleggerendo il carico computazionale delle applicazioni a valle.

La direttiva proxy_pass specifica l'indirizzo e la porta del backend di destinazione.

Inoltra metadati client con header dedicati quali Host, X-Real-IP, X-Forwarded-For e X-Forwarded-Proto.

Gestisce il bilanciamento del carico tramite blocchi upstream con algoritmi round-robin, least_conn o ip_hash.

Funge da buffer per richieste e risposte lente isolando i worker dei backend.

Offre funzionalita di caching statico e dinamico per ridurre la latenza e gli accessi al backend.

Permette di gestire timeout e fallback automatici in caso di backend non raggiungibile.

Domande tipiche e risposte pronte

Q: A cosa serve un reverse proxy e in cosa differisce da un forward proxy?R: Il forward proxy agisce per conto dei client per uscire su internet, mentre il reverse proxy agisce davanti ai server per proteggerli, distribuire il carico e terminare SSL.

Q: Perche e fondamentale impostare l'header X-Forwarded-For su Nginx?R: Senza questo header, l'applicazione backend vedrebbe come IP sorgente solo l'indirizzo interno di Nginx e non quello reale dell'utente finale.

Q: Come gestisci WebSocket tramite un reverse proxy Nginx?R: Imposto esplicitamente gli header Upgrade e Connection nel blocco location per consentire l'upgrade del protocollo HTTP a tunnel TCP persistente.

Insidie e errori comuni

Omettere o aggiungere lo slash / finale in proxy_pass altera la riscrittura dell'URI della richiesta verso il backend.

Dimenticare proxy_set_header Host $host puo causare errori di routing o redirect con porte errate sul backend.

Il valore predefinito di client_max_body_size e 1 MB: se non alzato, causa errori 413 Request Entity Too Large durante l'upload di file.

Errori 502 Bad Gateway indicano backend offline, porta errata o mancata risposta sulla socket configurata.

Errori 504 Gateway Timeout indicano che il backend non ha risposto entro il tempo configurato in proxy_read_timeout.

Snippet e comandiNginx

```upstream backend_cluster {

least_conn;

server 127.0.0.1:3000 max_fails=3 fail_timeout=10s;

server 127.0.0.1:3001 max_fails=3 fail_timeout=10s;

}

server {

listen 80;

server_name example.com;

location / {

proxy_pass http://backend_cluster;

proxy_http_version 1.1;

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;

# Supporto WebSocket

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_connect_timeout 60s;

proxy_send_timeout 60s;

proxy_read_timeout 60s;

}

}

Validazione della sintassi di configurazione

nginx -t

Ricaricamento della configurazione a caldo senza downtime

nginx -s reload

```

Da ripassare

[ ] Sintassi e comportamento dello slash finale nella direttiva proxy_pass

[ ] Configurazione della terminazione SSL con Certbot e parametri Diffie-Hellman

[ ] Algoritmi di load balancing nativi in upstream (round-robin, least_conn, ip_hash)

[ ] Configurazione corretta dei blocchi proxy_cache_path e proxy_cache

[x] Impostazione degli header X-Forwarded-For e Host

Jarvis Interviews
Jarvis