proxy_store tomcat

Maxim Dounin mdounin на mdounin.ru
Чт Авг 6 01:46:21 UTC 2020


Hello!

On Wed, Aug 05, 2020 at 06:07:43AM -0400, oradba25 wrote:

> Добрый день
> 
> Долгое время работал сайт под управлением tomcat 7.0.75 с настройкой кеша
> под статику таким образом
> 
>     root                /nginx/root/site;
>     location ~ ^/tst/(css|custom|galleries|i|images)/       {
>         expires             3h;
>         proxy_cache_valid   200 3h;

Замечу, что директива "proxy_cache_valid" тут не делает ничего, 
так как ни проксирования, ни тем более проксирования с 
кэшированием в данном location'е нет.

>         add_header          "Cache-Control" "public";
>         add_header          "Cache-Control" "no-transform";
> 
>         try_files   $uri @proxy_priv;
>     }
> 
>     location @proxy_priv        {
>         internal;
>         proxy_intercept_errors  on;
>         proxy_set_header        "Accept-Encoding" "identity";
>         proxy_store             on;
>         proxy_pass              http://site_priv_http;
>     }
> 
> 
> После очередного апгрейда приложения версия tomcat поменялась на 9.0.36
> 
> И вся эта кухня перестала работать. Точнее, работает только первый раз!
> 
> Потом тупо не возвращает например, тот же css -- идут ошибки HTTP 400 Bad
> Request
> 
> Удаляешь файлики из  /nginx/root/site (== root) все опять ОДИН раз
> отрабатывает, пока не закеширует снова

Кто возвращает ошибки?  На какие запросы?  Есть ли при этом 
сохранённый файл у nginx'а для данного запроса?  Что при этом в 
access log'е и error log'е nginx'а?

> Есть подозрение, что мешает  proxy_set_header        "Accept-Encoding"
> "identity";
> Но тем же curl-ем тако заголовок отрабатывает вполне нормально

Я сомневаюсь, что дело в этом: если бы бэкенду не нравился 
заголовок "Accept-Encoding: identity", то он бы всё время 
возвращал ошибки, а не только после того, как что-то закэшируется.  
Впрочем, в любом случае самое правильное, что тут можно сделать, 
это убрать заголовок из запросов:

    proxy_set_header Accept-Encoding "";

Так заголовок не будет передаваться на бэкенд, и соответственно 
бэкенд должен будет возвращать несжатые ответы.  Ну или просто 
выключить сжатие на бэкенде и убрать вообще все манипуляции с 
заголовком Accept-Encoding.

> С другими значениями (или без этого заголовка вообще) данные приходят в
> zip-виде, но браузер почему-то это не понимает и считает что они просто
> кривые

Это ожидаемо: вы используете proxy_store, который умеет сохранять 
только тело ответа, и соответственно информация из заголовков, 
указывающая, что ответ сжат, теряется.  Браузеру в результате 
неоткуда узнать, что ответ был сжат, и с его точки зрения он 
получает мусор.

Если хочется, чтобы заголовки сохранялись и браузер мог прочитать 
такой ответ - используйте proxy_cache.  От необходимости отключать 
сжатие и/или убирать Accept-Encoding, впрочем, это не избавит: 
даже если бэкенд честно пришлёт "Vary: Accept-Encoding", 
кэшерование будет неэффективным.  С другой стороны, смысл 
использования тут proxy_store от меня так или иначе ускользает: на 
нём, конечно, можно построить много всего интересного, но он при 
этом и ограничений налагает немало.  В общем случае гораздо проще 
использовать для кэширования proxy_cache.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru