nginx кэширование: возвращать кэшированную страницу (если указан c задан заголовок Cache-Control), только если вышестоящий сервер недоступен - PullRequest
2 голосов
/ 17 февраля 2020

Я пытаюсь настроить кэширование для вышестоящего сервера (которым я не управляю). Большинство файлов можно кэшировать (и не установить Cache-Control), они работают нормально.

Однако некоторые местоположения на сервере являются списками каталогов (и имеют Cache-Control: no-store). Я бы хотел их кэшировать только в том случае, если сервер недоступен. К сожалению, я либо получаю одно из следующих действий:

  • В ситуации, когда эти списки не кэшируются (нет файл в кеше, заголовок всегда показывает отсутствие кеша). Если сервер недоступен, списки каталогов (очевидно) не возвращаются
  • В ситуации, когда эти списки кэшируются, но они никогда не обновляются впоследствии (по крайней мере, до тех пор, пока кэш действителен). Поскольку я хотел бы долгое время кэшировать все остальные записи, списки каталогов быстро устарели.

Я попытался изменить заголовки на stale-if-error, но это не выглядело либо в помощь.

map $http_cache_control $http_updated_cache_control {
  no-store stale-if-error;
}

server {
...
  location /somewhere {
      sendfile on;
      sendfile_max_chunk 10m;
      tcp_nopush on;
      proxy_cache keyzone;

      # allow using stale requests in case of errors or when updating a file
      proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
      proxy_cache_revalidate on;
      proxy_cache_background_update on;

      # add header to indicate if caching works
      add_header X-Cache-Status $upstream_cache_status;

      proxy_cache_lock on;
      proxy_read_timeout  900;
      proxy_pass_header   Server;
      proxy_ignore_headers Set-Cookie;

      # allow caching of non-cacheable entries only when the server is erroring
      proxy_hide_header Cache-Control;
      add_header Cache-Control $http_updated_cache_control;

      # don't ignore the cache control header: some items (like directory listings) are marked as "don't cache")
      #proxy_ignore_headers Cache-Control;
  }
}

Как я могу кэшировать записи с помощью Cache-Control: no-store, но использовать кэшированные записи только если вышестоящий сервер не работает?

1 Ответ

1 голос
/ 23 февраля 2020

Я вижу две возможности:

  1. NGINX учитывает заголовки с вышестоящего сервера. Таким образом, если восходящий поток отправляет Expires несмотря на Cache-Control: no-store, то после изменения заголовков для NGINX они становятся Expires: ... Cache-Control: stale-if-error, и он ожидает

    , по крайней мере, до тех пор, пока кэш действителен

  2. proxy_cache_valid вероятно, имеют тот же эффект

Так что вам нужно

  1. либо установить небольшое значение для proxy_cache_valid для location /somewhere
  2. или / и удалите Expires, если он присутствует
  3. или / и добавьте max-age=0 к Cache-Control
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...