У меня есть исходный сервер за прокси-сервером nginx в контейнере с CDN впереди.
Я хочу, чтобы мои HTML-страницы кешировались в CDN в течение 1 минуты, поэтому я установил cache-control: public
и cache-control: max-age=60
заголовки на их ответы. Очевидно, что при каждом промахе кеша CDN полностью переходит к исходному серверу для повторного рендеринга страницы.
Теперь исходный сервер и экземпляр nginx находятся в одном контейнере. Я бы хотел, чтобы nginx кешировал любой ответ исходного сервера с cache-control: public
заголовок намного дольше 1 минуты - в основном бесконечно. Это потому, что я знаю, что пока контейнер существует, исходный сервер будет иметь одну и ту же версию, и ответ будет таким же.
CDN, конечно, не знает этого, он просто попадает в URL-адрес, и поэтому максимальный возраст составляет всего минуту - при новом развертывании я хочу, чтобы новый контент был обновлен в CDN в течение минуты - но это ' Было бы здорово иметь nginx в качестве кеша перед исходным сервером, чтобы исходному серверу не приходилось повторно отображать одну и ту же страницу при каждом промахе кеша CDN, если он действительно все еще работает с той же версией.
Есть ли элегантный способ настроить кеш nginx на что-то подобное? Т.е. игнорировать cache-control: max-age
заголовок и просто кэшировать на неопределенный срок, но передать этот заголовок, чтобы он был обработан CDN?
Используя что-то вроде proxy_ignore_headers Cache-Control
и proxy_cache_valid 200 1y
не будет работать, потому что я не хочу кэшировать каждую страницу, а только те, которые имеют cache-control: public
набор заголовков. Мне просто нужно, только для этих ответов, умножить max-age
на много или статически установить его как что-то действительно большое.
Это возможно? Я знаю, что это, вероятно, не та модель, которую предполагает nginx, поскольку его кеш является «эфемерным» и автоматически сдувается при повторном развертывании исходного сервера, но в настоящее время я могу придумать единственный хакерский способ сделать это - установить мой max-age
заголовки как 10000x на исходном сервере и переписать их как / 10000 перед пересылкой в CDN - я действительно надеялся, что будет лучший способ сделать это, чем это.
Пусть серверная часть установит заголовок «X-Accel-Expires» на очень высокое значение (например, 86400 = 1 день) и отключит этот заголовок перед отправкой ответа клиенту (вы никогда не знаете, что CDN «понимает» «X -Accel-Expires »).
Видеть документация proxy_cache