Warum funktioniert das Nginx Gzip Precompression-Modul nicht?

11

Ich versuche derzeit, Nginx so einzurichten, dass alle meine statischen Dateien bereitgestellt werden. Da sie überhaupt nicht sehr häufig geändert werden, möchte ich das Modul gzip_static verwenden, damit ich Kopien meiner Dateien vorab gzipen kann, um CPU-Zeit zu sparen und eine bessere Komprimierung zu ermöglichen.

Ich habe Nginx mit kompiliert --with-http_gzip_static_moduleund so eingerichtet, dass es meine statischen Dateien bedient, bisher keine Probleme. Ich wollte testen und sicherstellen, dass das statische Zippen tatsächlich funktioniert, also habe ich zwei Dateien erstellt test.txtund test.txt.gz. In der ersten Zeile jeder Datei wird angegeben, ob sie komprimiert wurden, und dann gibt es eine neue Zeile und 256 zufällige Zeichen (zwischen den beiden Dateien unterschiedlich).

Ich habe gelesen, dass die Änderungszeit der Datei und des gezippten Gegenstücks gleich sein sollte, und habe beide der folgenden Methoden ausprobiert:

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

Auf meinem lokalen Computer teste ich mit Curl:

curl $URL/test.txt

Das funktioniert gut, ich bekomme die Version zurück, die ich nicht vorkomprimiert habe, aber wenn ich das mache:

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

Ich auch bekommen die Version zurück ich nicht Vorkompressionsposition tat. Ich habe versucht, gzip offmeine Einstellungen nginx.confvorzunehmen, aber es macht keinen Unterschied. Ich habe auch neu kompilierte Nginx mit --without-http_gzip_moduleund das scheint keinen Unterschied entweder zu machen, Nginx noch gzips Dinge selbst im Fluge.

Ich bin ziemlich neu bei Nginx, aber hier bin ich wirklich ratlos.

Hier ist die Ausgabe von ./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

Und hier ist meine 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;
    }
}

Jede Hilfe wird sehr geschätzt!

Gordon Bailey
quelle

Antworten:

8

Sie haben dies in Ihrer Frage nicht erwähnt, aber ich bin der festen Überzeugung, dass Sie Nginx als Proxy hinter einem anderen Nginx auf einem gemeinsam genutzten Host ausführen. ;)

Zum Zeitpunkt den ich schreibe, verwenden Sie Nginx die gzip - Module HTTP 1.1 standardmäßig, aber Nginx kann verwenden nur HTTP 1.0 , wenn sie mit Back-End - Servern in Verbindung steht, so dass die Lösung zu setzen , ist gzip_http_versionin Ihrem nginx.conf, etwa so:

gzip_http_version 1.0;

Starten Sie Ihren Nginx neu, nachdem Sie diese Änderung vorgenommen haben, und Sie sollten im Geschäft sein.

Sean F.
quelle
Tolle! Woher wusstest du das?
Jürgen Paul