ブラウザと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サーバー接続がそれなしでは機能しないのはなぜですか?
fork
がない場合、socat
は単一のTCP接続を受け入れ、その接続が開いたままである限り、2つのエンドポイント間で双方向にデータを転送してから終了します。これは自分で簡単に確認できます。
socat
を実行しますsocat
インスタンスに接続します。socat
は新しい接続をリッスンしていないため、接続拒否エラーが発生します。すでに取得している接続のサービスに移行しました。socat
が終了します。fork
オプションは、親が新しい接続の待機に戻る間、新しく受け入れられた接続を処理するために新しい子をフォークするだけです。
socat
で高性能ミドルウェアを実装したくない理由は、プリフォークや接続プールなどのより洗練されたものではなく、socat
のfork()
の使用です。