Re: Настройка proxy cache + gzip
Maxim Dounin
mdounin at mdounin.ru
Wed Nov 28 11:23:01 UTC 2012
Hello!
On Wed, Nov 28, 2012 at 04:23:12AM -0500, SenatoR wrote:
> Добрые сутки!
>
> Образил уже весь рунет, но либо такая проблема есть только у меня, либо всем
> на нее пофиг. Допустим, у нас есть proxy_cache или fastcgi_cache. Заставим
> его закешировать тестовую страницу, для чего зайдем на нее из браузера,
> поддерживающего сжатие gzip. В кеше на диске видно, что страница сжата и
> присутствуют соответствующие этому заголовки.
>
> А теперь зайдем на ту же страницу браузером без поддержки gzip (хоть тот же
> wget). Страница отдается из кеша, кодированной (!!!), вместо текста -
> кракозябры.
>
> Временно я решил эту проблему вот так:
>
> if ($http_user_agent ~ "MSIE [4-6]\.|Safari|Konqueror") {
> # В этих браузерах имеются баги при обработке gzip-сжатых файлов с
> длинными URL-ами.
> set $no_gzip 1;
> }
>
> if ($http_accept_encoding !~ "gzip") {
> set $no_gzip 1;
> }
>
> proxy_cache my_cache;
>
> proxy_cache_key
> "$no_gzip|$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
>
> Но сами понимаете, обидно кешировать 2 одинаковые страницы. Что делать и как
> быть? gzip_disable не помогает.
Есть два способа кешировать только один вариант страницы:
1) Кешировать не сжатую страницу. Для этого можно либо отключить
сжатие на бекенде, либо сделать
proxy_set_header Accept-Encoding "";
Как-то так обычно у всех и работает.
2) Кешировать сжатую страницу. Для этого нужно, наоборот,
включить сжатие, и принудительно выставить Accept-Encoding так,
чтобы бекенд жал ответы, и обеспечить расжатие ответов для
клиентов, которые gzip не поддерживают:
gunzip on;
proxy_set_header Accept-Encoding "gzip";
Для этого необходим модуль gunzip (в 1.3.x присутствует в коробке,
http://nginx.org/r/gunzip, для более старых версий - при желании
собирается как сторонний).
--
Maxim Dounin
http://nginx.com/support.html
Подробная информация о списке рассылки nginx-ru