ホームページ  >  に質問  >  本文

C++ - 複数のプロセスが同時に同じポートをリッスンしています。異なるアプリケーションが同じポートをリッスンできますか?

nginx のモデルは、自分がマスターワーカーであることを認識しています

曾经蜡笔没有小新曾经蜡笔没有小新2698日前1067

全員に返信(3)返信します

  • 黄舟

    黄舟2017-05-31 10:39:23

    これは、同時に 1 つを再利用する複数のプロセスである必要がありますsocket

    ただし、最新の linux では、複数の linux中,多个socket同时监听同一个端口也是可能的,在Nginx 1.9.1 が同じポートを同時にリッスンすることができます。この動作は Nginx 1.9.1 以降でもサポートされています。

    linux 3.9 以降のカーネルは、同じポート上で複数の linux 3.9以上内核支持SO_REUSEPORT选项,即允许多个socket bind/listen在同一个端口上。这样,多个进程就可以各自申请socket监听同一个端口,当数据来时,内核做负载均衡,唤醒监听的其中一个进程处理,用法类似于setsockopt(listener, SOL_SOCKET, SO_REUSEPORT, &option, sizeof(option)) bind/listen を許可する

    オプションをサポートしています。このようにして、複数のプロセスがそれぞれ同じポートをリッスンするように適用できます。データが到着すると、カーネルはロード バランシングを実行し、リッスンしているプロセスの 1 つを起動します。使用法は setsockopt(listener, SOL_SOCKET, SO_REUSEPORT,) と似ています。 &オプション、sizeof (オプション))

    SO_REUSEPORT选项可以有效地解决epollThundering herd 問題の使用: 特定のテストについては、以下の例を参照してください: ThunderingHerdTest.cpp

    オプションの説明については、「SO_REUSEPORT ソケット オプション」を参照してください。質問者の疑問については、記事内の次の文が答えとして使用できます。 SO_REUSEPORT

    SO_REUSEPORT を使用してサーバーによって既にバインドされているポートが不要なプロセスによってハイジャックされるのを防ぐために、後でそのポートにバインドするすべてのサーバーは、最初のバインドを実行するために使用された実効ユーザー ID と一致する実効ユーザー ID を持っている必要があります。ソケット

    つまり、プロセスが同じポートにバインドできるのは、プロセスが同じ
    である場合のみです。

    Nginxeffective user ID については、「NGINX 1.9.1 の SO_REUSEPORT による生産性の向上」を参照してください。

    返事
    0
  • PHP中文网

    PHP中文网2017-05-31 10:39:23

    pid が最も小さいものがマスターとなるはずです。

    返事
    0
  • 漂亮男人

    漂亮男人2017-05-31 10:39:23

    単一のアプリケーションには同じポートをリッスンする複数のプロセスがあり、ソケットは共有されます

    返事
    0
  • キャンセル返事