ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP6 での Nginx リバース プロキシ Websocket の使用

ThinkPHP6 での Nginx リバース プロキシ Websocket の使用

WBOY
WBOYオリジナル
2023-06-20 21:31:401753ブラウズ

近年、Websocket はインターネット アプリケーションにおいて非常に重要な通信プロトコルとなっています。 ThinkPHP6 は、優れた PHP 開発フレームワークとして、Websocket のサポートも提供します。ただし、Websocketを利用する場合、クロスドメインや負荷分散などの問題が発生することが多いため、今回はThinkPHP6でNginxリバースプロキシWebsocketを利用する方法を紹介します。

まず、Websocket の基本原理と実装方法を明確にする必要があります。 Websocket は HTTP プロトコルのハンドシェイクプロセスを使用して接続を確立し、接続が確立された後、実際のデータ送信には TCP プロトコルが使用されます。したがって、Websocket を使用するには、HTTP 部分と TCP 部分の両方を考慮する必要があります。

実際のアプリケーションでは、通常、Websocket の負荷分散とクロスドメイン処理に Nginx リバース プロキシを使用します。 ThinkPHP6でNginxリバースプロキシWebsocketを使う方法を紹介します。

1. Nginx 構成

Nginx 構成ファイルを通じて Websocket のリバース プロキシを実装できます。まず、http ブロックでアップストリームを宣言する必要があります。

http {
    upstream websocket_servers {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
}

上記の設定では、2 つのサーバー アドレスを含む websocket_servers という名前のアップストリームを宣言しました。このようにして、クライアントが Websocket をリクエストすると、Nginx は負荷分散アルゴリズムに従ってリクエストをサーバーの 1 つに転送します。

次に、次の設定をサーバー ブロックに追加します。

server {
    listen 80;
    server_name example.com;

    # 处理WebSocket请求
    location /ws {
        proxy_pass http://websocket_servers;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

    # 处理其他请求
    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $http_host;
    }
}

上記の設定はポート 80 をリッスンし、リクエストを 2 つの状況に分割します。クライアントが /ws をリクエストすると、上で宣言した websocket_servers に転送され、その他のリクエストは backend_server に転送されます。

Websocket リクエストの場合、アップグレードや接続などの特別なリクエスト ヘッダーを設定する必要があります。ここでは、proxy_set_header を通じてこれらのリクエスト ヘッダーを設定します。ここでの proxy_pass は https プロトコルではなく http プロトコルである必要があることに注意してください。

2. ThinkPHP6 の設定

ThinkPHP6 では、Swoole Server を通じて Websocket サービスを開始する必要があります。次のコードを通じて、単純な WebSocket サービスを開始できます:

<?php
use SwooleWebSocketServer;
use SwooleHttpRequest;
use SwooleWebSocketFrame;

$server = new Server("0.0.0.0", 8000, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);

$server->on("start", function (Server $server) {
    echo "Swoole WebSocket Server is started at http://0.0.0.0:8000
";
});

$server->on("open", function (Server $server, SwooleHttpRequest $request) {
    echo "connection open: {$request->fd}
";
    $server->push($request->fd, "hello, welcome
");
});

$server->on("message", function (Server $server, Frame $frame) {
    echo "received message: {$frame->data}
";
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

$server->on("close", function (Server $server, $fd) {
    echo "connection close: {$fd}
";
});

$server->start();

上記のコードでは、WebSocket サーバーを作成し、ポート 8000 をリッスンしました。オープン イベントでは、クライアントからの接続リクエストを受け取り、ウェルカム メッセージをクライアントに送信します。メッセージイベントでは、クライアントから送信されたメッセージを受信し、メッセージを返信します。 (ここでの応答メッセージは単なる例であり、実際のアプリケーションの実際のニーズに応じて変更する必要があります。)

ここで、Nginx リバース プロキシ Websocket を使用する場合は、Swoole の WebSocket サーバーを使用する必要があることに注意してください。 HTTP プロトコルのポートではなく、TCP プロトコルのポートにバインドします。したがって、3 番目のパラメータを SWOOLE_SOCK_TCP に設定する必要があります。

Swoole のマルチプロセス モードを使用してパフォーマンスを向上させることもできます。 4 番目のパラメーターでは、これを SWOOLE_PROCESS に設定し、プロセスの数を表す数値を指定できます。

実際のアプリケーションでは、Websocket サービスでデータベース機能やキャッシュ機能を使用する必要がある場合があります。これらは、ThinkPHP6 の依存関係注入機能を使用して簡単に実装できます。

3. フロントエンド コード

最後に、フロントエンド コードが Websocket をどのように使用するかを見てみましょう。

var ws_url = "ws://example.com/ws";  // 注意这里的协议必须是ws

var websocket = new WebSocket(ws_url);

websocket.onopen = function () {
    console.log("WebSocket opened");
};

websocket.onmessage = function (evt) {
    console.log("WebSocket received message:", evt.data);
};

websocket.onclose = function () {
    console.log("WebSocket closed");
};

上記のコードでは、WebSocket オブジェクトを通じてサーバーと通信します。接続が開かれると onopen イベントがトリガーされ、メッセージが受信されると onmessage イベントがトリガーされ、接続が閉じると onclose イベントがトリガーされます。

ここでのプロトコルは http や https ではなく、ws である必要があることに注意してください。

4. 概要

上記の紹介を通じて、ThinkPHP6 で Nginx リバース プロキシ Websocket を使用するのは非常に簡単であることがわかります。 Nginx でいくつかの基本構成を実行し、Swoole で WebSocket サーバーを起動するだけで、WebSocket を使用してフロントエンドで通信できます。実際のアプリケーションで問題が発生した場合は、上記のコードを参照して問題を修正できます。

以上がThinkPHP6 での Nginx リバース プロキシ Websocket の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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