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 mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru