nginx gzip_static: por que os arquivos não compactados são necessários?

3

Estou trabalhando com o nginx 1.4.4 sendo executado no Ubuntu 12.04.4 .
O nginx é um proxy reverso de um cluster de servidores de aplicativos Rails .

Arquivos estáticos (principalmente ativos) são exibidos diretamente, sem atingir os servidores de aplicativos.
Configurei-o para gzip de respostas e para usar arquivos pré-compactados quando disponíveis.

http {
  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  # other ngx_http_gzip_module directives...

  server {
    # proxy configuration

    location ^~ /assets/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
      # root is inherited
      try_files $uri =404;
      error_page 404 /404.html;
    }
  }
}

Isso funciona.
Testei-o usando um recurso real pré-zipado e um fictício não compactado com o mesmo nome, mas conteúdo diferente:

/assets/application-a45d6...e2593.css         # dummy content
/assets/application-a45d6...e2593.css.gz      # real CSS

Eu pude ver que alternar gzip_static on e off faria com que o nginx exibisse corretamente a versão esperada do arquivo.
Por enquanto, tudo bem.

No entanto , essa configuração só funciona se a versão não compactada do arquivo também estiver presente. Ter apenas a versão pré-compactada causará um erro 404.

A documentação diz:

gzip_static
With the “always” value (1.3.6), gzipped file is used in all cases, without checking if the client supports it. It is useful if there are no uncompressed files on the disk anyway or the ngx_http_gunzip_module is used.

(sim: tentei on e always e também tentei adicionar gunzip on . Nada mudou)

Parece sugerir que ter somente as versões compactadas dos arquivos está ok. É este realmente o caso? Há algo de errado na minha configuração?

    
por tompave 03.02.2014 / 02:36

2 respostas

4

É possível que você tenha encontrado um bug. Mas, em geral, você quer os dois arquivos de qualquer maneira, por três motivos:

  1. Alguns clientes não solicitam dados compactados e, se você os forçar com gzip_static always; , eles podem não entender.
  2. Para garantir que o arquivo seja sempre encontrado, e a solicitação não seja enviada para o Rails ou seja capturada pelo manipulador 404 (o possível bug). Um dos quais é provavelmente o que está acontecendo.
  3. Ter compactação nginx ou descompactar o arquivo em tempo de execução significa que ele deve fazer isso repetidamente, consumindo CPU valiosa que pode ser usada para executar seu aplicativo. É muito menos intensivo da CPU simplesmente enviar um recurso estático.
por 03.02.2014 / 03:08
5

Arquivos não compactados não são necessários no Nginx 1.6 com:

    location ~ \.txt$ {
        gzip_static on;
        gunzip on;
    }

Tanto curl http://localhost/index.txt como curl -H "Accept-Encoding: gzip" http://localhost/index.txt | gunzip agora funcionam bem com apenas /srv/www/localhost/index.txt.gz no meu diretório raiz.

    
por 11.07.2014 / 00:43

Tags