Rails: HTTP/2プロキシ "Thruster" README(翻訳)
Thrusterは、Railsアプリケーションをproduction環境にシンプルな形でデプロイするのに有用なHTTP/2プロキシです。ThrusterはPuma Webサーバーとともに実行され、アプリケーションをオープンインターネット上で効率よく、かつ安全に実行するための機能をいくつか追加します。
- HTTP/2サポート
- Let's EncryptによるTLS証明書の自動管理
- publicなアセットの基本的なHTTPキャッシュ機能
- X-Sendfileサポートと圧縮機能により、静的ファイルを効果的に配信
Thrusterは、可能な限りゼロコンフィグを目指しています。設定ファイルは存在せず、ほとんどの機能は適切なデフォルト設定を施されて自動的に有効になります。目標は、ThrusterをPumaサーバーと共に実行するだけで、production環境のセットアップを実現可能にすることです。
唯一の例外はTLSのプロビジョニングです。ThrusterがTLS証明書をプロビジョニング可能にするには、その証明書がどのドメインを対象としているかという情報が必要です。このため、TLSを利用するにはTLS_DOMAIN
環境変数を設定しておく必要があります。この環境変数が設定されていないと、ThrusterはHTTPオンリーモード(暗号化なし)で動作します。
ユーザー自身が複数のプロセスを管理しなくてもThrusterを利用可能にするため、ThrusterはPumaプロセスのラップも行います。この機能は、コンテナ化された環境(プロセスを調整できるプロセスマネージャが利用できないことが多い)で実行する場合に特に便利です。ThrusterをCMD
として利用すれば、Thrusterがユーザーに代わってPumaを管理します。
Thrusterは、元々ONCEプロジェクトのために作成されました。このプロジェクトでは、Railsアプリケーションを単一のコンテナからオープンインターネット上に提供するためのシンプルな方法が求められていました。その後、ThrusterはONCE以外のRailsアプリケーションを手軽にデプロイするときにも便利であることがわかってきました。
🔗 インストール方法
ThrusterはRuby gemとして配布されています。ThrusterはGo言語で書かれているため、さまざまなプラットフォームを対象とするビルド済みバイナリを提供しています。gemをインストールすると、プラットフォームに適したバイナリを自動的にフェッチします。
アプリケーションにThrusterをインストールするには、Gemfileに以下を追加します。
gem 'thruster'
以下のようにgem
コマンドでグローバルにインストールすることも可能です。
$ gem install thruster
🔗 利用法
Thruster内でPumaアプリケーションを実行するには、以下のようにthrust
コマンドに続けて通常のコマンドを実行します。
$ thrust bin/rails server
以下のように自動TLSも指定できます。
$ TLS_DOMAIN=myapp.example.com thrust bin/rails server
🔗 カスタム設定
Thrusterは、ほとんどの場合設定を追加しなくてもすぐに利用できます。振る舞いをカスタマイズする必要が生じた場合は、以下の環境変数を設定できます。
環境変数名 | 説明 | デフォルト値 |
---|---|---|
TLS_DOMAIN |
TLSプロビジョニングに用いるドメイン名をカンマ区切りのリストで指定します。この環境変数が設定されていない場合、TLSは無効になります。 | なし |
TARGET_PORT |
Pumaサーバーを実行するポート番号を指定します。Thrusterは、Pumaサーバーが起動されるときにPORT 変数にこの値を設定します。 |
3000 |
CACHE_SIZE |
HTTPキャッシュのサイズをバイト単位で指定します。 | 64MB |
MAX_CACHE_ITEM_SIZE |
単一項目のHTTPキャッシュの最大サイズをバイト単位で指定します。 | 1MB |
X_SENDFILE_ENABLED |
X-Sendfileサポートを有効にするかどうかを指定します。0 またはfalse を指定すると無効になります。 |
有効 |
MAX_REQUEST_BODY |
リクエストbodyの最大サイズをバイト単位で指定します。このサイズを超えるリクエストは拒否されます。0 を指定すると最大サイズが適用されなくなります。 |
0 |
STORAGE_PATH |
Thrusterの内部ステートを保存するパスを指定します。プロビジョニングされたTLS証明書はここに保存されるので、アプリケーションを起動するたびにリクエストする必要がなくなります。 | ./storage/thruster |
BAD_GATEWAY_PAGE |
バックエンドサーバーが「502 Bad Gateway」エラーを返したときに配信するHTMLファイルへのパスを指定します。指定のパスにファイルがない場合は、Thrusterが空の502レスポンスを返します。Thrusterの起動は非常に高速なので、アプリケーションが現在起動処理中であることをカスタムページでユーザーに示したいときに便利です。 | ./public/502.html |
HTTP_PORT |
HTTPトラフィックをリッスンするポートを指定します。 | 80 |
HTTPS_PORT |
HTTPSトラフィックをリッスンするポートを指定します。 | 443 |
HTTP_IDLE_TIMEOUT |
コネクションが閉じるまでにクライアントがアイドリング状態を維持できる最大時間を秒単位で指定します。 | 60 |
HTTP_READ_TIMEOUT |
クライアントがリクエストのヘッダとbodyを送信するのに要する時間の上限を秒単位で指定します。 | 30 |
HTTP_WRITE_TIMEOUT |
クライアントがレスポンスの読み取りを完了するのに要する時間の上限を秒単位で指定します。1 | 30 |
ACME_DIRECTORY |
TLS証明書のプロビジョニングに使うACME(Automatic Certificate Management Environment)ディレクトリのURLを指定します。 | https://acme-v02.api.letsencrypt.org/directory (Let's Encryptの製品) |
EAB_KID |
TLS証明書をプロビジョニングするときに使うEAB(External Account Binding)キー識別子を指定します(必要な場合)。 | なし |
EAB_HMAC_KEY |
TLS証明書をプロビジョニングするときに使う、Base64エンコードされたEAB HMAC(Hash-based Message Authentication Code)キーを指定します(必要な場合)。 | なし |
FORWARD_HEADERS |
クライアントからX-Forwarded-* ヘッダーを送信するかどうかを指定します。 |
TLSで実行時は無効、それ以外の場合は有効 |
DEBUG |
1 またはtrue を設定するとデバッグログ出力が有効になります。 |
無効 |
アプリケーション固有の環境変数と名前が衝突するのを防ぐために、Thrusterの環境変数にはオプションでTHRUSTER_
をプレフィックスできます。
たとえば、TLS_DOMAIN
環境変数はTHRUSTER_TLS_DOMAIN
と書くことも可能です。プレフィックス付きの環境変数が設定されると、プレフィックスなしの環境変数よりも優先されます。
概要
MITライセンスに基づいて翻訳・公開いたします。
参考: Railsを高速かつセキュアにするHTTP/2プロキシ「Thruster」、37signalsがオープンソースとして公開 - Publickey
Rails 8からはデフォルトでThrusterが有効になります。
参考: Use Thruster by default to Rails 8 by dhh · Pull Request #51793 · rails/rails