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

Кеш Nginx - пройти через cache-control: max-age, но кешировать дольше

У меня есть исходный сервер за прокси-сервером 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