Что может привести к прекращению работы кэширования страниц Rails? - PullRequest
2 голосов
/ 02 июня 2009

У меня есть приложение Rails, которое остановило кэширование где-то по пути, и я не уверен, какая ревизия по пути могла бы остановить его работу.

У меня сложилось впечатление, что при правильной работе кэширование страниц никогда не должно попадать в Rails, если он находит кэшированный файл. Однако при загрузке моей страницы и мониторинге production.log он попадает как в Rails, так и в DB.

У меня настроена подметальная машина, которая очищает кэш: create,: update и: destroy. Он работает нормально, так как файл /public/cache/index.html обновляется всякий раз, когда происходит одно из этих событий. Сначала я подумал, что это может быть из-за того, что я использовал плагин OutputCompression, но удаление, которое имело тот же результат, поэтому я его снова вставил. Index.html есть, но .htaccess и Rails игнорируют его и перестраивают всю страницу включая переписывание кэшированного index.html.

Вот соответствующие части кода (если я что-то упустил):

Контроллер:

class SecretsController < ApplicationController
  caches_page :index
  cache_sweeper :secret_sweeper, :only => [:create, :update, :destroy]

  # snipped
end

.htaccess:

RewriteEngine On

# Rewrite index to check for cached
RewriteRule ^/$ /cache/index.html [QSA]
RewriteRule ^$ /cache/index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

Заголовки ответа Firebug

Date: Tue, 02 Jun 2009 18:50:36 GMT
Server: Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 PHP/5.2.9 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.8b
Vary: Accept-Encoding
X-Runtime: 0.05637
Etag: "4f3497a74141d1e92ae7a1fe4d5dc1d2"
Cache-Control: private, max-age=0, must-revalidate
Content-Encoding: gzip
Content-Length: 22356
Connection: close
Content-Type: text/html; charset=utf-8
default-style: tms

Я бы хотел иметь возможность использовать mod_gzip, но ASmallOrange не поддерживает его, в то время как DreamHost (до того, как они утроили мою цену).

В любом случае, кто-нибудь может пролить свет на то, почему Rails игнорирует кэшированный index.html? Я предполагаю, что это что-то в .htaccess, так как он никогда не должен касаться Rails, если он работает правильно.

EDIT : проблема с кэшированием оказалась первой косой чертой в RewriteRules. Кэшированный файл не находился, пока я не изменил их оба на «cache / index.html», и теперь кеширование работает отлично.

Однако теперь мне нужно удалить вызовы OutputCompression, потому что он возвращает версию файла в сжатом формате с Content-Type, установленным в «text / html». Есть идеи, как заставить его отправлять правильный тип контента только для этого файла? Это единственный кеш во всем приложении.

ВНОВЬ РЕДАКТИРОВАТЬ : Изменение .htaccess на это не помогло с проблемой gzip:

RewriteRule ^/$ cache/index.html [QSA,T=application/x-gzip]
RewriteRule ^$ cache/index.html [QSA,T=application/x-gzip]

Он по-прежнему отображается как текстовое представление файла zip (т. Е. Gibberish), если сжатие не отключено. Кэширование работает отлично, хотя.

Ответы [ 3 ]

1 голос
/ 05 июля 2009

Зачем использовать плагин OutputCompression? Apache может сделать это для вас. Проверьте mod_deflate .

Вот правила, которые я использую:

# Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-java
script
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

Это сжимает весь текстовый вывод из вашего приложения, статический и динамический.

Просто предположение, но я думаю, что это тоже быстрее, поскольку это модуль Apache, написанный на C.

0 голосов
/ 20 августа 2009

Наконец-то выяснили проблему (и), и мой сайт снова заработал после 10 недель простоя. Получив его для загрузки файла кэша, я обнаружил еще одну проблему, заключающуюся в том, что плагин OutputCompression сжимал файл в файл .gz, но Rails сохранял его как .html, а Apache использовал его как text / html, что привело к на тарабарщине.

Исправления, которые решили мою проблему:

В .htaccess:

AddEncoding x-gzip .gz
AddType text/html .gz

RewriteRule ^/$ cache/index.gz [QSA]
RewriteRule ^$ cache/index.gz [QSA]

В config / environment.rb:

ActionController::Base.page_cache_extension = ".gz"

В коде Ruby директива caches сохраняется как «cache / index.gz» вместо «cache / index.html». AddEncoding говорит, что он не должен служить html, но сам по себе будет просто отображать источник страницы, так как по умолчанию используется Content-Type типа «text / plain». AddType меняет все так, что файлы .gz обслуживаются как «text / html», вызывая правильное отображение.

Это, вероятно, не будет работать для всех, но, поскольку я нигде не размещаю файлы .gz на сайте, а главная страница является единственной в кэше, это прекрасно работает для меня.

Спасибо всем за помощь.

0 голосов
/ 03 июня 2009

Я бы проверил вашу конфигурацию ETag. Это часто может помешать правильному кэшированию файлов, если вы используете несколько веб-серверов и не настроены на независимость от компьютера, который обслуживает файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...