Questo articolo tratta le principali impostazioni per l'ottimizzazione delle prestazioni del web server nginx, tra cui la compressione gzip, la configurazione di proxy_buffer e le impostazioni dei worker e di keep-alive.
In particolare, viene sottolineata l'importanza della compressione gzip e del buffering proxy_buffer per ridurre il volume di dati trasferiti e minimizzare il carico del server, nonché la gestione delle connessioni tramite le impostazioni dei processi worker e keep-alive.
Sono stati eseguiti diversi test per applicare le impostazioni ottimali in base all'ambiente del server e vengono fornite indicazioni per una gestione stabile del server.
Nginx è un software open source, ampiamente utilizzato come server web o server proxy web.
Con una configurazione appropriata, può fornire contenuti statici in modo efficiente.
Voglio documentare alcune delle sue impostazioni principali.
Alcune impostazioni principali relative alle prestazioni
1. Compressione gzip
Quando si carica un sito web, si ricevono numerosi file dal server web, come JavaScript, immagini, HTML e CSS.
Invece di fornire questi contenuti nella loro forma originale, utilizzando la compressione gzip è possibile ridurre significativamente la quantità di dati trasmessi.
In altre parole, applicando questa compressione:
- Si riduce la quantità di dati, risparmiando larghezza di banda.
- Si possono risparmiare risorse del server.
- Dal punto di vista dell'utente, la velocità di caricamento effettiva aumenta.
D'altra parte, poiché il server deve eseguire la compressione gzip prima di rispondere al contenuto, l'utilizzo della CPU del server potrebbe aumentare.
È necessario testare attentamente prima dell'implementazione in produzione quali tipi di file comprimere, il livello di compressione e la dimensione dei file da comprimere.
Di seguito sono riportate alcune impostazioni relative a gzip.
gzip on; # Abilita la compressione gzip.
gzip_vary on; # Aggiunge l'header Vary: Accept-Encoding.
gzip_proxied any; # Se nginx viene utilizzato come server proxy, comprime la risposta ricevuta dal backend. (Compressione per richieste proxy)
gzip_min_length 256; # Comprime solo file di almeno 256 byte.
gzip_comp_level 5; # Imposta il livello di compressione da 1 a 9. Più alto è il livello, maggiore è l'utilizzo della CPU. 5 comprime circa il 50%.
gzip_types text/plain text/css text/xml application/json application/javascript;
// Imposta i tipi di contenuto da comprimere.
* gzip_vary indica che il server può inviare contenuti compressi e non compressi a seconda che il client supporti gzip o meno. (Indica che possono essere forniti contenuti di diverse versioni in base all'header di richiesta del client (Accept-Encoding)).
2. Impostazione di proxy_buffer
Nginx memorizza la risposta in un buffer prima di inviarla al client.
Quando il server web invia una risposta al client, se la velocità del client è lenta, il server deve attendere continuamente per la trasmissione dei dati. (collo di bottiglia della rete)
In questo caso, poiché le risorse del server vengono utilizzate continuamente, per risolvere questo problema, viene utilizzato un buffer per elaborare temporaneamente la risposta indipendentemente dalla velocità di elaborazione del client. Questo porta ai seguenti vantaggi:
- Ottimizzazione del carico del server
- Riduzione dei colli di bottiglia di rete
location / {
proxy_pass url_del_server;
# Impostazione del buffer proxy
proxy_buffering on; # Abilita il buffering.proxy_buffer_size 4k; # Imposta la dimensione del buffer.(Principalmente contiene le intestazioni).proxy_buffers8 4k; # Numero e dimensione dei buffer per ogni connessione(8 buffer da 4 kb).proxy_busy_buffers_size 8k; # Dimensione massima del buffer utilizzabile durante l'invio della risposta al client.}
※ Se la dimensione del buffer è troppo grande, la trasmissione di dati in tempo reale come lo streaming di testo potrebbe essere ritardata, quindi è necessario eseguire dei test. In particolare, con l'aumento dei servizi correlati all'IA, se lo streaming di testo non funziona, controlla attentamente questa impostazione.
3. Impostazione di worker e http
I worker sono i processi che gestiscono le richieste dei client ed è possibile impostare quanti worker utilizzare per ogni core della CPU del server.
Http normalmente segue il ciclo richiesta-connessione-risposta-chiusura connessione, ma per ridurre le risorse utilizzate per le connessioni multiple richieste, è possibile mantenere la connessione client. Questa è l'impostazione keep-alive.
worker_processes auto; # Impostazione automatica in base al numero di core CPU disponibili.
worker_connections 1024; # Numero di connessioni che ogni worker può gestire contemporaneamente.
# Impostazione keep-alive
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
location / {
proxy_pass url_del_server;
}
}
Il motivo per cui queste due impostazioni sono raggruppate è il seguente.
Se il server ha 4 core, il numero teorico di connessioni possibili è 1.024 * 4 = 4.096.
(Potrebbe non essere preciso a seconda delle risorse e dell'ambiente di traffico)
Quando 4.096 client si connettono contemporaneamente e occupano tutti i keep-alive per 65 secondi,
se un 4.097° utente tenta di connettersi, potrebbe non riuscire a farlo, causando un ritardo nella risposta.
Pertanto, supponendo che le risorse del server siano stabili grazie all'auto-scaling, se si verifica un ritardo nella risposta durante un evento, le impostazioni di cui sopra potrebbero avere un impatto indiretto.
4. Altro - blocco location
Alcune impostazioni, come il buffer proxy, possono essere applicate per URL di richiesta specifici.
* Alcune impostazioni, come keep-alive, vengono applicate a livello di server HTTP e non possono essere impostate per blocco.
server { listen 80; server_name example.com;
# Elaborazione del percorso di base(/)location/{ proxy_pass url_del_server; # Impostazione del buffering
proxy_buffering on; proxy_buffers 8 16k; proxy_buffer_size 32k; proxy_busy_buffers_size 64k;}# Elaborazione del percorso /test
location/test { proxy_pass url_del_server2; # Disattivazione del buffering
proxy_buffering off; # Disattivazione del buffering(invio immediato della risposta)}}
Con le impostazioni di cui sopra è possibile ottimizzare le prestazioni web. Dopo aver eseguito test sufficienti considerando diversi casi di test, ottimizza le prestazioni del server!
* È possibile applicare la configurazione modificata di nginx senza tempi di inattività del server, quindi è generalmente stabile.