Thruster
https://github.com/basecamp/thruster
37signals製のHTTP2 proxy
Goで書かれている
https://dev.37signals.com/thruster-released/
機能
HTTP/2 support
SSL (via Let’s Encrypt, for automatic certificate management)
HTTP caching, for public assets
Efficient static file serving via X-Sendfile and compression
モチベーション
ONCEを始めたとき、顧客がRailsアプリを簡単にパッケージ化して実行できるようにしたかった
実行とはインターネットへの公開も含む
安全かつ高速である必要がある
これまではpumaだけでは不十分で追加にweb serversを用意したりCDNを設定していた
大規模なアプリでは必要なセットアップだがそうではないことも多い
仕組み
Thrusterはpumaプロセスをラップする
thrust bin/rails serverで起動する
SSL
SSL_DOMAIN=example.com環境変数を与えることで
有効なDNSレコードがある限り、Thruster は必要に応じてSSL証明書のプロビジョニングと更新を行う
一部の機能のみ使うこともできる
すでにSSL terminationを設定済みならそのキャッシュに使える
すでにCDNを設定済みならX-Sendfile経由で高速な配信ができる
https://discuss.rubyonrails.org/t/explaining-thruster-a-new-37signals-gem-that-speeds-up-your-app/85567
Pumaでは不十分な理由
HTTP/2をサポートしていない
ブラウザは接続ごとに一度に1つのアセットをリクエストする必要がある
ドメインごとの接続数が 6 ~ 8 に制限されるが、ほとんどのページには数十のアセットがある
必要なものをすべて取得するには複数回ラウンドトリップしなければならない
Zero Copy
アセットを転送するときPumaはそのコンテンツをディスクからメモリにコピーし、それからメモリからネットワークに再度コピーする
これが起こっている間はPuma のスレッドの1つがコピー処理でスタックしてしまい、CPU時間とメモリを消費する
NginxのようにsendfileLinuxカーネルコマンドで効率化すべき
ohbarye.icon 条件によっては(?)pumaもsendfileLinuxカーネルコマンドを使うとの指摘あり
https://discuss.rubyonrails.org/t/explaining-thruster-a-new-37signals-gem-that-speeds-up-your-app/85567/14?u=ohbarye