Qual é o melhor nível de compactação nginx gzip?

37

Estou usando o cache de proxy reverso nginx com o gzip ativado. No entanto, tenho alguns problemas de solicitações HTTP de aplicativos do Android para meu serviço da Web JSON do Rails. Parece que quando eu desligo o cache de proxy reverso, ele funciona ok porque o cabeçalho de resposta vem sem o gzip. Portanto, acho que o problema é causado pelo gzip. Qual é o nível mais adequado de compressão 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;
    
por Chamnap 29.03.2011 / 09:14

4 respostas

15

O nível de compactação gzip determina simplesmente a compactação dos dados em uma escala de 1 a 9, em que 9 é o mais compactado. A desvantagem é que os dados mais compactados geralmente exigem o máximo de trabalho para compactar / descompactar, portanto, se você tiver um conjunto bastante alto em um site de alto volume, poderá sentir seu efeito.

Parece que seus problemas estão mais relacionados aos cabeçalhos HTTP das solicitações. Normalmente, o tráfego HTTP compactado com gzip é acompanhado pelo cabeçalho Content-Encoding: gzip . Se isso está sendo descartado em algum lugar, o cliente pode não saber ter que descompactar a resposta.

    
por 29.03.2011 / 09:22
78

Eu testei isso sob o nginx 1.3.9 com dois arquivos, e estes foram os resultados que obtive para os vários níveis:

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 (descompactado):

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)

Não sei ao certo como isso é representativo, mas deve servir como exemplo. Além disso, não levei em conta o uso da CPU, mas, a partir desses resultados, o nível de compactação ideal parece estar entre 4 e 6 .

Além disso, se você usar o módulo gzip_static , poderá pré-compactar sua arquivos (em 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;
}

Isso permite que você obtenha a melhor compactação possível sem sacrificar a CPU em todas as solicitações.

    
por 27.11.2012 / 16:15
6

Se você realmente pode poupar recursos da CPU, você pode usar 9, mas para a maioria dos sites um valor de 2 é suficiente, já que o gzip não reduz o arquivo muito depois do nível 1.

Editar: Eu olhei para o Amazon CloudFront e parece estar usando o nível 6, provavelmente porque esse nível é o que executa a descompactação mais rapidamente, melhorando assim o desempenho da renderização da página.

    
por 09.05.2014 / 11:11
0

Se você tem um site de alto volume e ainda deseja ter um nível completo (9) de compactação, a melhor idéia seria colocar seu conteúdo estático no Amazon S3 ou serviços de armazenamento de objetos semelhantes e carregar os arquivos compactados.

Você ainda usaria o nginx para compactar o seu HTML, então é melhor manter esse valor normal, eu uso 5 lá.

    
por 15.01.2016 / 21:29