1. ホーム
  2. ruby-on-rails

[解決済み] Phusion PassengerとRailsを使用した場合のサーバーの初期起動が遅い

2023-04-17 21:02:13

質問

Phusion Passengerのバンドワゴンに乗るために、私たちは小さなRailsアプリのステージングサーバをセットアップしてテストしています。

これまでのところ、Phusion Passenger は非常に使い勝手がよく、アプリのインストールや設定、デプロイを簡単に行うことができます。問題は、私たちが使用しているサイトがあまり頻繁にヒットせず、バックグラウンドでサーバーをシャットダウンしているように見えることです。つまり、誰かがサイトにアクセスすると、リクエストを処理するために新しいサーバーを立ち上げるまで、非常に長い待ち時間が発生します。ドキュメントを読み、かなり多くの異なるセットアップ (smart/smart-lv2 モード、passengeridletime など) を試しましたが、まだ真の解決策は見つかっていません。

Google の検索結果を徹底的に調べた後、有用な情報を見つけることができません。現在、サーバーを稼働させ続けるために、頻繁にリクエストを行う cron ジョブがあります。

他にこの問題を経験している人はいますか、また、修正のためのアドバイスはありますか。

どのように解決するのですか?

アプリケーションまたは ApplicationSpawner がタイムアウトでシャットダウンしていることが原因です。新しいリクエストを処理するために、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

smart"スポーンモードを使用し、PassengerMaxPreloaderIdleTimeをオフにすることで、Passengerは常に(Apache起動後の最初のリクエスト以降)メモリ内にアプリケーションのコピーを1つ保持します。個々の Application リスナーは fork リスナーはこのコピーから生成されます。これは超安価な操作です。これは超安全な操作で、アプリケーションがリスナーを生成しなければならないかどうかがわからないほど素早く行われます。

アプリケーションがスマート・スポーンに対応していない場合は、大きな PassengerPoolIdleTime を維持し、curl と cronjob または monit を使用して定期的にサイトにアクセスし、リスナーが生存していることを確認することをお勧めします。

その Passenger ユーザー ガイド は、これらの設定オプションやその他の設定オプションに関する素晴らしいリファレンスです。

編集 : もしあなたのアプリがスマート・スポーンに対応していない場合、いくつかの方法があります。 新しいオプションがあります。 があります。

# 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 !