Il parametro keepalive_timeout
in Nginx è una direttiva importante per ottimizzare le prestazioni del server, soprattutto quando si gestiscono molte connessioni HTTP. Ecco una spiegazione dettagliata di cosa fa, a cosa serve e come aumentarlo. La decisione di aumentare o diminuire il valore di keepalive_timeout
dipende dal contesto e dalle esigenze specifiche del tuo server e delle tue applicazioni.
Quando è meglio aumentare keepalive_timeout
?
Aumentare il valore di keepalive_timeout
è utile in questi scenari:
- Applicazioni con molte richieste in sequenza:
- Se i client effettuano molte richieste in rapida successione (ad esempio, caricamento di pagine web con molte risorse come CSS, JavaScript, immagini), un valore più alto di
keepalive_timeout
permette di riutilizzare la stessa connessione TCP, riducendo la latenza e migliorando le prestazioni.
- Ridurre l’overhead delle connessioni:
- Aumentare il timeout riduce il numero di volte in cui le connessioni TCP devono essere aperte e chiuse, il che è particolarmente utile se il server gestisce un alto volume di richieste.
- Client con alta latenza:
- Se i client si connettono da reti con alta latenza (ad esempio, reti mobili), un
keepalive_timeout
più alto può migliorare l’esperienza utente.
- Ottimizzazione per HTTP/2:
- Con HTTP/2, che utilizza una singola connessione per più richieste, un
keepalive_timeout
più alto può essere vantaggioso.
Quando è meglio diminuire keepalive_timeout
?
Diminuire il valore di keepalive_timeout
è consigliabile in questi casi:
- Server con molte connessioni simultanee:
- Se il server gestisce un numero molto elevato di client contemporaneamente, un
keepalive_timeout
troppo alto può portare a un esaurimento dei file descriptor o delle risorse del server, poiché le connessioni rimangono aperte più a lungo del necessario.
- Richieste sporadiche:
- Se i client effettuano richieste solo occasionalmente (ad esempio, una richiesta ogni pochi minuti), non ha senso mantenere le connessioni aperte a lungo. Un timeout più breve libera risorse più velocemente.
- Protezione da attacchi DDoS:
- Un
keepalive_timeout
più breve può aiutare a mitigare alcuni tipi di attacchi DDoS, poiché le connessioni inattive vengono chiuse più rapidamente.
- Riduzione dell’uso della memoria:
- Ogni connessione keepalive aperta utilizza memoria sul server. Se il server ha risorse limitate, un timeout più breve può aiutare a ridurre l’uso della memoria.
Valori consigliati
- Valore predefinito: Di solito è impostato su 75 secondi.
- Valore ottimale: Per la maggior parte dei casi d’uso, un valore compreso tra 60 e 120 secondi è un buon compromesso.
- Valore ridotto: Se hai bisogno di chiudere le connessioni più rapidamente, puoi impostare un valore come 10-30 secondi.
- Valore aumentato: Se vuoi mantenere le connessioni aperte più a lungo, puoi impostare un valore come 300 secondi (5 minuti) o più, ma solo se il server ha risorse sufficienti.
Come decidere?
Ecco alcuni fattori da considerare per prendere una decisione:
- Numero di client attivi:
- Se il server gestisce molti client contemporaneamente, un timeout più breve può essere preferibile.
- Se il server gestisce pochi client ma con molte richieste in sequenza, un timeout più lungo è meglio.
- Tipo di traffico:
- Per traffico HTTP/2 o applicazioni web moderne, un timeout più lungo è generalmente migliore.
- Per traffico sporadico o API, un timeout più breve può essere sufficiente.
- Risorse del server:
- Se il server ha risorse limitate (memoria, file descriptor), un timeout più breve è consigliabile.
- Se il server ha risorse abbondanti, puoi permetterti un timeout più lungo.
- Latenza della rete:
- Se i client si connettono da reti con alta latenza, un timeout più lungo può migliorare le prestazioni.
Monitoraggio e ottimizzazione
Dopo aver modificato keepalive_timeout
, monitora le prestazioni del server utilizzando strumenti come:
htop
o top
per verificare l’uso della CPU e della memoria.
netstat
o ss
per controllare il numero di connessioni attive.
- Log di Nginx per identificare eventuali problemi.
Se noti un aumento eccessivo dell’uso delle risorse o problemi di prestazioni, regola il valore di keepalive_timeout
di conseguenza.
In sintesi:
- Aumenta
keepalive_timeout
se vuoi migliorare le prestazioni per client con molte richieste in sequenza o con alta latenza.
- Diminuisci
keepalive_timeout
se il server gestisce molte connessioni simultanee o ha risorse limitate.
La scelta migliore dipende dal tuo caso d’uso specifico e dalle risorse disponibili.
Cosa fa keepalive_timeout
La direttiva keepalive_timeout
definisce due cose:
- Il tempo massimo in cui una connessione keepalive rimane aperta dopo che una richiesta è stata completata.
- Il tempo massimo che il server aspetta per ricevere una nuova richiesta dal client prima di chiudere la connessione.
In altre parole, keepalive_timeout
controlla per quanto tempo una connessione TCP rimane aperta dopo che una richiesta HTTP è stata completata, in attesa di eventuali richieste successive dallo stesso client.
A cosa serve keepalive_timeout
?
- Riduzione dell’overhead: Le connessioni keepalive evitano di dover aprire e chiudere ripetutamente connessioni TCP per ogni richiesta, riducendo l’overhead e migliorando le prestazioni.
- Miglioramento della latenza: Le connessioni persistenti consentono ai client di inviare più richieste sulla stessa connessione, riducendo la latenza.
- Riduzione del carico sul server: Mantenere le connessioni aperte per un periodo ragionevole riduce il carico sul server, poiché non deve gestire continuamente nuove connessioni.
Come si aumenta keepalive_timeout
?
Per aumentare il valore di keepalive_timeout
, devi modificare il file di configurazione di Nginx (nginx.conf
o un file di configurazione specifico per un sito).
Passaggi:
- Apri il file di configurazione di Nginx:
sudo nano /etc/nginx/nginx.conf
Oppure, se stai configurando un sito specifico, apri il file di configurazione del sito (ad esempio, in /etc/nginx/sites-available/
).
- Trova o aggiungi la direttiva
keepalive_timeout
:
La direttiva keepalive_timeout
può essere impostata nel blocco http
, server
o location
. Di solito, si trova nel blocco http
:
http {
keepalive_timeout 65;
...
}
Il valore predefinito è spesso 75
secondi, ma può variare a seconda della configurazione.
- Modifica il valore di
keepalive_timeout
:
Aumenta il valore in base alle tue esigenze. Ad esempio, per impostare un timeout di 120 secondi:
http {
keepalive_timeout 120;
...
}
- Salva e chiudi il file:
Se stai usando nano
, premi CTRL + X
, poi Y
per confermare e Invio
per salvare.
- Ricarica la configurazione di Nginx:
Dopo aver modificato il file di configurazione, ricarica Nginx per applicare le modifiche:
sudo systemctl reload nginx
Parametri aggiuntivi di keepalive_timeout
La direttiva keepalive_timeout
può accettare due valori:
- Timeout principale: Il tempo in secondi per mantenere aperta una connessione keepalive.
- Timeout di intestazione (opzionale): Il tempo in secondi che il server aspetta per ricevere una nuova richiesta dal client.
Esempio:
- 65: La connessione rimane aperta per 65 secondi dopo l’ultima richiesta.
- 60: Il server aspetta 60 secondi per ricevere una nuova richiesta prima di chiudere la connessione.
Considerazioni sull’aumento di keepalive_timeout
- Vantaggi:
- Migliora le prestazioni per i client che effettuano più richieste in sequenza (ad esempio, caricamento di pagine web con molte risorse).
- Riduce il carico sul server, poiché evita di aprire e chiudere connessioni TCP frequentemente.
- Svantaggi:
- Un valore troppo alto può portare a un uso eccessivo delle risorse del server, poiché le connessioni rimangono aperte più a lungo del necessario.
- Se il server gestisce molti client, un
keepalive_timeout
elevato può esaurire i file descriptor disponibili.
- Valori consigliati:
- Per la maggior parte dei casi d’uso, un valore compreso tra 60 e 120 secondi è sufficiente.
- Se hai un’applicazione con molte richieste in sequenza (ad esempio, un’app single-page), puoi aumentare ulteriormente il valore.
Esempio completo
Ecco un esempio di configurazione con keepalive_timeout
aumentato:
http {
keepalive_timeout 120;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Seguendo questi passaggi, avrai configurato correttamente keepalive_timeout
per ottimizzare le prestazioni del tuo server Nginx.