検索
ホームページPHPフレームワークSwooleSwoole が TCP プロキシ サービスの負荷分散を実装する方法

Swoole が TCP プロキシ サービスの負荷分散を実装する方法

Jun 25, 2023 am 10:21 AM
負荷分散TCPプロキシswoole

Swoole は、PHP 言語拡張に基づいて開発された高性能ネットワーク通信フレームワークで、非同期、コルーチン、その他の機能を通じて PHP アプリケーションのパフォーマンスと同時実行機能を向上させます。実際のプロジェクトでは、サービスの負荷分散を実現するために、TCP プロキシ サービスを複数のサーバーにデプロイする必要があることがよくあります。この記事では、Swoole が TCP プロキシ サービスの負荷分散を実装する方法を紹介します。

まず、TCP プロキシ サービスのアーキテクチャを明確にする必要があります。通常、TCP プロキシ サービスは、クライアントとサーバーの 2 つの部分で構成されます。クライアントは TCP プロキシ サービスにリクエストを送信し、サーバーはそのリクエストをバックエンド サーバーに転送し、応答結果をクライアントに返します。 TCP プロキシ サービスを複数のサーバーに展開する場合、システムの可用性とスループットを向上させるために、各サーバーにリクエストを均等に分散する負荷分散戦略を実装する必要があります。

Swoole では、TCP プロキシ サービスの負荷分散をさまざまな方法で実現できます。一般的な方法を 2 つ紹介します。

  1. Swoole ベースの TCP プロキシ コンポーネント

Swoole は、トラフィック転送と負荷分散を実現するための TCP プロキシ サービスのミドルウェアとして使用できる TCP プロキシ コンポーネントを提供します。まず、サーバー上で Swoole の TCP プロキシ サービス コンポーネントを開始します。

$proxy = new SwooleProxyServer('0.0.0.0', 8080, SWOOLE_PROCESS);
$proxy->set(
    array(
        'timeout' => 3, //超时时间
        'heartbeat_check_interval' => 60, //心跳检测间隔
        'heartbeat_idle_time' => 600, //连接空闲时间
        'load_balance' => SWOOLE_PROXY_ROUNDROBIN, //负载均衡策略
        'server_list' => array(
            array('host' => '192.168.1.1', 'port' => 8080),
            array('host' => '192.168.1.2', 'port' => 8080),
            array('host' => '192.168.1.3', 'port' => 8080),
        ),
    )
);
$proxy->run();

上記のコードでは、SwooleProxyServer クラスを呼び出して TCP プロキシ サービスをインスタンス化し、ポート 8080 をリッスンし、関連するパラメータを設定します。このうち、load_balance パラメーターは負荷分散戦略を指定します。これは、ポーリング、ランダム、および重みベースの方法から選択できます。 server_list パラメーターは、バックエンド サービスのアドレス リストを指定します。

次に、クライアントで、Swoole の TCP クライアント コンポーネントを通じて TCP プロキシ サービスにリクエストを送信します。

$client = new SwooleClient(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->set(
    array(
        'open_length_check' => true,
        'package_length_type' => 'N',
        'package_length_offset' => 0,
        'package_body_offset' => 4,
        'package_max_length' => 2000000, //最大数据长度
    )
);
$client->on('connect', function ($cli) {
    $cli->send("hello,world
");
});
$client->on('receive', function ($cli, $data) {
    echo "Receive: $data";
});
$client->on('error', function ($cli) {
    echo "Connect failed
";
});
$client->on('close', function ($cli) {
    echo "Connection close
";
});
$client->connect('127.0.0.1', 8080, 0.5);

Swoole の TCP クライアント コンポーネント エンドを呼び出して TCP クライアントをインスタンス化し、関連するパラメーターを設定し、リクエストを TCP プロキシ サービスに送信します。 TCP プロキシ サービスは、負荷分散ポリシーに従ってリクエストをバックエンド サーバーに転送し、応答結果をクライアントに返します。

  1. Swoole ベースのリバース プロキシ サーバー

Swoole は、フロントエンド サーバーに直接展開して負荷分散とリバース プロキシを実現できるリバース プロキシ サーバーも提供します。まず、リバース プロキシ サーバーで、Swoole のリバース プロキシ サービス コンポーネントを開始します。

$proxy = new SwooleServer('0.0.0.0', 80, SWOOLE_PROCESS);
$proxy->set(
    array(
        'worker_num' => 2, //工作进程数
        'daemonize' => true, //守护进程模式
        'max_conn' => 10000, //最大连接数
        'open_http2_protocol' => true, //启用HTTP2协议
        'ssl_cert_file' => '/path/to/server.crt', //SSL证书文件
        'ssl_key_file' => '/path/to/server.key', //SSL证书私钥
        'ssl_verify_peer' => false, //SSL客户端验证
        'ssl_allow_self_signed' => false, //允许使用自签名证书
        'ssl_client_cert_file' => '/path/to/client.crt', //SSL客户端证书文件
    )
);
$proxy->on('request', function ($request, $response) {
    $filePath = '/path/to/static/files' . $request->server['request_uri'];
    $contentType = getMimeType($filePath);
    if (is_file($filePath)) {
        $response->header('Content-Type', $contentType);
        $response->sendFile($filePath);
    } else {
        $proxy = new SwooleHttpClient('www.example.com', 80);
        $proxy->set(
            array(
                'timeout' => 3,
                'keep_alive' => false,
            )
        );
        $proxy->on('error', function ($cli) use ($response) {
            $response->statusCode(503);
            $response->end();
        });
        $proxy->on('close', function ($cli) use ($response) {
            $response->end();
        });
        $proxy->on('receive', function ($cli, $data) use ($response) {
            $response->header('Content-Type', 'text/html');
            $response->end($data);
        });
        $headers = array();
        foreach ($request as $key => $value) {
            if (strpos($key, 'HTTP_') === 0) {
                $headers[strtolower(str_replace('_', '-', substr($key, 5)))] = $value;
            }
        }
        $proxy->setHeaders($headers);
        $proxy->execute($request->server['request_method'], $request->server['request_uri']);
    }
});
$proxy->start();

上記のコードでは、SwooleServer クラスを呼び出してリバース プロキシ サーバーをインスタンス化し、ポート 80 をリッスンして、関連パラメーターを設定します。 on('request') コールバック関数では、要求されたファイルが存在するかどうかを判定し、存在する場合はファイルの内容を直接送信し、存在しない場合はバックエンドサーバーにリクエストを転送してレスポンスを返します。結果が返されます。リクエストを転送するときは、Swoole の HTTP クライアント コンポーネントを通じてリクエストを実装し、リクエストをバックエンド サーバーに送信し、応答結果をクライアントに返します。

次に、リバース プロキシ サーバーを複数のサーバーに展開し、Nginx や LVS などの負荷分散ソフトウェアを使用して、リクエストのバランスのとれた分散を実現します。 Swoole のリバース プロキシ サーバーは HTTP2 プロトコルをサポートしているため、パフォーマンスと同時実行機能を効果的に向上させることができ、SSL 暗号化とクライアント検証もサポートしているため、システムのセキュリティが向上します。

要約すると、Swoole は TCP プロキシ サービスの負荷分散を実装するためのさまざまな方法を提供しており、実際のニーズとシナリオに応じて適切なソリューションを選択できます。パラメータを適切に構成し、適切な負荷分散戦略を選択することにより、システムの可用性とスループットを効果的に向上させることができます。

以上がSwoole が TCP プロキシ サービスの負荷分散を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター