何が起こっているかというと、アプリケーションおよび/または ApplicationSpawners がタイムアウトのためにシャットダウンしています。新しいリクエストを処理するために、Passenger はアプリケーションの新しいコピーを起動する必要があります。高速なマシンでも数秒かかることがあります。この問題を解決するために、アプリケーションを存続させるために使用できる Apache 構成オプションがいくつかあります。
これは、サーバーで具体的に行ったことです。PassengerSpawnMethod と PassengerMaxPreloaderIdleTime は、状況で最も重要な構成オプションです。
# 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
「スマート」スポーン モードを使用し、PassengerMaxPreloaderIdleTime をオフにすることで、Passenger はアプリケーションの 1 つのコピーを常にメモリに保持します (Apache 起動後の最初のリクエストの後)。個々Application
のリスナーはfork
このコピーから作成されます。これは非常に安価な操作です。アプリケーションがリスナーを生成する必要があったかどうかを判断できないほど迅速に発生します。
アプリがスマート スポーンと互換性がない場合は、大きな PassengerPoolIdleTime を保持し、curl と cronjob または monit などを使用して定期的にサイトにアクセスして、リスナーが確実に存続するようにすることをお勧めします。
Passenger User Guideは、これらおよびその他の構成オプションの優れたリファレンスです。
編集: アプリがスマート スポーンと互換性がない場合、非常に便利な新しいオプションがいくつかあります
# 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
したがって、PassengerPreStart と PassengerMinInstances を組み合わせると、Passenger は apache のロード直後に 3 つのインスタンスを起動し、常に少なくとも 3 つのインスタンスを維持するため、ユーザーに遅延が発生することはほとんどありません (あったとしても)。
PassengerMaxPreloaderIdleTime 0
または、既にスマート スポーン (推奨) を使用している場合は、追加PassengerPreStart
して即時起動の追加の利点を得ることができます。
Phusion.nlのヒーローたちに感謝します!