2009-06-02 2 views
2

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

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

У меня есть подметальная машина, которая очищает кеш: create,: update и: destroy. Он отлично работает, так как файл /public/cache/index.html обновляется всякий раз, когда происходит одно из этих событий. Сначала я подумал, что это может быть из-за того, что я использовал плагин OutputCompression, но удаление имело тот же результат, поэтому я снова его вернул. Индекс.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, потому что он возвращает версию файла gzipped с настройкой Content-Type на «text/html». Любая идея, как заставить его отправлять правильный тип контента только для этого файла? Это единственное, что кэшировано во всем приложении.

EDIT СНОВА: Изменение .htaccess, чтобы это не помогло с проблемой GZIP:

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

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

+0

Вы видите файл index.html, который должен был быть создан? –

+0

@fd: Да, как указано в третьем абзаце, он правильно создан в /public/cache/index.html. Если происходят события создания, обновления или уничтожения, этот файл стирается и заменяется вновь созданным, снова содержащим правильное содержимое. Когда я загружаю страницу, затем щелкните ссылку на тот же точный URL (база сайта), .htaccess должен использовать кешированную версию, но это не так. Я бы ожидал, что Ctrl + F5 заставит обновить (может быть), но это просто нажмите одну и ту же ссылку на главную страницу индекса дважды. –

+0

Довольно странно, RewriteRules выглядят убедительно для меня. Поэтому я по умолчанию рассматривал свои предположения. Правильно ли выбран .htaccess? Установлен и работает mod_rewrite? и т. д. Ofc, я бы ожидал, что ответы будут да, так как вы как-то попадаете в Rails, но я обычно вижу что-то интересное, бросая вызов тому, что, как я думаю, я знаю, что это правда о неисправной системе. –

ответ

0

Наконец выяснили проблему (ы), и мой сайт жить еще раз после 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] 

В конфигурации/environments.rb:

ActionController::Base.page_cache_extension = ".gz" 

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

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

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

0

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

+0

Это должен быть единственный веб-сервер на общем хостинге, и я слышал об ETags, но понятия не имею, что это такое и как их настроить. Любые указатели? –

1

Зачем нужен плагин 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

Это определенно сработало бы, если бы я не был на общем хостинге ASmallOrange, который отключил как mod_deflate, так и mod_gzip. OutputCompression делает то же самое и использует одно и то же процессорное время, поэтому я понятия не имею, почему они не смогут просто включить его. Спасибо за предложение. Если я смогу убедить их включить mod_deflate для меня, я буду использовать это. –

+0

О, облом. Это уменьшит их пропускную способность. Новый хостинг? ;) Возможно, вы захотите попробовать получить свое приложение на бесплатном уровне Heroku. Даже их самый низкий уровень оплаты примерно такой же, как и общий хостинг. –

+0

Спасибо за предложение. Просто обновлен в течение года, потому что мне нравится ASO, и я переписываю свое приложение в Django, чтобы я мог почистить мой Python (и, конечно же, изучить Django). Знаете ли вы о бесплатном хостинге для этого? –

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