Допустим, моему бэкэнду требуется ужасно 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
логика.