仕組み
Proxerは1つのリスナーとクライアント開始のWebSocketトンネルを使います。
Proxerは1つのHTTP/WebSocketリスナーを使います。公開トラフィックはそのリスナーへ入り、トンネルクライアントは同じポート上の予約済み制御WebSocketパスへ接続します。
予約済み内部パス:
/__proxer__/control/__proxer__/health/live/__proxer__/health/readyこれらのパスは固定です。--control-pathオプションはありません。
トンネルクライアントはWebSocketで/__proxer__/controlへ接続します。接続が開くと、ルート経路またはサブドメイン経路を登録します。
公開トラフィックが届くと、サーバーはstream IDを作成し、リクエストフレームを制御接続上へ送ります。クライアントはそのフレームをローカルHTTPサービスへ転送し、レスポンスフレームをサーバーへ返します。各ストリームには固有のstreamIdがあるため、複数のリクエストが1つの制御接続を共有できます。
リクエストの流れ
Section titled “リクエストの流れ”- ブラウザーまたはreverse proxyが公開Proxerサーバーへリクエストを送ります。
- サーバーは
Hostヘッダーを読み、一致するルートまたはサブドメイントンネルを探します。 - サーバーはそのリクエスト用に新しいトンネルストリームを開きます。
- クライアントはリクエストをローカルサービスへ転送します。
- レスポンスヘッダーと本文chunkが同じトンネルストリームで戻ります。
- 公開サーバーは元の呼び出し元へレスポンスを書き込みます。
HTTPストリーミングとServer-Sent Eventsはchunkとして転送されます。WebSocketアップグレードは双方向のトンネルストリームとしてプロキシされます。
再接続の動作
Section titled “再接続の動作”確立済みの制御接続が切れた場合、クライアントはアクティブなストリームを片付けて再接続を試みます。サーバーが同じURLで戻ると、クライアントは再度登録します。
初回起動はもう少し厳密です。サーバーが利用できない状態でクライアントを起動すると、再接続ループに入る前にコマンドが失敗することがあります。先にサーバーを起動してからクライアントを起動してください。
Proxerが推測しないこと
Section titled “Proxerが推測しないこと”Proxerは接続中のクライアントが1つだけという理由でリクエストを自動転送しません。リクエストのホストは、登録済みのルートドメインまたはサブドメインと一致する必要があります。これにより、複数クライアントの運用でも挙動が予測しやすくなります。