Я работаю с 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
в моем корневом каталоге.
Возможно, вы нашли ошибку. Но в целом вам все равно нужны оба файла по трем причинам:
gzip_static always;
они могут этого не понять.Вопреки тому, что говорит @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
.