Как сказать gzip_static не искать файлы изображений? - PullRequest
3 голосов
/ 20 октября 2010

У меня установлен nginx с активированным gzip_static. Он отлично работает для файлов CSS и JavaScript, но также ищет сжатые версии файлов изображений, такие как .png и .gif, хотя их нет в списке файлов для сжатия:

# 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)

Вот моя конфигурация nginx:

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

Есть ли способ предотвратить это?

Ответы [ 3 ]

5 голосов
/ 20 октября 2010

Я нашел решение. На самом деле, два возможных решения:

  1. храните файлы JavaScript и CSS в отдельном каталоге и создайте правило "location", чтобы использовать gzip_static только для этого каталога

  2. если это невозможно (хостинг нескольких веб-сайтов, не все под вашим контролем, слишком много каталогов и файлов), существует более простое решение для предотвращения нескольких вызовов open () с помощью параметра open_file_cache_errors который кэширует (т.е. запоминает), что файл .gz отсутствует, и не пытается открыть его снова.

0 голосов
/ 18 июня 2015

Я обнаружил простой способ сделать это, используя вложенные блоки местоположения:

  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;
    }
  }
0 голосов
/ 05 мая 2011

Я нашел способ отредактировать исходный код nginx, но очень ужасным образом:

  1. найти файл:

ngx_http_gzip_static_module.c (версия 1.0.1, другая версия может быть такой же):

2 .in:

ngx_http_gzip_static_handler (ngx_http_request_t * r)

3. Найдено:

if (r-> uri.data [r-> uri.len - 1] == '/') { вернуть NGX_DECLINED; }

  1. добавить:

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] == '.') { вернуть 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] == '.') { вернуть 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] == '.') { вернуть NGX_DECLINED; }

  1. Перекомпилируйте ваш источник.

Любой, кто знает C, может редактировать его, чтобы он был более профессиональным, потому что я не знаю C: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...