Как безопасно использовать кэширование CDN на хостинге Firebase, если сервер вашего приложения размещен в другом облачном сервисе

#firebase #caching #cdn #firebase-hosting #google-cloud-run

#firebase #кэширование #cdn #firebase-хостинг #google-cloud-run

Вопрос:

Я уже давно кэширую свои статические ресурсы, такие как: css, изображения, js-файлы и т.д. Поскольку все эти файлы получают идентификаторы хэша содержимого в моем процессе сборки, вот как я обрабатываю их с точки зрения кэша:

 // STATIC FILES LIKE IMAGES, FONTS, CSS AND JS

Cache-Control: "public,max-age=31536000"
 

Таким образом, я получаю кэш клиента и CDN на срок до года, и это здорово. Все работает нормально.

Но мое веб-приложение — это одностраничное приложение React, поэтому всякий раз, когда я его обновляю, единственный index.html файл, который мои пользователи получили из моего приложения, автоматически становится устаревшим и бесполезным, потому что он указывает на старые статические JS-файлы, которые все сейчас обновлены.

Так что в принципе я не могу позволить им зачерстветь index.html , несмотря ни на что.

Я также хотел бы получить преимущества от кэша CDN для этого файла. И вот тут-то все может стать сложнее.

Прямо сейчас, на всякий случай, вот что я делаю:

 // For index.html

Cache-Control: "no-cache, no-store, must-revalidate"
 

Я подумывал о том, чтобы сменить его на:

 // FOR index.html

Cache-Control: "max-age=0, s-maxage=86400, must-revalidate"
 

Таким образом, я получил бы кэш CDN на 1 день, что было бы неплохо. Но я все равно не хочу рисковать и подавать несвежее index.html .

Вот что говорит об этом Firebase Hosting:

Любой запрошенный статический контент автоматически кэшируется в CDN. При повторном развертывании содержимого вашего сайта Firebase Hosting автоматически очищает весь ваш кэшированный статический контент в CDN до следующего запроса.

введите описание изображения здесь

Но проблема в том, что мой сервер размещен в облаке. И Firebase размещает практически rewrites каждый запрос к нему. Что-то вроде:

firebase.json

 "rewrites": [
  {
    "source": "**",
    "run": {
      "serviceId": "server",
      "region": "uscentral-1"
    }
  }
]
 

Итак, всякий раз, когда я обновляю свое приложение, я повторно развертываю его в Cloud Run, но я не запускаю новую firebase deploy --only hosting команду. Потому что в моем firebase.json файле ничего не меняется между новыми развертываниями кода облачного запуска.


ВОПРОС

Безопасно ли добавлять s-maxage=86400 заголовок в этой ситуации?

Предположение, что новое развертывание в облаке не приведет к очистке кэша CDN. Могу ли я что-нибудь сделать, чтобы вызвать это? Нравится какая firebase deploy --only hosting:clear-cdn -то команда?

Потому что, даже если я firebase deploy --only hosting снова запущу, я не совсем уверен, что кэшированные файлы будут удалены, потому что моя /public папка хостинга Firebase всегда является пустой папкой. Таким образом, хостинг Firebase может «почувствовать», что ничего не изменилось.

Ответ №1:

После дня тестирования вот результаты:

Если вы зададите Cache-Control заголовки, которые позволят использовать совместное кэширование (CDN), например public или no-cache , ваши ответы будут кэшироваться как в браузере клиента, так и в кэшировании CDN.

  • При повторном развертывании в Cloud Run будет ли автоматически очищен кэш CDN?

Нет. При обновлении и повторном развертывании файлов вашего приложения в Cloud Run эти кэшированные файлы на CDN будут устаревшими и не будут автоматически удалены из CDN. Поэтому, даже если ничего не изменилось в отношении хостинга Firebase, вам нужно запустить firebase deploy --only hosting снова. Это заставит CDN очистить все ваши кэшированные файлы, и новые запросы сразу начнут получать свежие данные.

  • Я не совсем уверен, что кэшированные файлы будут удалены, потому что моя папка Firebase Hosting / public всегда является пустой папкой. Таким образом, хостинг Firebase может «почувствовать», что ничего не изменилось.

Даже если в вашей папке хостинга Firebase ничего public не изменилось (в моем случае это пустая папка) и в вашей ничего firebase.json не изменилось, он все равно создаст новую версию Firebase Hosting и очистит ваши кэшированные файлы из CDN, как сказано в документе:

Любой запрошенный статический контент автоматически кэшируется в CDN. При повторном развертывании содержимого вашего сайта Firebase Hosting автоматически очищает весь ваш кэшированный статический контент в CDN до следующего запроса.

Внимание на динамический контент

Например, если у вас есть динамический контент, который вы будете редактировать через пользовательский интерфейс администратора. Имейте в виду, что кэш CDN будет хранить устаревший кэш этого содержимого до истечения срока его действия.

Например: кэширование CDN /blog/some-post с s-maxage of 1 day помощью . Даже если вы динамически измените содержимое своего сообщения, CDN будет сохранять CDN в течение 1 полного дня, пока не истечет срок его действия и он не будет запрошен снова.