Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails: HTTP/2プロキシ "Thruster" README(翻訳)

概要

MITライセンスに基づいて翻訳・公開いたします。

参考: Railsを高速かつセキュアにするHTTP/2プロキシ「Thruster」、37signalsがオープンソースとして公開 - Publickey

basecamp/thruster - GitHub

Rails 8からはデフォルトでThrusterが有効になります。

参考: Use Thruster by default to Rails 8 by dhh · Pull Request #51793 · rails/rails

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と書くことも可能です。プレフィックス付きの環境変数が設定されると、プレフィックスなしの環境変数よりも優先されます。

関連記事

Solid Queue README -- DBベースのActive Jobバックエンド(翻訳)

Solid Cache README: DBベースのキャッシュストア(翻訳)

Rails: Mission Control Jobs gem README(翻訳)


  1. 訳注: 現在は原文に沿った訳としていますが、この原文について#36で修正リクエストがオープンされています。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。