Назад | Перейти на главную страницу

Стратегия кеширования Nginx на основе запроса

Допустим, моему бэкэнду требуется ужасно 2 секунды, чтобы ответить (скажем, вне нашего контроля), и я НИКОГДА не хочу, чтобы посетитель испытал эту задержку, на нас не влияют файлы cookie или пользовательский сеанс.

Что я хочу сделать в nginx, это примерно так:

server {
  location / {
    # server requests from cache unless for some reason its not in cache
    proxy_pass http://backend/
    proxy_cache mycache
    proxy_cache_is_valid 2m
  }

  location / where request IP = 127.0.0.1 {
     proxy_pass http://backend/
     do_not_use_cache
     but_store response in cache
  }
}

Таким образом, я могу запускать простую задачу curl с localhost каждые 30 секунд, чтобы кеш оставался свежим / горячим с несколькими страницами, которые мне нужны, я никогда не хочу, чтобы посетитель был тем, кто нагревает кеш. Я читал документы, но не понимаю, как это сделать.

Попробуйте эту конфигурацию.

http {
  # http section directives

  proxy_cache_path /path/to/cache levels=1:2 keys_zone=mycache;

  geo $bypass_by_ip {
    default   0;
    127.0.0.1 1;
  }

  server {
    # other server directives

    location / {
      proxy_cache mycache;
      proxy_cache_valid any 2m;
      proxy_cache_use_stale timeout updating;
      proxy_cache_bypass $bypass_by_ip;

      proxy_pass ...;
    }
  }
}

proxy_cache_bypass делает прямой запрос, минуя кеш. Это контролируется его аргументом (ами) - если какой-либо из них не является пустой строкой или 0. Я использую geo чтобы предоставить такое значение (0 по умолчанию и 1, когда удаленный IP-адрес 127.0.0.1)

НОТА вам нужен Nginx версии 1.0.4 по крайней мере для работы этой конфигурации. В более ранних версиях была ошибка proxy_cache_bypass / proxy_cache_nocache логика.