web-dev-qa-db-ja.com

Webサーバーに接続するときにsocatが「フォーク」を必要とするのはなぜですか?

ブラウザとWebサーバー間のTCP接続を理解しようとしています。ローカルマシンで実行されているWebサーバーがあり、localhost:3000または127.0.0.1:3000を使用して、期待どおりに正常に参照できます。 (私は「Rails」とWEBrickを実行しています。)

ブラウザとウェブサーバーの間にソフトウェアの仲介をしたかったので、socatの実験を始めました。以下は問題なく動作します。

socat TCP-LISTEN:8080,fork TCP:localhost:3000

Localhost:8080を参照でき、期待どおりに機能します。ただし、このように「、fork」引数を省略すると、

socat TCP-LISTEN:8080 TCP:localhost:3000

ローカルRails Webサイトはブラウザで見るとかなり壊れています。

なぜそのフォーク引数が必要なのですか?ブラウザ<-> Webサーバー接続がそれなしでは機能しないのはなぜですか?

17
user691307

forkがない場合、socatは単一のTCP接続を受け入れ、その接続が開いたままである限り、2つのエンドポイント間で双方向にデータを転送してから終了します。これは自分で簡単に確認できます。

  • 1つのターミナルウィンドウでsocatを実行します
  • 別のターミナルウィンドウでローカルホスト8080にTelnetで接続します。 socatインスタンスに接続します。
  • 3番目のターミナルウィンドウでローカルホスト8080にTelnetで接続します。 socatは新しい接続をリッスンしていないため、接続拒否エラーが発生します。すでに取得している接続のサービスに移行しました。
  • 2番目のターミナルウィンドウにHTTPリクエストを入力します。 HTTP応答を受け取り、接続が閉じられるとsocatが終了します。

forkオプションは、親が新しい接続の待機に戻る間、新しく受け入れられた接続を処理するために新しい子をフォークするだけです。

socatで高性能ミドルウェアを実装したくない理由は、プリフォークや接続プールなどのより洗練されたものではなく、socatfork()の使用です。

31
Celada