2009-02-12 14 views
17

Mi chiedo se qualcuno abbia plug-in o ricette capistrano che "pre-riscaldano" la cache della pagina per un'app per rails creando tutto il codice html memorizzato nella cache nel momento in cui viene eseguita la distribuzione o localmente prima che avvenga la distribuzione."Warm Up Cache" sull'implementazione

Ho alcuni siti per lo più statici che non cambiano molto e funzionerebbero più velocemente se l'html fosse già stato scritto, invece di richiedere che un visitatore colpisca il sito.

Piuttosto che crearlo da solo (sembra facile ma è la priorità di lowwwww) esiste già?

risposta

1

Ho impostato test di integrazione che confermano tutte le aree principali del sito disponibili (alcune centinaia di pagine in totale). Non fanno nulla che cambi i dati - basta tirare indietro le pagine e i moduli.

Attualmente non li eseguo quando distribuisco la mia istanza di produzione, ma ora ne parli: potrebbe essere effettivamente una buona idea.

Un'altra alternativa sarebbe quella di tirare ogni pagina che appare nella tua Sitemap (se ne hai una, che probabilmente dovresti). Dovrebbe essere davvero facile scrivere uno script gem/rake che lo faccia.

18

È possibile utilizzare wget o un altro programma per spider il sito. In effetti, questo tipo di scenario è menzionato come uno degli usi nella sua pagina di manuale:

Questa opzione indica a Wget di eliminare ogni singolo file scaricato, dopo averlo fatto. E 'utile per prelettura pagine popolari attraverso un proxy, per es .:

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

L'opzione -r è quella di recuperare in modo ricorsivo, e -nd di non creare directory.

+0

Sì, abbiamo alcune richieste di arricciatura nel nostro script di distribuzione, solo per riscaldare la cache, ma anche solo per ottenere il server attivo e in esecuzione (ad es. la prima richiesta a nginx + passenger può richiedere 40 secondi circa) – tardate

2

Il precaricamento in questo modo, in genere, con un cron job che inizia alle 10pm Pacific e termina alle 6:00 Eastern time, è un buon modo per bilanciare il carico del sito.

Verificare il spider_test rails plugin per un modo semplice per farlo in fase di test.

Se si intende utilizzare il wget sopra, aggiungere le opzioni --level =, --no-parent, --wait = SECONDS e --waitretry = SECONDS per limitare il carico, e si potrebbe anche registrare e catturare le risposte di intestazione per la diagnosi o di analisi (modificare il percorso da/tmp se lo si desidera):

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

io uso un compito rastrello che assomiglia a questo per aggiornare la mia pagina memorizzata nella cache del sito ogni notte:

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

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

+0

Preferisco questo approccio utilizzando le guide. Ad esempio, in generale, disattivo wget come client per tutte le mie pagine a causa di scraping di pagine non valide. – dc10

+0

Non sono sicuro di quale versione di rails abbia introdotto la modifica, ma su rails 4.2 Ho bisogno di 'require 'action_dispatch/testing/integration'' e quindi di inizializzare con' app = ActionDispatch :: Integration :: Session.new Rails.application' – andialles