¿Por qué no funciona el módulo de precompresión Nginx Gzip?

11

Actualmente estoy tratando de configurar Nginx para servir todos mis archivos estáticos. Dado que no se cambiarán con mucha frecuencia, quiero que usemos el módulo gzip_static para permitirme precomprimir copias de mis archivos para ahorrar algo de tiempo de CPU y permitir una mejor compresión.

Compilé Nginx con --with-http_gzip_static_moduley lo configuré para que sirva mis archivos estáticos, sin problemas hasta ahora. Quería probar y asegurarme de que el gzipping estático realmente funcionara, así que hice dos archivos test.txty test.txt.gz. La primera línea de cada uno de los archivos dice si fueron comprimidos, y luego hay una nueva línea y 256 caracteres aleatorios (diferentes entre los dos archivos).

He leído que la hora de modificación del archivo y su contraparte comprimida debe ser la misma, y ​​he intentado lo siguiente:

touch test.*
touch -r test.txt test.txt.gx

En mi máquina local, estoy probando con curl:

curl $URL/test.txt

Esto funciona bien, recupero la versión que no comprimí previamente, pero cuando hago esto:

curl -H "Accept-Encoding: gzip" $URL/test.txt | gunzip

Yo también regrese la versión no lo hice precomprimirlos. Traté de configurar gzip offmi nginx.conf, pero no hace la diferencia. También he vuelto a compilar Nginx --without-http_gzip_moduley eso tampoco parece hacer una diferencia, Nginx todavía comprime las cosas sobre la marcha.

Soy bastante nuevo en Nginx, pero estoy realmente perdido aquí.

Aquí está la salida de ./nginx -V

built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 
configure arguments: --sbin-path=$SOMEPATH/nginx --prefix=$SOMEPATH --user=$ME --group=$MYGROUP --with-http_gzip_static_module --without-http_gzip_module

Y aqui esta mi nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
error_log  logs/error.log;
pid        logs/nginx.pid;
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    gzip_static on;
    sendfile        on;
    keepalive_timeout  65;
    access_log  logs/access.log;
    server {
        listen       XXXX;
        server_name  foo.bar.com;
        location / {
            root   html;
        }
        error_page  404 404.html;
        error_page   500 502 503 504 50x.html;
    }
}

¡Se agradece mucho cualquier ayuda!

Gordon Bailey
fuente

Respuestas:

8

No mencionó esto en su pregunta, pero tengo la buena autoridad de que está ejecutando Nginx proxy detrás de otro Nginx en un host compartido. ;)

En el momento en que escribo esto, los módulos gzip de Nginx usan HTTP 1.1 de manera predeterminada, pero Nginx solo puede usar HTTP 1.0 cuando se comunica con servidores de back-end, por lo que la solución es configurarlo gzip_http_versionen nginx.conf:

gzip_http_version 1.0;

Reinicie su Nginx después de hacer ese cambio, y debería estar en el negocio.

Sean F
fuente
¡Asombroso! ¿Cómo supiste esto?
Jürgen Paul