Назад | Перейти на главную страницу

nginx gzip_static: зачем нужны несжатые файлы?

Я работаю с nginx 1.4.4 работает на Ubuntu 12.04.4.
nginx выполняет обратное проксирование кластера Рельсы серверы приложений.

Статические файлы (в основном ресурсы) обслуживаются напрямую, не затрагивая серверы приложений.
Я настроил это на gzip ответы и использовать предварительно сжатый файлы, если они доступны.

http {
  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  # other ngx_http_gzip_module directives...

  server {
    # proxy configuration

    location ^~ /assets/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
      # root is inherited
      try_files $uri =404;
      error_page 404 /404.html;
    }
  }
}

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

/assets/application-a45d6...e2593.css         # dummy content
/assets/application-a45d6...e2593.css.gz      # real CSS

Я видел это переключение gzip_static on и off приведет к тому, что nginx будет правильно обслуживать ожидаемую версию файла.
Все идет нормально.

тем не мение, эта настройка работает, только если несжатый версия файла тоже присутствует. Имея только предварительно сжатый версия вызовет ошибку 404.

В документация говорит:

gzip_static
При значении «всегда» (1.3.6) сжатый файл gzip используется во всех случаях, без проверки, поддерживает ли его клиент. Это полезно, если на диске все равно нет несжатых файлов или используется модуль ngx_http_gunzip_module.

(да: я пробовал оба on и always, и я также пытался добавить gunzip on. Ничего не изменилось)

Кажется, предполагается, что наличие только сжатые версии файлов в порядке. Так ли это на самом деле? Что-то не так в моей конфигурации?

Несжатые файлы не требуются на Nginx 1.6 с:

    location ~ \.txt$ {
        gzip_static on;
        gunzip on;
    }

Обе curl http://localhost/index.txt и curl -H "Accept-Encoding: gzip" http://localhost/index.txt | gunzip теперь нормально работать с /srv/www/localhost/index.txt.gz в моем корневом каталоге.

Возможно, вы нашли ошибку. Но в целом вам все равно нужны оба файла по трем причинам:

  1. Некоторые клиенты не будут запрашивать сжатые данные, и если вы заставите их gzip_static always; они могут этого не понять.
  2. Чтобы гарантировать, что файл всегда найден, и запрос не будет передан Rails вверх по потоку и не будет перехвачен обработчиком 404 (возможная ошибка). Одно из них, вероятно, происходит.
  3. Если nginx сжимает или распаковывает файл во время выполнения, это означает, что он должен делать это неоднократно, поглощая ценный процессор, который можно использовать для запуска вашего приложения. Простая отправка статического ресурса требует гораздо меньше ресурсов ЦП.

Вопреки тому, что говорит @hendry, мне нужно сохранить исходные файлы.

Я использую nginx 1.15.9 (Ubuntu).

gzip_static компилируется в:

nginx -V 2>&1 | grep "\-\-with\-http_gzip_static_module

gunzip составлен в:

nginx -V 2>&1 | grep "\-\-with\-http_gunzip_module".

Я нашел это, хотя, возможно, оно устарело:

try_files не знает о gzip_static; но nginx по-прежнему будет соблюдать его, если существуют файлы не-gz и .gz. Это отличается от "нормальной" обработки gzip_static, которая будет обслуживать версию .gz, если это необходимо, независимо от того, существует ли не-gz или нет. - http://mailman.nginx.org/pipermail/nginx/2012-June/034102.html

Кажется, что try_files требует, чтобы исходный файл работал там, и gzip_static не всегда влияет на него. Это потому, что try_files $ uri = 404 требует существования файла $ uri. - https://trac.nginx.org/nginx/ticket/1570

Это мое nginx.conf:

events {
    worker_connections 768;
}

http {
    server {
        # Enable static gzip
        gzip_static on;
        gunzip on;

        listen 8080 default_server;
        listen [::]:8080 default_server;

        root /home/user/projects/project1/build;

        location / {
            try_files $uri /index.html;
        }
    }
}

Запустите это с sudo nginx -t -c nginx.conf -p $PWD.

Перезагрузите с sudo killall -9 nginx; sudo nginx -c nginx.conf -p $PWD; ps aux | grep nginx.