web-dev-qa-db-ja.com

同じサーバーでのWebsocketサーバーとhttpサーバーの実行

Nginxを使用してPHPアプリケーションのインスタンスを提供すると同時に、Ratchetアプリを実行してWebSocket接続をリッスンしています。問題は、これらのインスタンスの両方が同じポート(80)。

両方を提供できるようにサーバーを設定するにはどうすればよいですか?

編集:質問が何度も反対票を投じられたのを見に戻ってきました、当然のことながら、私は本当に明確な方法で質問をしませんでした。ごめんなさい。私はデューデリジェンスをしましたが。私が何を求めていたのかを明確にしてみます。websocketプロトコルのいくつかの側面を誤解している可能性があります。その場合は修正してください。

特定のポートをリッスンしているプロセスは1つだけであることをよく知っています。実際に問題があるのは、WebSocket全体です。WebSocketリクエストはHTTPハンドシェイクで始まり、その後メカニズムが発生します。そのセッションを特定のポートに「アップグレード」します。

私が読んだことから、このアップグレードメカニズムはWebサーバーによって処理されているようです。では、nginxを構成してこのプロセスを処理するにはどうすればよいですか?

全体として、80以外のポートでwebsocketサーバーを実行する際に気になるのは、ポートがブロックされている可能性です。この懸念は根拠がないのですか?これをどのように設定すべきかについてのアドバイスはありますか?

8
hndr

ひどく書かれた質問ですが、私が探していた用語はリバースプロキシでした。

基本的に、nginxがパスまたはホスト名に基づいてWebアプリケーションの複数のインスタンスに異なるリクエストを転送する方法と同様に、リクエストをWebSocketサーバーインスタンスに「転送」するように構成することもできます。例えば。:

location /socket {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

upstream websocket{
    server localhost:8000;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

http://hostnameへのHTTPリクエストは通常​​のhtmlページで処理されますが、wss://hostname/socketへのWebSocket接続はポート8000​​でリッスンしている同じサーバーのWebSocketインスタンスに転送されます。

16
hndr

サーバーは、同じポート/ IPアドレスでリッスンする2つの異なるソフトウェアを持つことはできません。そうでない場合、複数のアプリケーションが同じポートにバインドされている可能性がある場合、トラフィックはどのようにアプリケーションXYZにルーティングされますか?

Port(computer networking) からポートの詳細を学ぶことができます

次のオプションのいずれかを実行する必要があります。

  1. 2つのアプリケーションのいずれかに別のポートを使用し、ファイアウォールを通過できるようにします。
  2. 2つの異なるIPアドレスを使用し、各アプリケーションをそれぞれのIPアドレスにバインドします。

ファイアウォールは、設定内容に従って構成する必要があります。

2
ETL

次の2つのオプションがあります。

  1. 別のポート(8000など)にバインドします
  2. (可能な場合)サーバーに追加のIPアドレスを追加し、WebサーバーとWebソケットサーバーを別のIPにバインドします
0
Teun Vink