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