Использование хэшированных активов с CDN в развертывании Rails - PullRequest
0 голосов
/ 04 мая 2018

Мы работаем с сайтом Rails 5.1, который использует конвейер активов для создания хэшированных (отпечатанных) активов при развертывании. Для оптимизации производительности наши активы генерируются с серверов и затем кэшируются в AWS Cloudfront при первом запросе.

Когда мы разворачиваемся, мы делаем последовательное развертывание. Мы запускаем новые серверы с новым кодом и завершаем работу со старым кодом, когда новые приходят в онлайн. В любой момент во время развертывания, если поступает запрос на актив, любой из серверов (новых или старых) может ответить на запрос, поскольку все они находятся на одном и том же балансировщике нагрузки приложений AWS.

Например, у нас есть два файла активов:

  • admin-2d1d6c00a49c.js (генерируется из старого коммита)
  • admin-aac83de85860.js (создается при развертывании из нового коммита)

Если поступит запрос для admin-aac83de85860.js, и более старый сервер примет запрос, он не найдет ресурс, вернет 400, а затем этот кэш ответа. Это означает, что все будущие запросы для admin-aac83de85860.js возвращают 400, даже если файл есть на новых серверах.

Как мы можем либо кэшировать оба набора ресурсов в AWS Cloudfront, либо направлять трафик только для новых активов на новые серверы, добавляемые в пул?

1 Ответ

0 голосов
/ 23 августа 2018

Мне удалось решить эту проблему, развернув наши активы на S3. После запуска rails assets:precompile скопируйте public/assets и public/packs в S3. Затем вы можете настроить исходную точку своего облачного фронта в качестве корзины s3, в которую вы помещаете свои активы.

Когда вы выполняете развертывание по мере продвижения, на вашем CDN будут доступны как admin-2d1d6c00a49c.js, так и admin-aac83de85860.js.

См .: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html#concept_S3Origin

...