2009-02-12 5 views
17

Ich frage mich, ob jemand irgendwelche Plugins oder Capistrano Rezepte hat, die den Seiten-Cache für eine Rails-App "vorheizen", indem alle Seiten zwischengespeicherten HTML zum Zeitpunkt der Bereitstellung erstellt werden oder lokal vor der Bereitstellung."Warm Up Cache" im Einsatz

Ich habe einige meist statische Seiten, die nicht viel ändern, und würde schneller laufen, wenn der HTML-Code bereits geschrieben wurde, anstatt dass ein Besucher die Website zu treffen.

Anstatt diese selbst zu erstellen (scheint einfach, aber es lowwwww Priorität) existiert es bereits?

Antwort

1

Ich habe Integrationstests festgelegt, die bestätigen, dass alle Hauptbereiche der Website verfügbar sind (insgesamt einige hundert Seiten). Sie tun nichts, was Daten verändert - ziehen Sie einfach die Seiten und Formulare zurück.

Ich führe sie derzeit nicht aus, wenn ich meine Produktionsinstanz ausliege, aber jetzt erwähnst du es - es könnte tatsächlich eine gute Idee sein.

Eine andere Alternative wäre, jede Seite, die in Ihrer Sitemap erscheint (wenn Sie eine haben, die Sie wahrscheinlich sollten) zu ziehen. Es sollte wirklich einfach sein, ein Gem/Rake-Skript zu schreiben, das das tut.

18

Sie könnten wget oder ein anderes Programm verwenden, um die Site zu spidern. In der Tat wird diese Art von Szenario als eine der Verwendungen auf ihrer Manpage erwähnt:

Diese Option weist Wget an, jede einzelne heruntergeladene Datei zu löschen, nachdem dies geschehen ist. Es ist nützlich für Prefetching beliebten Seiten über einen Proxy, z.B .:

wget -r -nd --delete-after http://whatever.com/~popular/page/ 

Die Option -r rekursiv abzurufen, und -nd nicht Verzeichnisse zu erstellen.

+0

Ja, wir haben ein paar Curl-Anfragen in unserem Deployment-Skript, nicht nur um den Cache zu erwärmen, sondern auch, um den Server hochzufahren und laufen zu lassen (z.B. erste Anfrage an nginx + Passagier kann 40sec oder so nehmen) – tardate

2

Das Preloading auf diese Weise - im Allgemeinen mit einem Cron-Job, der um 22:00 Uhr Pacific beginnt und um 6:00 Uhr Eastern Time endet - ist eine gute Möglichkeit, Ihre Website zu verteilen.

Überprüfen Sie die spider_test rails plugin für eine einfache Möglichkeit, dies beim Testen zu tun.

Wenn Sie das obige wget verwenden möchten, fügen Sie die Optionen --level =, --no-parent, --wait = SECONDS und --waitretry = SECONDS hinzu, um Ihre Last zu drosseln protokollieren und die Header-Antworten für die Diagnose oder Analyse erfassen (den Weg von/tmp ändern, falls gewünscht):

wget -r --level=5 --no-parent --delete-after \ 
    --wait=2 --waitretry=10 \ 
    --server-response  \ 
    --append-output=/tmp/spidering-`date "+%Y%m%d"`.log 
    'http://whatever.com/~popular/page/' 
4

ich eine Harke Aufgabe verwenden, die meine Seite so aussieht Sitemap jede Nacht im Cache gespeichert zu aktualisieren:

require 'action_controller/integration' 
ActionController::Base::expire_page("/sitemap.xml") 
app = ActionController::Integration::Session.new 
app.host = "notexample.com" 
app.get("/sitemap.xml") 

Siehe http://gist.github.com/122738

+0

Ich bevorzuge diesen Ansatz mit Schienen. Zum Beispiel im Allgemeinen deaktivieren ich wget als Client für alle meine Seiten aufgrund von Rogue-Seiten-Scraping. – dc10

+0

Ich bin nicht sicher, welche Rails-Version die Änderung eingeführt hat, aber auf Rails 4.2 muss ich "action_dispatch/testing/integration" anfordern und dann mit "app = ActionDispatch :: Integration :: Session.new Rails.application" initialisieren – andialles