web-dev-qa-db-ja.com

Linuxでコンカレントサーバーをフォークするためのxinetdの代替案を探す

私は最近 ここに投稿 サーバープロセスを動的に割り当てられたポートにバインドすることの欠点について質問しました。サーバープロセスを起動したxinetdがSTDINとSTDOUTをサーバーの通信チャネルとしてクライアントに割り当て、サーバーが双方向ソケットを使用するようにしたため、このアプローチが生まれました。応答(および運用チーム)は、そのアプローチを放棄することを私に確信させました。

指定されたポートを監視し、並行サーバーをフォークするデーモンプロセスが必要です。サーバープロセスは、ソケットベースのI/Oインフラストラクチャを使用して記述されています。 xinetdで起動できるサーバープロセスを開発しました。最初に行うことは、動的に割り当てられたポート番号にバインドし、ポート番号をSTDOUT経由でクライアントに送信し、クライアントのconnect()をソケットでリッスンすることです。この時点で、ソケットを使用するのが適切です。ベースのI/Oインフラストラクチャ。

私たちの運用チームは、セキュリティ上の理由から動的ポートの使用を排除しました( リンクを参照 )。私は代替-クライアントが動的に起動されたサーバーに接続し、ソケットを使用して通信する方法]を探しています。最も簡単な解決策は、ほとんどの点で同じです-xinetdただし、サーバーへの接続としてSTDIN/STDOUTをクライアントに割り当てる代わりに、デーモンが接続を受け入れたときに割り当てられたソケットをサーバーに渡します。おそらく、ソケット番号は予測できないため、デーモンはその番号をコマンドライン引数として渡す必要もあります。

私はそのようなデーモンをPerlで作成しましたが、(x)inetdが簡単に思いつくものよりはるかに「強化」されていると確信しているので、自分でデーモンをロールすることをためらっています。

それが問題であり、私が最も簡単な解決策であると私が考えるものです。代わりの解決策を聞いたり、実際にxinetd can を構成してソケットを渡すように設定したりすることについても感謝します。

5
Chap

あなたは物事を複雑にしようとしています。 xinetdを使用する場合は、stdin/stdoutを介して通信する新しい各インスタンスを実行するようにアプリケーションを記述します。ソケットを直接使用する場合は、サービスに固定ソケットをリッスンさせ、接続自体を処理させます。

このようなことを複雑にする必要がある理由について、説得力のある議論はありません。ただ、それが唯一の解決策であると考えているようです。主要な詳細を省略している、またはネットワークのしくみについて混乱している、または X Y Problem を扱っています。

「双方向ソケット」を使用したいと言っている-双方向チャネルであるstdin/stdoutがある場合。複雑なioctlを使用する予定がない限り、実際には違いはありません-「ソケットを渡す」ことは何も購入しません。

Xinetdは「強化」されていると言います-プライベートでファイアウォールで保護されたネットワークを使用している場合は、独自のデーモンを作成して固定ポートで直接リッスンしても安全です。セキュリティやDOSについて心配している場合、xinetdはあまり購入しません。

どちらの単純なアプローチの何が問題になっていますか?

3

最初の質問は、単に「なぜストリームを使用できないのですかIOですか?ソケットIOを使用したいということを除いて、人生をより長くする必要がある理由の明確な説明がありません。あなた自身のために複雑。

ソケットを自分で処理する必要がある場合、解決策は独自のソケットサーバーを実装することです。プロセスの観点からは、それは本当に簡単です。あなたはcreateサーバーソケット、listenは接続用、そしてaccept各接続には、サービスを提供するためのクライアント固有のソケットがあります。

しかし、ここで物事がもっと面白くなります。 1つの要求が他の要求をブロックすることなく、複数のクライアント接続をサポートする必要があります。最も単純な戦略は、xinetdが新しいプロセスをフォークすることによってこれを解決する方法に基づいており、新しいプロセスはそのクライアント接続を処理し、ソケットが閉じると終了します。あまり負荷がかからないサービスを計画している場合は、これで十分です。

一度に1k以上の接続を処理するには、fork()を使用して新しいプロセスを作成するのは非常に非効率的です。大量のメモリ、大量のコンテキスト切り替え、パフォーマンスが衰退し始めます。ここで、非同期のIOアプローチに切り替える必要があります。

1
Michael Shaw