Ruby のデフォルト Web サーバー
最終更新日 2023年03月20日(月)
Table of Contents
Procfile なしで Ruby アプリケーションをデプロイすると、デフォルト Web サーバーが使用されます。Rack の場合、これは $ bundle exec rackup
が Rails $ rails server
に対して実行されることを意味します。これらのライブラリのバージョンと、どのような gem が Gemfile 内にあるかによっては、本番環境アプリケーションを実行するために WEBrick サーバーが使用される場合があります。
アプリケーションで WEBrick を使用しない場合でも、この暗黙的な動作に依存せず、代わりに Procfile
を通じて Web サーバーの起動方法を明示的に宣言することを強くお勧めします。特に希望がない場合は、Puma で実行するようにアプリケーションを設定することをお勧めします。Web サーバーを選択するときは、その Web サーバーが並列リクエストを処理できることを確認してください。
この記事の残りの部分では、WEBrick に関する情報と、本番環境で WEBrick を実行するのが望ましくない理由を示します。
WEBrick とは
Ruby の標準ライブラリには、WEBrick という名前のデフォルト Web サーバーが付属します。このライブラリは Ruby があるすべてのマシンにインストールされるため、Rails や Rack のようなほとんどのフレームワークでは、デフォルトの開発用 Web サーバーとして WEBrick を使用します。
WEBrick は、開発目的での使用には十分ですが、本番環境で Ruby アプリが扱う必要がある並列性の高いワークロードを処理するようには設計されていません。 代わりに、本番環境 Web サーバーを使用する必要があります。
WEBrick を使用しない理由
WEBrick では、リクエストのたびに新しいスレッドを生成します。アプリケーションによってはこの動作でも問題ありませんが、Global Interpreter Lock (GVL)(「Global Virtualmachine Lock (GVL)」とも呼ばれています) が原因で、これは WEBrick が複数のコアを利用できないことを意味します。最大のパフォーマンスが必要な場合、Heroku ではマルチプロセスマルチスレッドサーバーを推奨しており、現在は Puma を推奨しています。
Procfile
で Web サーバーを指定しない場合、本番環境で WEBrick を実行している可能性があります。 そのまま WEBrick を実行し続けると、リクエストに時間がかかり、場合によってはタイムアウトが発生し、アプリケーションで本来必要な数よりも多くの dyno を使用する必要が生じます。
このような事態を避けるために、必ず本番環境 Web サーバーを使用してください。
本番環境 Web サーバー
本番環境用の Ruby Web サーバーでは、複数のリクエストを並列処理できます。現時点では、Puma Web サーバーの使用を推奨しています。
Puma Web サーバーを依存関係として Gemfile
に追加し、本番環境 Web サーバーを指定する Procfile
を追加し、Git にコミットしてデプロイしてください。詳しい説明については「Deploying Rails Applications With Puma」(Puma を使用した Rails アプリケーションのデプロイ) を参照してください。