Gately v0.5.2 リリース
2026年10月20日
公開 IP の 443 番ポートは 1 つしかなく、VPN、Web サイト、各種プロキシのどれもがそれを使いたがります。これまでは前段に haproxy や nginx stream を置いてドメインごとに振り分け、その後ろに nginx を置いてリバースプロキシする構成が一般的で、3 つのプログラムにそれぞれ設定が必要でした。v0.5.2 では、ドメインによる振り分け、リバースプロキシ、TOTP ログインを Gately 1 つで行えます。速度も haproxy + nginx に引けを取りません。
v0.5.2 をダウンロード · GitHub Release
SNI 振り分け:複数のサービスで 443 番ポートを共用
ポート転送に新しく「SNI 振り分け」モードを追加しました(Telegram グループのユーザーからの要望、#3)。
- TLS ハンドシェイクからドメイン名を読み取り、ドメインに応じて選んだバックエンドへ接続全体をそのまま中継します。TLS はここでは復号しないため、証明書はバックエンドに置いたままです。
- ドメインは完全一致、
*.example.comのワイルドカード、*を指定できます。一致しない、SNI がない、TLS ではない接続はデフォルトターゲットに送られ、デフォルトターゲットがなければ切断されます。 - PROXY プロトコル v1 / v2 はルートごとに設定でき、バックエンドは実際のクライアントアドレスを受け取れます。
- ルールのカードに、各ルートとデフォルトターゲットが受け付けた接続数が表示されます。
haproxy を置き換える完全な例は ポート転送 を参照してください。
Web サービスで nginx を置き換え
- パス別バックエンド:パスの接頭辞ごとに別のバックエンド群へ送ったり、そのパスにだけリクエストヘッダーを追加したりできます。nginx の
locationに相当します。 - フォワード認証:認証を Authelia などのサービスに任せます。
auth_requestに相当し、/adminのような特定のパスだけを保護できます。 - HTTPS バックエンドにアクセス先ドメインを SNI として送信:バックエンドが SNI で振り分ける場合(frp の
vhost_httpsなど)に必要です。 - リダイレクトで
{host}を使用:https://{host}のルール 1 つで、すべてのドメインの HTTP を HTTPS へ転送できます。 - 静的サイト:拡張子なし URL(VitePress など)、カスタム 404 ページ、レスポンスヘッダーに対応しました。
- サイトを編集してもリスナーを再起動しない:確立済みの接続(WebSocket を含む)は維持され、統計も保持されます。新しい設定が無効な場合は古い設定のまま動作し続けます。
nginx の設定との対応は Web サービス の「haproxy と nginx の置き換え」を参照してください。
共有ユーザー:TOTP とシングルサインオン
「Web サービス → 全体設定」で共有ユーザーを追加し、ユーザーごとに TOTP を有効にして(QR コードを読み取ります)、example.com のようなシングルサインオンのドメインを設定すると、1 つのサイトでログインすればその配下のすべてのサイトに入れます。サイト側は「共有ユーザーを使う」にチェックを入れるだけです。これだけのために Authelia を動かしたくない場合は、この組み込み機能を使えます。
性能
同じマシン上で、それぞれ CPU 2 コアに制限し、実際のサーバーの設定(90 ドメイン、PROXY プロトコル v2)で haproxy + nginx と Gately を比較しました。
| シナリオ | haproxy + nginx | Gately |
|---|---|---|
| HTTPS リバースプロキシ、キープアライブ、1 KB のレスポンス | 14,767 req/s | 26,434 req/s |
| リクエストごとに新しい TLS 接続 | 2,557 req/s | 3,448 req/s |
| 1 MB のレスポンス | 1,053 MB/s | 1,585 MB/s |
| TLS ストリームの SNI パススルー | 2,927 MB/s | 4,962 MB/s |
| SNI パススルーの毎秒新規接続数 | 6,334 /s | 6,266 /s |
メモリは Gately が約 110 MB、haproxy と nginx が合計で約 42 MB です。測定方法、全データ、注意点は README にあります。
アップグレード時の注意
- Docker:新しいイメージを取得してコンテナを再作成します。バイナリ:実行ファイルを置き換えて再起動します。
- v0.5.2 より前のバージョンは SNI 振り分けのルールを理解できません。ダウングレードする前に、これらのルールを無効化または削除してください。古いバージョンはこれらを通常の転送として扱い、デフォルトターゲットのないルールは最初の接続でプログラムをクラッシュさせます。
- haproxy から切り替える場合は、Gately のルールを有効にする前に haproxy を停止してください。1 つのポートを待ち受けられるのは 1 つのプログラムだけです。
質問やアイデアは GitHub Issues または Telegram グループ へお寄せください。