Rails caches_page на героку с настраиваемым поддоменом? - PullRequest
1 голос
/ 29 ноября 2011

Можно ли заставить веб-сервер herokus выполнять кэширование на всю страницу с уникальным ключом на поддомене (возможно, с использованием промежуточного программного обеспечения стойки)?

т.

class MyController < ApplicationController
  caches_page :index

  def index
    @content = MyObject.find(request.subdomain)
    ...

subdomain1.myapp.com  >  <cachedir>/subdomain1/index.html
subdomain2.myapp.com  >  <cachedir>/subdomain2/index.html

Следующие методы требуют переписать доступ к nginx, который, кажется, не настраивается на heroku:
http://www.agileproductions.com/blog_posts/16-Page-Caching-by-Subdomain-in-Rails-and-Nginx
https://github.com/yeah/page_cache_fu

1 Ответ

2 голосов
/ 11 октября 2012

Кэширование страниц в Heroku не является хорошим вариантом, как описано в статье Стратегии кэширования для Rails :

Встроенное в Rails кэширование страниц работает путем создания файла в файле. система. В Heroku есть эфемерное хранилище файлов, поэтому при кэшировании страниц кажется, работает, это не будет работать, как задумано. Вы должны вместо этого использовать кэширование действий или фрагментов, или, альтернативно, использование Rack :: Cache в качестве обратный прокси-сервер, чтобы вообще избежать запросов к вашим приложениям.

Вместо этого лучше всего использовать Rack :: Cache с хранилищем кеша, которое совместно используется dynos. Например, вы могли бы использовать один из дополнений к Hercu memcache или AWS ElastiCache , среди других вариантов. Rack :: Cache легко запустить на Heroku; смотрите Использование Rack :: Cache с Memcached в Rails 3.1 + .

Вместо того чтобы сказать caches_page для записи страницы в файловую систему, вы зададите желаемое поведение кэширования в заголовках HTTP с помощью таких методов, как expires_in. Обратите внимание, что эти заголовки не только влияют на ваш кеш, они также влияют на кеш браузера.

«Но подождите», спросите вы, «как мне истечь срок действия страницы из Rack :: Cache, если она также может храниться в браузере пользователя?» Ответ: нет. Вместо этого, разработайте кэширование, чтобы использовать преимущества условных значений GET . В любом случае повторная проверка часто проще, чем ручное истечение срока действия страниц.

Rack :: Cache - это обычный HTTP-кеш, который вы размещаете между кешем браузера пользователя и вашим веб-приложением. См. Кеши вещей для более тщательного рассмотрения того, что это может означать. Хорошей новостью является то, что как только вы правильно настроите кэширование, оно будет работать на стороне сервера и на стороне клиента. Ваше приложение будет хорошо работать с кеширующими прокси, и вы даже можете добавить CloudFront или другой CDN - в конце концов, ваше кеширование полностью описано стандартными заголовками HTTP.

Rack :: Cache по умолчанию включает заголовок HTTP Host: в ключ кеша, поэтому поддомены обрабатываются автоматически. После того, как вы настроитесь на Heroku, все, что вам нужно сделать, это сказать expires_in 30.minutes, :public => true.

...