Che cosa sta succedendo è che l'applicazione e/o ApplicationSpawners si chiudono a causa del timeout. Per elaborare la tua nuova richiesta, Passenger deve avviare una nuova copia della tua applicazione, che può richiedere diversi secondi, anche su una macchina veloce. Per risolvere il problema, ci sono alcune opzioni di configurazione di Apache che puoi usare per mantenere viva la tua Applicazione.
Ecco in particolare ciò che ho fatto sui miei server. PassengerSpawnMethod e PassengerMaxPreloaderIdleTime sono le opzioni di configurazione più importanti nella tua situazione.
# Speeds up spawn time tremendously -- if your app is compatible.
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart
# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000
# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0
# Just in case you're leaking memory, restart a listener
# after processing 5000 requests
PassengerMaxRequests 5000
Utilizzando la modalità di riproduzione "intelligente" e spegnendo PassengerMaxPreloaderIdleTime, Passeggero manterrà 1 copia della vostra applicazione nella memoria in ogni momento (dopo la prima richiesta dopo l'avvio di Apache). Gli ascoltatori singoli Application
saranno fork
da questa copia, che è un'operazione super-economica. Succede così rapidamente che non puoi dire se la tua applicazione ha dovuto generare un listener.
Se la tua app non è compatibile con lo spawn intelligente, ti consiglio di mantenere un PassengerPoolIdleTime di grandi dimensioni e di colpire periodicamente il tuo sito usando curl e un cronjob o monit o qualcosa per assicurare che l'ascoltatore rimanga in vita.
Il Passenger User Guide è un riferimento eccezionale per queste e più opzioni di configurazione.
modificare: Se la vostra applicazione non è compatibile con intelligente deposizione delle uova, ci sono alcune nuove opzioni che sono molto bello
# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled.
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/
# the minimum number of application instances that must be kept around whenever
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3
Quindi, se si combinano PassengerPreStart e PassengerMinInstances, Passeggero sarà spin up 3 istanze immediatamente dopo il caricamento di apache e manterranno sempre almeno 3 istanze in su, quindi gli utenti raramente (se mai) vedranno un ritardo.
Oppure, se si utilizza Smart spawning (consigliato) con PassengerMaxPreloaderIdleTime 0
, è possibile aggiungere PassengerPreStart
per ottenere il vantaggio aggiuntivo di avvio immediato.
Mille grazie agli eroi allo phusion.nl!
Ho trovato anche questo nugget sul sito Doc Passenger: http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPreStart – dewrich
@dewrich Ho trovato uno strumento (http://wekkars.com) che fa esattamente ciò che sta facendo il tuo cronjob – SteenhouwerD