3 Stimmen

Wie kann man gzip_static anweisen, nicht nach Bilddateien zu suchen?

Ich habe nginx installiert und gzip_static aktiviert. Es funktioniert gut für CSS- und JavaScript-Dateien, aber es sucht auch nach gzip-Versionen von Bilddateien wie .png und .gif, obwohl diese nicht in der Liste der zu komprimierenden Dateien stehen:

# strace -p 25044 2>&1 | grep gz
open("/var/www/css/ymax.css.gz", O_RDONLY|O_NONBLOCK) = 438
open("/var/www/images/tools.png.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/images/ads/bs.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/images/gfxborder/border_right.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/images/ads/hocuto03.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)

Hier ist meine nginx-Konfiguration:

gzip  on;
gzip_disable     "msie6";
gzip_min_length 1000;
gzip_types text/plain text/css application/x-javascript text/javascript;
gzip_static on;

Gibt es eine Möglichkeit, dies zu verhindern?

5voto

Milan Babuškov Punkte 57324

Ich habe eine Lösung gefunden. Genauer gesagt, zwei mögliche Lösungen:

  1. JavaScript- und CSS-Dateien in einem separaten Verzeichnis aufbewahren und eine "location"-Regel erstellen, um gzip_static nur für dieses Verzeichnis zu verwenden

  2. Wenn dies nicht möglich ist (mehrere Websites hosten, nicht alles unter Ihrer Kontrolle, zu viele Verzeichnisse und Dateien), gibt es eine einfachere Lösung, um mehrere open()-Aufrufe zu verhindern, indem Sie open_file_cache_errors Einstellung, die die .gz-Datei zwischenspeichert (d. h. sich merkt), dass sie nicht vorhanden war, und nicht versucht, sie erneut zu öffnen.

0voto

newcomer11 Punkte 9

Ich habe einen Weg gefunden, den Quellcode von nginx zu bearbeiten, aber auf eine sehr schreckliche Weise:

  1. Datei suchen :

ngx_http_gzip_static_module.c (Version 1.0.1, andere Versionen können identisch sein):

2 .in:

ngx_http_gzip_static_handler(ngx_http_request_t *r)

3 .gefunden :

if (r->uri.data[r->uri.len - 1] == '/') { return NGX_DECLINED; }

  1. hinzufügen:

if ( r->uri.data[r->uri.len - 1] == 'g' && r->uri.data[r->uri.len - 2] == 'n' && r->uri.data[r->uri.len - 3] == 'p' && r->uri.data[r->uri.len - 4] == '.') { return NGX_DECLINED; } if ( r->uri.data[r->uri.len - 1] == 'g' && r->uri.data[r->uri.len - 2] == 'p' && r->uri.data[r->uri.len - 3] == 'j' && r->uri.data[r->uri.len - 4] == '.') { return NGX_DECLINED; } if ( r->uri.data[r->uri.len - 1] == 'o' && r->uri.data[r->uri.len - 2] == 'c' && r->uri.data[r->uri.len - 3] == 'i' && r->uri.data[r->uri.len - 4] == '.') { return NGX_DECLINED; }

  1. Kompilieren Sie Ihren Quelltext neu.

Jeder, der sich mit C auskennt, kann es so bearbeiten, dass es professioneller ist, denn ich kenne C nicht :(

0voto

Iolo Punkte 1952

Ich habe eine einfache Möglichkeit gefunden, dies mit verschachtelten Ortsblöcken zu erreichen:

  location /assets {
    root   /usr/share/nginx/html;
    location ~ .*.(js|css|html|png)+$ {
      # Use for debugging
      # add_header 'X-static-gzipping' 'on' always;
      gzip_static on;
    }
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X