BanditがPlugとPhoenixの接続層をどう置き換えるか
Bandit は、プラグおよび WebSock アプリケーション用の純粋な Elixir HTTP サーバーです。
ひと目でわかる
- これは何?
- ElixirのPlugとWebSock向けにHTTP/1.x、HTTP/2、WebSocketを提供するHTTPサーバーで、Thousand Islandを基盤にしています。
- 誰に向いている?
- BanditはPlug、WebSock、Phoenixの接続層をElixirで統一したいチームに候補となります。導入前に`mix.exs`へ`{:bandit, "~> 1.8"}`を追加し、`config/config.exs`の`Bandit.PhoenixAdapter`または`{Bandit, plug: MyPlug}`を小さなアプリで試してください。
- 商用利用できる?
- できます。MIT は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
- 今もメンテナンスされている?
- されています。最後のコミットは 8 日前です。
- 何の言語で書かれている?
- 主に Elixir です(GitHub の言語統計による)。
回答はプロジェクトの GitHub データ(最終同期:2026年9月14日)と当サイトの分析に基づくもので、法的助言ではありません。
オープンソース詳細解説
Thousand Island上のHTTPサーバー
Banditは完全にElixirで書かれ、Thousand Islandの上に構築されたPlugとWebSock向けのHTTPサーバーです。HTTP/1.x、HTTP/2、WebSocketをHTTPとHTTPSの双方で提供します。READMEは正確性、明確性、性能を目標の順序として挙げ、低レベルのコードを理解しやすくする意図も説明しています。
Phoenix 1.7.11以降ではデフォルトHTTPサーバーだとREADMEにありますが、Phoenixの版、既存エンドポイント設定、WebSocket利用の有無で確認内容は変わります。単純なPlugから始めて接続と応答を確認し、Phoenixへ広げる順序が現実的です。
Phoenixでは`mix.exs`と`config/config.exs`の変更を保存し、起動時にBanditを使っている表示を確認します。
mtrudel-bandit-deep-analysisの第1章を確認するときは、実行前の版と設定を保存し、成功した結果だけでなく失敗した入力も残します。READMEの説明、端末の出力、生成物の差分を別々に記録することで、機能の存在と自分の環境での再現性を区別できます。
RFCと適合性テストの読み方
HTTP/1.xはRFC 9112とRFC 9110、HTTP/2はRFC 9113とRFC 9110、WebSocketはRFC 6455に基づくとREADMEは説明します。HTTP/2は厳格モードのh2spec、WebSocketはAutobahnで100%のスコアを掲げ、CIには単体テスト、credo、dialyzer、性能回帰テストも含まれます。
これはプロジェクトが記載するテスト結果です。自分のTLS終端、プロキシ、同時接続数、メッセージサイズで同じ結果になる保証ではありません。gzipとdeflate、WebSocketのメッセージ圧縮も有効化条件を確認し、対象プロトコルごとに成功と失敗を記録します。
HTTP/1.x、HTTP/2、WebSocketを別の小さなリクエストで試し、応答と接続終了をプロトコル別に記録します。
mtrudel-bandit-deep-analysisの第2章を確認するときは、実行前の版と設定を保存し、成功した結果だけでなく失敗した入力も残します。READMEの説明、端末の出力、生成物の差分を別々に記録することで、機能の存在と自分の環境での再現性を区別できます。
PhoenixのadapterとPlugのsupervisor
Phoenixでは`mix.exs`にBanditを依存関係として加え、`config/config.exs`のエンドポイントに`adapter: Bandit.PhoenixAdapter`を設定します。Plugアプリでは、アプリケーションの子プロセスに`{Bandit, plug: MyPlug}`を置く例や、`Bandit.start_link(plug: MyPlug)`を呼ぶ例があります。
READMEはPhoenixとPlugのアプリがCowboyの置き換えとして動くはずだとしていますが、exoticなエンドポイント設定は更新が必要な場合があるとも述べます。Phoenix ChannelsやLiveViewのWebSocketにはPhoenix 1.7以降が必要なので、依存版と起動時ログをまず保存してください。
h2specとAutobahnの100%というREADMEの記載は自称結果として扱い、テスト版と対象設定を確認できる範囲で照合します。
mtrudel-bandit-deep-analysisの第3章を確認するときは、実行前の版と設定を保存し、成功した結果だけでなく失敗した入力も残します。READMEの説明、端末の出力、生成物の差分を別々に記録することで、機能の存在と自分の環境での再現性を区別できます。
HTTPSとWebSocketの具体的な境界
HTTPSでは`scheme: :https`、絶対パスの`certfile`と`keyfile`を設定する例がREADMEにあります。証明書と秘密鍵のパスは、HTTPが動くこととは別に検証すべき項目です。証明書生成方法や全TLS設定はREADMEにないため、そこを補って断定はしません。
BanditはWebSockとWebSockAdapterをサポートします。一方、内部のメッセージングを前提にしているため、Plugコードの`receive`は`{:bandit, _}`や`{:plug_conn, :sent}`を不用意に消費しないよう警告されています。HTTP/2とWebSocketを有効にしたテストでメールボックスの扱いを確認します。
HTTPSの`certfile`と`keyfile`を絶対パスで指定し、証明書の読み込み失敗と正常起動のログを分けて保存します。
mtrudel-bandit-deep-analysisの第4章を確認するときは、実行前の版と設定を保存し、成功した結果だけでなく失敗した入力も残します。READMEの説明、端末の出力、生成物の差分を別々に記録することで、機能の存在と自分の環境での再現性を区別できます。
性能主張とライセンスを分ける
READMEの自動性能テストでは、HTTP/1.xで同時リクエスト数に応じてCowboyより最大4倍、HTTP/2で最大1.5倍高速とされています。方法論や生データはREADMEにないため、数値はREADMEの主張として読むべきです。負荷生成器、接続数、メモリ、アプリ処理を固定して比較しない限り、選定根拠にはしません。
BanditはMITライセンスです。実装はHTTP/1、HTTP/2、WebSocketの各領域に分かれ、HTTP/1のREADMEが入口と案内されています。利用前は公式ドキュメントとリリースを確認し、設定差分、警告ログ、適合性テストの対象をチームの記録へ残します。
Plugの`receive`処理にBanditのメッセージを残すガードを入れ、HTTP/2でメールボックスを誤消費しないことを確認します。
mtrudel-bandit-deep-analysisの第5章を確認するときは、実行前の版と設定を保存し、成功した結果だけでなく失敗した入力も残します。READMEの説明、端末の出力、生成物の差分を別々に記録することで、機能の存在と自分の環境での再現性を区別できます。
Banditの接続設定を変更したら、Cowboyとの差分を設定値ごとに分け、Phoenixの起動ログとPlug単体のログを別に保存します。さらにHTTP/2の切断、WebSocketの圧縮、HTTPSの証明書エラーを別ケースとして残すと、設定変更の影響を追跡できます。
編集部の結論
BanditはPlug、WebSock、Phoenixの接続層をElixirで統一したいチームに候補となります。導入前に`mix.exs`へ`{:bandit, "~> 1.8"}`を追加し、`config/config.exs`の`Bandit.PhoenixAdapter`または`{Bandit, plug: MyPlug}`を小さなアプリで試してください。HTTP/2とWebSocketの通信、HTTPSのcertfile・keyfile、Plug内のreceive処理を確認し、READMEの自称ベンチマークを自環境の結果として扱わないことが必要です。
コミュニティノート