Passengerでの設定
Rubyエージェントがアプリケーションをタイムアウトさせてしまい、サーバが起動できなくなることがあります。これはサーバの設定によって防ぐことができます。
Passengerの設定は、スタンドアロンモードでも、HTTPサーバ( Passenger + NGINX や Passenger + Apache)の組合せでも指定できます。
スタンドアロンモードでの標準的な設定方法は、次の3つから選択できます。
コマンドライン引数:
$ passenger start --start-timeout 100
環境変数:
$ env PASSENGER_START_TIMEOUT=100 passenger start
Passengerfile.json(アプリケーションディレクトリに配置):
{ "start_timeout": "100" }
設定の順序(優先順位の高い順):
コマンドライン引数
環境変数
Passengerfile.json
ファイル
注記
大規模なデプロイメントの場合は例外で、コマンドライン引数と環境変数の両方の設定は、アプリケーションで事前に設定された値で上書きされます。
PassengerをNGINXやApacheと組合わせる場合は、NGINXやApacheの設定ファイルを使用します。この場合、Passengerfile.json
は使用しません。
# example of an Nginx configuration file which also configures Passenger: server { server_name yourserver.com; root /var/www/myapp/code/public; passenger_enabled on; passenger_ruby /usr/bin/ruby2.0; passenger_sticky_sessions on; }
# example of an Apache configuration file which also configures Passenger: <VirtualHost *:80> ServerName yourserver.com DocumentRoot /var/www/myapp/code/public PassengerStickySessions on <Directory /var/www/myapp/code/public> Allow from all Options -MultiViews Require all granted </Directory> </VirtualHost>
タイムアウトの設定
最大リクエスト時間 - アプリケーションプロセスがリクエストを処理するのにかかる最大時間を秒単位で指定します。リクエストの処理にかかる時間がこの時間を超えた場合、アプリケーションプロセスは強制的にシャットダウンされ、次のリクエスト時に再起動されます。値が0の場合は、時間制限が無いことを意味します。これはPassengerエンタプライズ版のみ有効な設定です。
デフォルト値:0
コマンドライン:
$ passenger start --max-request-time SECONDS
環境変数:
Passengerfile.json
ファイル:{ "max_request_time": integer }
最大リクエストキュー時間 - 同時に処理されるリクエストが最大数に達すると、Passengerは全ての受信リクエストをキューに入れます。このオプションでは、リクエストがキューに保持される最大時間を指定します。キュー内のリクエストが指定された上限に達した場合、そのリクエストに対して「504 Gateway Timeout」エラーが返されます。値が0の場合は、キューの時間に制限が無いことを意味します。これはPassengerエンタプライズ版のみ有効な設定です。
デフォルト値:0
コマンドライン:
$ passenger start --max-request-queue-time NUMBER
環境変数:
PASSENGER_MAX_REQUEST_QUEUE_TIME=integer
Passengerfile.json
ファイル:{ "max_request_queue_time": integer }
プールのアイドル時間 - アプリケーションプロセスの最大アイドル時間です。指定された秒数を超えてもアプリケーションプロセスが何のトラフィックも受信しない場合、メモリを節約するためにアプリケーションプロセスをシャットダウンします。この値を0に設定すると、手動で停止するかクラッシュが発生しない限り、アプリケーションプロセスはシャットダウンされません。この値を小さくすると、アプリケーションプロセスの起動がより頻繁に必要になります。
デフォルト値:300(5分)
コマンドライン:
$ passenger start --pool-idle-time SECONDS
環境変数:
PASSENGER_POOL_IDLE_TIME=integer
Passengerfile.json
ファイル:{ "pool_idle_time": integer }
最大プリロードアイドル時間 - 一定時間プリロードプロセスが何も処理をしていない場合に、自動的にシャットダウンするためのタイムアウトの時間です。このオプションは秒数で設定します。値が0の場合は、アイドル状態のタイムアウトが発生しないことを意味します。値を大きくすると、プリロードプロセスが長く存在することになり、メモリ使用量が若干増加する可能性があります。但し、プリロードサーバが実行されている限り、Rubyアプリケーションプロセスの起動に要する時間は、通常起動に必要とされる時間の約10%で済みます。
デフォルト値:300(5分)
コマンドライン:
$ passenger start --max-preloader-idle-time SECONDS
環境変数:
PASSENGER_MAX_PRELOADER_IDLE_TIME=integer
Passengerfile.json
ファイル:{ "max_preloader_idle_time": integer }
起動タイムアウト - アプリケーションの起動のタイムアウトです。アプリケーションプロセスがこのタイムアウト時間内に起動できなかった場合、シグナル(SIGKILL)で強制終了され、エラーがログに記録されます。
デフォルト値:90
コマンドライン:
$ passenger start --start-timeout SECONDS;
環境変数:
PASSENGER_START_TIMEOUT=integer
Passengerfile.json
ファイル:{ "start_timeout": integer }
フォーク
Passengerはプロセスマネージャのようなもので、自分のプロセス領域でアプリケーションを実行するのではなく、外部プロセスとして起動して、その管理を行います。これには、使用されていないプロセスのシャットダウンやクラッシュしたプロセスの再起動などが含まれます。アプリケーションのインスタンスは、プロセスと呼ばれます。Passengerはアプリケーションの起動や停止を行います。
Passengerがアプリケーションのインスタンスを起動すると、プロセスの生成が行われます。Passengerでアプリケーションのプロセスを生成するには、次の2つの方法があります。
direct:アプリケーションコードとWebフレームワークの完全なコピーをメモリ上に持つ新しいRubyプロセスを生成します。この方法は、より多くのメモリを使用し、起動に時間がかかります。
smart: Rubyアプリケーションの場合、この方法がデフォルトです。最初にプリロード(preloader)処理が実行されます。この処理は、config.ruファイルを読み込むことで、Webフレームワークと一緒にアプリケーション全体をロードします。プリロード処理は、リクエスト処理には関与しません。新しいアプリケーションプロセスが必要になるたびに、子プロセスを生成します(forkシステムコールを使用)。
新しいフォークを作成するためのコマンドは以下のようになります。
$ bundle exec passenger start --min-instances 2
これにより、Passengerはアプリケーションのインスタンスを2つ保持することになります。
デフォルト値:1
インスタンスの最大プール数のデフォルト:6
Passengerfile.json
ファイル:{ "max_pool_size": 6 }
Passengerは、リクエストを受け付けると、リクエスト数が最も少ないプロセスにそのリクエストを渡します。プロセスが強制終了すると、Passengerが自動的にプロセスを再起動します。また、プロセスはトラフィックに応じて動的に拡張され、最大プール数までフォークにより新しいプロセスを生成します。