Qual é o melhor nível de compressão ggin do nginx?

44

Estou usando o cache de proxy reverso nginx com o gzip ativado. No entanto, tive alguns problemas com as solicitações HTTP dos aplicativos Android para o meu serviço da web Rails JSON. Parece que quando eu desligo o cache do proxy reverso, ele funciona bem porque o cabeçalho da resposta vem sem o gzip. Portanto, acho que o problema é causado pelo gzip. Qual é o nível mais apropriado de compactaçã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;
Chamnap
fonte

Respostas:

18

O nível de compactação gzip simplesmente determina como os dados são compactados em uma escala de 1 a 9, onde 9 é o mais compactado. A desvantagem é que os dados mais compactados geralmente exigem mais 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 nas solicitações. Normalmente, o tráfego HTTP compactado com gzip é acompanhado pelo Content-Encoding: gzipcabeçalho. Se isso estiver sendo descartado em algum lugar, talvez o cliente não precise descomprimir a resposta.

crescer
fonte
Como desativar a resposta gzip usando o cabeçalho de solicitação http do cliente? Eu tento Accept-Encoding: '', mas não funciona.
Chamnap
De RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Eu acho que você quer apenas 'Accept-Encoding:' sem nada a seguir.
growse
Sim, adicionei o cabeçalho Accept-Encoding com uma string vazia com addon de poster no mozilla e a resposta de volta sem Content-Encoding: 'gzip'. No entanto, no aplicativo para Android, ele sempre retorna em gzip. Eu verifiquei o que foi armazenado em cache nos diretórios de cache do proxy, o nginx armazena em cache o conteúdo do gzip, portanto é provavelmente as respostas do gzip. Como resolver isso?
Chamnap 30/03
Algumas fontes sugerem que os recursos de descompressão não aumentam à medida que o nível de compressão aumenta. Na verdade, os recursos diminuem em alguns casos, à medida que o nível de compactação aumenta. stackoverflow.com/questions/28452429/…
user2208096
90

Eu testei isso no 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 (não compactado):

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 tenho certeza de como isso é representativo, mas deve servir como exemplo. Além disso, não levei em consideração o uso da CPU, mas a partir desses resultados o nível de compactação ideal parece estar entre 4e 6.


Além disso, se você usar o gzip_staticmódulo, poderá compactar previamente seus 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.

Alix Axel
fonte
este piadas com resultados em weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much que mostram grande queda nos níveis de compressão após o nível 5 e 6.
Jeff Atwood
6

Se você realmente pode poupar recursos da CPU, pode usar 9, mas para a maioria dos sites um valor 2 é suficiente, pois o gzip não reduz muito o arquivo após o nível 1.

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

DiegoG
fonte
Isso não é correto
calumbrodie
2
Cloud você explica o que há de errado nisso? De qualquer forma, atualizei a resposta, pesquisei um pouco mais e vejo que sites como o Amazon CloudFront usam um nível de compactação de 6, provavelmente porque é melhor quanto à velocidade de descompactação (assim, as páginas carregam mais rapidamente).
DiegoG 27/07/19
1) A diferença entre 2 e 6 não é trivial, pode atingir de 10 a 15%, ver os dados ou experimentar você mesmo. 2) o nível de compressão não afeta a dificuldade para descomprimir (veja stackoverflow.com/questions/28452429/... )
calumbrodie
0

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

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

Aftab Naveed
fonte
Gostaria de usar sua sugestão, mas atualmente não incluí um comp_levelna minha configuração, portanto não sei dizer em que nível estou. Você sabe quais são os padrões? Fonte?
Hassan Baig