2009-05-12 39 views
84

Phusion Passengerのバンドワゴンに乗るために、小さなレールアプリをテストするためのステージングサーバーをセットアップしました。Phusion PassengerとRailsを使用したときのサーバーの初期起動が遅い

これまでのところ、とても使いやすく、アプリのインストールや設定、配備が簡単です。問題は、使用しているサイトが頻繁にヒットしないため、バックグラウンドでサーバーをシャットダウンするように見えることです。つまり、誰かがサイトに行くと、リクエストを処理するために新しいサーバーを起動するまで待っているという意味です。私たちはドキュメントを読んで、かなり異なるセットアップ(スマート/スマート-v2モード、パッセンジャイタイムなど)を試みましたが、まだ実際の解決策を見つけていませんでした。

Googleの検索結果を調べてみると、本当に役に立つ情報は見つけられません。現在、我々は、サーバを稼働させようとするときに、頻繁にリクエストを行うcronジョブを持っています。

この問題が発生している人はいませんか?修正のアドバイスはありますか?

+0

このナゲットは、Passenger Doc Si​​teでも見つかりました:http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPreStart – dewrich

+0

@dewrichツールを見つけました(http://wekkars.com )それはあなたのcronjobがやっていることを正確に行います – SteenhouwerD

答えて

114

何が起こっているかは、タイムアウトのためにアプリケーションおよび/またはApplicationSpawnerがシャットダウンしていることです。新しいリクエストを処理するために、Passengerはアプリケーションの新しいコピーを起動する必要があります。高速なマシンであっても数秒かかることがあります。この問題を解決するには、アプリケーションを有効に保つために使用できるApache設定オプションがいくつかあります。

具体的には、自分のサーバーで行ったことです。 PassengerSpawnMethodとPassengerMaxPreloaderIdleTimeは、自分の状況で最も重要な構成オプションです。 「スマート」産卵モードを使用して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 

、乗客は(Apacheの起動後の最初のリクエストの後に)常時メモリ内のアプリケーションの1つのコピーを保持します。個々のApplicationリスナーはこのコピーからforkになります。これは超安価な操作です。アプリケーションが非常に迅速にリスナーを生成しなければならないかどうかはわかりません。

あなたのアプリがスマートなスポーンと互換性がない場合は、大きなPassengerPoolIdleTimeを維持し、定期的にcurlとcronjobまたはmonitなどを使用してリスナーが生き続けるようにすることをおすすめします。

Passenger User Guideは、これらの設定オプションとその他の設定オプションの素晴らしいリファレンスです。

編集: あなたのアプリは、スマート産卵と互換性がない場合、あなたはPassengerPreStartとPassengerMinInstancesを組み合わせた場合、

# 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 

だから、非常にいいです、いくつかの新しいオプションがあり、旅客は3をスピンアップしますインスタンスがApacheの読み込み直後に実行され、少なくとも3つのインスタンスが常に保持されるため、ユーザーには遅延はほとんど見られません。

スマートスポーン(推奨)をPassengerMaxPreloaderIdleTime 0で既に使用している場合は、PassengerPreStartを追加すると、すぐに起動するという追加の利点が得られます。

ヒーローに感謝します。phusion.nl

+0

ありがとう、あなたの答えをありがとう。私は、これらの設定の大部分を試したと思いますが、正しい組み合わせではない可能性があります。私は明日テストを受け、元に戻す。 – tsdbrown

+0

これは素晴らしいです。私はNginx/Phusion Passengerのインストールと同じ問題を抱えていましたが、これは私を大いに助けました。 –

+0

私はこの設定を試しても性能は向上していませんが、私たちのアプリはRMagickを使用しています。このための回避策はありますか?なぜRMagickでは動作しませんか? –

1

あなたのホストが私のような共有サーバーの場合、設定を変更することはできず、cronジョブが残っています。

+0

ありがたいことに、この特定のアプリケーションではそうではありません。しかし、私は将来のおかげでそれを心に留めておきます。 – tsdbrown

2

RE:追加すると便利かもしれません

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up 
# the creation of new RailsAppSpawners. This isn't necessary if you're 
# only running one or 2 applications, or if your applications use 
# different versions of Rails. 
RailsFrameworkSpawnerIdleTime 0 

だけで何か。

現在のリリース のデフォルトのスポーン方法は非常にフレームワークの産卵タイムアウトは、明示的に「スマートスポーン方法を設定 とにかくない限り影響を与えないだろう を設定し、フレームワークの産卵をスキップする「スマート・LV2」であり、 "

出典: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1

38

が、この質問時につまずく任意のnginxのサーバーのユーザーがあり、両方とも「PassengerMaxRequests」と「PassengerStatThrottleRate」ディレクティブは、nginxのに翻訳しないだけで包み。しかし、他の人は:

rails_spawn_method smart; 
rails_app_spawner_idle_time 0; 
rails_framework_spawner_idle_time 0; 
passenger_pool_idle_time 1000; 

HTH!

EDIT rails_spawn_methodではなく

passenger_spawn_method smart; 

他のすべては、日付までちょうど良いです使い乗客3 に廃止されました。

+7

ありがとうございます。注意すべき点は、レールが有効になっていた特定のサイト設定だけでなく、メインのnginx.confにpassenger_pool_idle_timeを他のグローバル設定で埋めなければならないことでした。 –

+0

しかし、乗客4のエラー:passenger_max_preloader_idle_timeディレクティブが重複しています – TangMonk

4

またPassengerMinInstancesを使用することができます。

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstances

これはPassengerPreStart

+0

ドキュメントから:「このオプションをゼロ以外の値に設定すると、Webサイトが拡張された状態でアイドル状態になってから起動時間が長くなることを避けます期間。" OPの質問に対する完璧な答えのようだ。 – Chuck

0

と組み合わせることができる乗客のバージョンを確認してください。古いバージョンのRailsS​​pawnMethod <string>でした。

もしそうなら(私の記憶が正しければ)、すべての設定ディレクティブでのRailsと旅客を交換するか、詳細

1

の古い乗客のドキュメントを探して、私もこの問題を抱えていたが、私は乗客の設定を変更することができませんでしたこのファイルへの書き込み権限がないためです。私は速く応答してくれるツール(http://www.wekkars.com)を見つけました。たぶんこれもあなたのための解決策になるかもしれません。

関連する問題