ホームページ > 記事 > PHPフレームワーク > ThinkPHP6 での Nginx リバース プロキシ Websocket の使用
近年、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 サイトの他の関連記事を参照してください。