2015-05-26 2 views
1

У меня возникают ошибки из инструментария страниц в Google, в котором указано, что срок действия кеша не указан для моих активов.Установка истечения срока действия кэша активов в Rails/Cloudfront/Heroku

Я подаю утверждает через CloudFront, и мой сайт (Ruby на Rails) размещается на Heroku

https://www.driverhunt.com/…9a42dc64767309bbb76af8a1eaef10b3c0cb.css (expiration not specified) 
https://www.driverhunt.com/…74901ff9e954e9fca26f71542e8fc8d807684.js (expiration not specified) 
https://www.driverhunt.com/…ad7b9e065ed95559bdf1c426bc94834f09e0.jpg (expiration not specified) 

Во-первых, это выглядит как вещи не обслуживается CloudFront. Второе:

Это проблема с облачным экраном, проблема с героем или проблема с рельсами? Может ли он быть решен программным путем, или мне нужно возиться с настройками heroku/cloudfront?

ответ

3

установите заголовок ответа

Чтобы включить браузер кэширование необходимо установить Cache-Control и заголовок Expires ответа.

Debugging кончик

Чтобы просмотреть существующие параметры кэша, используйте отладчик браузера. Для Chrome, в то время как на любой странице в приложении откройте отладчик и посмотрите:

enter image description here

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


Настройка заголовков ответа

Если у вас есть доступ к серверу конфигурационных файлов, устанавливающих кэширование на Linux под управлением Apache или Nginx просто. Но мой опыт показывает, что Heroku не позволяет вам напрямую изменять конфигурационные файлы сервера.

без возможности изменять .htaccess или nginx.conf на сервере у вас есть 2 варианта:

1- Реализовать кэширование для приложения рельсов на уровне контроллера, например:

def show 
    @company = Company.find(params[:id]) 
    expires_in 3.minutes, :public => true 
    # ... 
end 

Это, по общему признанию, отвратительное решение.

2- Другой вариант Heroku предлагает HTTP-кеширование с использованием Rack :: Cache (надстройка Memcachier Heroku). У меня нет опыта в этом, поэтому никаких комментариев.

Заключение

Heroku обеспечивает прекрасную и простую среду Deploy, но предложить что простота, они заперли вниз конфигурацию. Я использовал Heroku для разработки и развертывания приложения в тестовом режиме, но перешел на VPS, где я мог бы реализовать оптимизацию на стороне сервера, например, кэширование для запуска приложения.

P.S. Чтобы ответить на часть CDN вопроса: так как ваш сервер устанавливает заголовки ответов, я не думаю, что конфигурация CDN влияет на кеширование.

+0

Спасибо, это красиво написанный ответ. –

+1

Добро пожаловать. Помогло ли это? – Elvn

+1

Абсолютно! Задача решена. Извините, что я не могу дать вам больше очков! –

0

Ваши активы обслуживаются через ваше приложение для рельсов. Соответствующий параметр config.action_controller.asset_host, который должен быть установлен, чтобы указать на распределение CloudFront, например

config.action_controller.asset_host = '//d123467890.cloudfront.net' 

Это предполагает, что ваш дистрибутив CloudFront уже настроен для обслуживания активов (например, из ведра населенного asset_sync)

+0

Спасибо Фридриху! –

+0

Я уже использую: 'config.action_controller.asset_host =" https: // # {ENV ['CLOUDFRONT_SUBDOMAIN']} .cloudfront.net " ' –

Смежные вопросы