ホームページ >運用・保守 >Nginx >Nginx が WebSocket 構成を実装する方法

Nginx が WebSocket 構成を実装する方法

PHPz
PHPzオリジナル
2023-11-08 10:37:561475ブラウズ

Nginx が WebSocket 構成を実装する方法

Nginx は、高性能 Web サーバーおよびリバース プロキシ サーバーとして、WebSocket リクエストを処理する独自の構成方法も備えています。 WebSocket は TCP ベースのプロトコルです。WebSocket 接続の確立には 3 方向のハンドシェイクが必要です。ハンドシェイクが完了すると、クライアントとサーバーの間で双方向通信が可能になります。以下では、Nginx で WebSocket の設定を実装する方法を、具体的なコード例とともに紹介します。

まず、WebSocket 関連の設定を Nginx 設定ファイルに追加する必要があります。

http {
  ...
  upstream websocket {
    server localhost:9001;
  }
  ...
  map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
  }
  ...
  server {
      listen 80;
      server_name example.com;

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

上記の構成では、WebSocket のターゲット サーバー アドレスとポートを指定するために、「websocket」という名前のアップストリームを追加しました。同時に、map ディレクティブを使用して $http_upgrade (クライアント アップグレード リクエスト ヘッダー) と $connection_upgrade (nginx アップグレード リクエスト ヘッダー) をマップします。このように、クライアントのアップグレード要求ヘッダーに「アップグレード」フィールドと「接続」フィールドを追加することで、Nginx をトリガーして HTTP プロトコルを WebSocket プロトコルにアップグレードし、双方向通信を実現できます。

サーバー ブロックでは、proxy_pass ディレクティブを使用して、すべての WebSocket リクエストを WebSocket アップストリームにプロキシし、プロトコル バージョンとリクエスト ヘッダー情報を設定します。 Nginx で WebSocket をプロキシする場合、「アップグレード」リクエスト ヘッダーと「接続」リクエスト ヘッダーを一緒にターゲット サーバーに送信する必要があることに注意してください。そうしないと接続が閉じられるため、これら 2 つのリクエスト ヘッダーは proxy_set_header ディレクティブを通じて手動で設定する必要があります。 。 に追加。

さらに、上記の構成では HTTP (80) ポートのみをリッスンしていることに注意してください。HTTPS で WebSocket を構成する必要がある場合は、サーバー ブロックに次の命令を追加する必要があります。 :

listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

上記の手順は、HTTPS (443) ポートをリッスンし、証明書とキー ファイルのパスと名前を指定するために使用されます。

以下は、Node.js を使用して実装された特定の WebSocket サーバー コードの例です。

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 9001 });

server.on('connection', (socket, req) => {
  console.log('Client connected');

  socket.on('message', (message) => {
    console.log(`Received message: ${message}`);
    socket.send(`Your message: ${message}`);
  });

  socket.on('close', () => {
    console.log('Client disconnected');
  });
});

このコードでは、WebSocket サーバーを作成し、ポート 9001 をリッスンします。接続が確立された後、「クライアントが接続されました」情報を出力し、クライアントのメッセージを受信した後、メッセージをクライアントに返し、終了イベントをリッスンして「クライアントが切断されました」情報を出力します。

上記のコードと構成例を通じて、Nginx で WebSocket プロトコルのプロキシと通信作業を実装できます。 WebSocket プロトコルの使用には依然として一定の制限があることに注意してください。具体的には、WebSocket 接続の確立プロセスは HTTP/HTTPS プロトコルと似ていますが、接続が正常に確立されると、両者間の通信は行われなくなります。当事者は WebSocket プロトコルに完全に依存しており、HTTP/HTTPS プロトコルには依存しなくなりました。したがって、WebSocket プロトコルを使用する場合は、従来の Web 開発上の制限を回避する必要があると同時に、セキュリティや安定性などの問題にも注意する必要があります。

以上がNginx が WebSocket 構成を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。