Dlaczego moduł prekompresji Nginx Gzip nie działa?

11

Obecnie próbuję skonfigurować Nginx do obsługi wszystkich moich plików statycznych. Ponieważ nie będą one często zmieniane bardzo często, chcę nam moduł gzip_static, który pozwoli mi wstępnie kopiować kopie moich plików, aby zaoszczędzić trochę czasu procesora i umożliwić lepszą kompresję.

Skompilowałem Nginx --with-http_gzip_static_modulei skonfigurowałem go tak, aby obsługiwał moje pliki statyczne, bez żadnych problemów. Chciałem przetestować i upewnić się, że statyczne gzipping faktycznie działa, więc utworzyłem dwa pliki test.txti test.txt.gz. W pierwszym wierszu każdego z plików jest napisane, czy zostały zgzipowane, a następnie jest nowa linia i 256 losowych znaków (różne między dwoma plikami).

Przeczytałem, że czas modyfikacji pliku i jego gzipowanego odpowiednika powinien być taki sam, i wypróbowałem oba poniższe:

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

Na mojej lokalnej maszynie testuję za pomocą curl:

curl $URL/test.txt

Działa to dobrze, otrzymuję wersję, której nie skompresowałem, ale kiedy to zrobię:

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

Ja też wrócić wersję ja nie precompress. Próbowałem ustawić gzip offw sobie nginx.conf, ale to nie robi różnicy. Ponownie skompilowałem Nginx --without-http_gzip_modulei to też nie wydaje się mieć znaczenia, Nginx wciąż zgada rzeczy w locie.

Jestem całkiem nowy w Nginx, ale naprawdę jestem tutaj zagubiony.

Oto wynik działania ./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

A oto moje 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;
    }
}

Każda pomoc jest bardzo mile widziana!

Gordon Bailey
źródło

Odpowiedzi:

8

Nie wspomniałeś o tym w swoim pytaniu, ale mam dobrą władzę, że korzystasz z Nginx za innym Nginx na współdzielonym hoście. ;)

W chwili, gdy to piszę, moduły gzip Nginx domyślnie używają HTTP 1.1, ale Nginx może używać HTTP 1.0 tylko podczas komunikacji z serwerami zaplecza, więc rozwiązaniem jest ustawienie gzip_http_versionw twoim nginx.conf:

gzip_http_version 1.0;

Uruchom ponownie Nginx po dokonaniu tej zmiany i powinieneś być w biznesie.

Sean F.
źródło
Niesamowity! Skąd to wiesz?
Jürgen Paul