Qual è il miglior livello di compressione gzip di nginx?


44

Sto usando la cache del proxy inverso nginx con gzip abilitato. Tuttavia, ho riscontrato alcuni problemi dalle richieste HTTP delle applicazioni Android al mio servizio Web RSON JSON. Sembra che quando spengo la cache del proxy inverso, funziona bene perché l'intestazione della risposta arriva senza gzip. Pertanto, penso che il problema sia causato da gzip. Qual è il livello più appropriato di compressione gzip?

gzip               on;
gzip_http_version  1.0;
gzip_vary          on;
gzip_comp_level    6;
gzip_proxied       any;
gzip_types         text/plain text/css text/javascript application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss;

Risposte:


18

Il livello di compressione gzip determina semplicemente la compressione dei dati su una scala da 1 a 9, dove 9 è il più compresso. Il compromesso è che i dati più compressi di solito richiedono la maggior parte del lavoro per comprimere / decomprimere, quindi se lo si imposta su un sito Web ad alto volume, è possibile avvertirne l'effetto.

Sembra che i tuoi problemi siano più correlati alle intestazioni HTTP sulle richieste. Di solito il traffico HTTP compresso con gzip è accompagnato dall'intestazione Content-Encoding: gzip. Se questo viene eliminato da qualche parte, il client potrebbe non sapere di dover decomprimere la risposta.


Come disabilitare la risposta gzip usando l'intestazione della richiesta http dal client? Provo Accept-Encoding: '', ma non funziona.
Chamnap

Da RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Penso che tu voglia semplicemente "Accept-Encoding:" senza seguire nulla.
Crescere il

Sì, ho aggiunto l'intestazione Accept-Encoding con stringa vuota con addon poster su mozilla, e la risposta è tornata senza Content-Encoding: 'gzip'. Tuttavia, sull'app Android, ritorna sempre in gzip. Ho controllato ciò che è stato memorizzato nella cache della directory della proxy proxy, nginx memorizza nella cache il contenuto di gzip, quindi probabilmente sono le risposte in gzip. Come risolverlo?
Chamnap

Alcune fonti suggeriscono che le risorse di decompressione non aumentano all'aumentare del livello di compressione. Le risorse in realtà diminuiscono in alcuni casi con l'aumento del livello di compressione. stackoverflow.com/questions/28452429/...
user2208096

90

Ho provato questo sotto nginx 1.3.9 con due file e questi erano i risultati che ho ottenuto per i vari livelli:


text/html - phpinfo ():

0    55.38 KiB (100.00% of original size)
1    11.22 KiB ( 20.26% of original size)
2    10.89 KiB ( 19.66% of original size)
3    10.60 KiB ( 19.14% of original size)
4    10.17 KiB ( 18.36% of original size)
5     9.79 KiB ( 17.68% of original size)
6     9.62 KiB ( 17.37% of original size)
7     9.50 KiB ( 17.15% of original size)
8     9.45 KiB ( 17.06% of original size)
9     9.44 KiB ( 17.05% of original size)

application/x-javascript - jQuery 1.8.3 (non compresso):

0    261.46 KiB (100.00% of original size)
1     95.01 KiB ( 36.34% of original size)
2     90.60 KiB ( 34.65% of original size)
3     87.16 KiB ( 33.36% of original size)
4     81.89 KiB ( 31.32% of original size)
5     79.33 KiB ( 30.34% of original size)
6     78.04 KiB ( 29.85% of original size)
7     77.85 KiB ( 29.78% of original size)
8     77.74 KiB ( 29.73% of original size)
9     77.75 KiB ( 29.74% of original size)

Non sono sicuro di quanto sia rappresentativo, ma dovrebbe servire da esempio. Inoltre, non ho preso in considerazione l'utilizzo della CPU, ma da questi risultati il ​​livello di compressione ideale sembra essere tra 4e 6.


Inoltre, se usi il gzip_staticmodulo, potresti voler pre-comprimere i tuoi file (in PHP):

function gzip_static($path)
{
    if ((extension_loaded('zlib') === true) && (is_file($path) === true))
    {
        $levels = array();
        $content = file_get_contents($path);

        foreach (range(1, 9) as $level)
        {
            $levels[$level] = strlen(gzencode($content, $level));
        }

        if ((count($levels = array_filter($levels)) > 0) && (min($levels) < strlen($content)))
        {
            if (file_put_contents($path . '.gz', gzencode($content, array_search(min($levels), $levels)), LOCK_EX) !== false)
            {
                return touch($path . '.gz', filemtime($path), fileatime($path));
            }
        }
    }

    return false;
}

Ciò consente di ottenere la migliore compressione possibile senza sacrificare la CPU su ogni richiesta.


questo è in contrasto con i risultati su weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much che mostrano un grande calo nei livelli di compressione dopo i livelli 5 e 6.
Jeff Atwood

6

Se puoi davvero risparmiare risorse della CPU, puoi usare 9, ma per la maggior parte dei siti è sufficiente un valore di 2, poiché gzip non riduce il file molto dopo il livello 1.

Modifica: ho guardato Amazon CloudFront e sembra che stia usando il livello 6, probabilmente perché quel livello è quello che esegue la decompressione più velocemente, migliorando così le prestazioni di rendering della pagina.


Questo non è corretto
calumbrodie il

2
Cloud, spieghi cosa c'è che non va? Comunque, ho aggiornato la risposta, ho cercato un po 'di più e vedo che siti come Amazon CloudFront usano un livello di compressione di 6, probabilmente perché è meglio sulla velocità di decompressione (quindi le pagine si caricheranno più velocemente).
DiegoG,

1) La differenza tra 2 e 6 non è banale, può arrivare fino al 10-15%, guardare i dati o provarli da soli. 2) il livello di compressione non influisce la difficoltà di decomprimere (vedi stackoverflow.com/questions/28452429/... )
calumbrodie

0

Se hai un sito Web ad alto volume e desideri comunque avere un livello completo (9) di compressione, l'idea migliore sarebbe quella di mettere il tuo contenuto statico su Amazon S3 o servizi di archiviazione di oggetti simili e caricare i file compressi.

Vorresti comunque usare nginx per comprimere il tuo HTML, quindi meglio mantenere quel valore alla normalità, ne uso 5.


Vorrei utilizzare il tuo suggerimento, ma al momento non ho incluso un comp_levelnella mia configurazione, quindi non posso dire a quale livello sono attualmente. Sai quali sono le impostazioni predefinite? Fonte?
Hassan Baig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.