ホームページ  >  記事  >  バックエンド開発  >  PHPで負荷分散を実現するにはどうすればよいですか? PHP 負荷分散の例 (コード)

PHPで負荷分散を実現するにはどうすればよいですか? PHP 負荷分散の例 (コード)

不言
不言オリジナル
2018-07-25 15:56:1713537ブラウズ

PHP で負荷分散を実装するにはさまざまな方法があります。ここでは、PHP 負荷分散を紹介します。これ以上の苦労はせずに、PHP 負荷分散の実装を直接見てみましょう。

1. PHP ファイル

最初の質問は、小規模サーバーが多数ある場合、どのようにしてすべてのサーバーに PHP ファイルをアップロードするかということです。サーバー上にあるのですか?参考までに、次の方法があります:

1. すべてのファイルを各サーバーに個別にアップロードします。この方法の問題点は、サーバーが 20 台あると想像すると、アップロード プロセスに非常に時間がかかることです。エラーが発生しやすく、更新時に異なるサーバーに異なるバージョンのファイルが存在する可能性が非常に高くなります。
2. 「rsync」 (または同様のソフトウェア) を使用します。このようなツールを使用すると、ローカル ディレクトリと複数のリモート ホスト ディレクトリ上のファイルを同期できます。
3. バージョン管理ソフトウェア (Subversion など) を使用する これは私のお気に入りの方法です。これにより、コードを非常に適切に保守できるようになり、アプリケーションを公開するときに、各サーバーで svnupdate コマンドを実行してアプリケーションを同期できます。このアプローチにより、サーバーを以前のバージョンのコードに切り替えることも簡単になります。
4. ファイル サーバーを使用します (NFS がこれに非常に適していることがわかります)。この方法は、ファイル サーバーを使用して Web アプリケーションを保存することです。もちろん、ファイル サーバーがダウンすると、サイト全体がダウンしてしまいます。利用できなくなります。この時点で、復旧するにはさらに多くのお金が必要になります。

どの方法を選択するかは、ニーズと持っているスキルによって異なります。バージョン管理システムを使用している場合は、更新コマンドを同時に実行して、すべてのサーバー上のコードを更新する方法を計画するとよいでしょう。ただし、ファイル サーバーを使用する場合は、サーバーがダウンした場合にリクエストの失敗を防ぐために、何らかの障害回復メカニズムを実装する必要があります。

2. ファイルのアップロード

サーバーが 1 つだけの場合、ファイルのアップロードは問題ありません。しかし、複数のサーバーがある場合、アップロードされたファイルはどのように保存されるべきでしょうか?ファイルのアップロードの問題は、クロスサーバー PHP ファイル ストレージに似ています。考えられる解決策は次のとおりです:
1. ファイルをデータベースに保存します。

ほとんどのデータではバイナリ データを保存できます。ファイルのダウンロードを要求すると、アクセス データはバイナリ データと、対応するファイル名と種類をユーザーに出力します。このソリューションを使用する前に、データベースがファイルをどのように保存するかを検討する必要があります。この方法の問題は、データベース サーバーがダウンするとファイルが使用できなくなることです。

2. アップロードされたファイルをファイル サーバーに保存します。

前の紹介と同じように、すべての Web サーバーで共有されるようにファイル サーバーをインストールし、アップロードされたすべてのファイルをここにアップロードする必要があります。 Web サーバーはアップロード後に使用できるようになります。ただし、ファイルサーバーがダウンしている場合、画像ファイルのダウンロードが中断される場合があります。

3. 各サーバーにファイルを転送するための独自のアップロード メカニズムを設計します。

この方法には、単一のファイル サーバーまたはデータベース ソリューションの欠点はありませんが、コードが複雑になります。 。たとえば、複数のサーバーにアップロード中にサーバーがダウンした場合、どうしますか?

データベースを使用してアップロードされたファイルを保存することもできますが、ファイル キャッシュ メカニズムを設計することは良い解決策です。サーバーはファイルのダウンロード要求を受信すると、まずファイルがキャッシュ システムに存在するかどうかを確認し、存在する場合はキャッシュ システムからダウンロードします。存在しない場合はデータベースから読み取ってファイル システムにキャッシュします。

3. セッション

PHP セッション処理に精通している場合は、デフォルトでセッションを保存することをご存知でしょう。サーバー上の一時ファイル内のデータ。さらに、このファイルはリクエストしたサーバー上にのみ存在しますが、後続のリクエストは別のサーバーによって処理される可能性があり、その場合、他のサーバー上に新しいセッションが生成されます。これにより、ログインしたユーザーが常に再ログインを求められるなど、セッションが頻繁に認識されなくなります。

私が推奨する解決策は、PHP の組み込みセッション処理メカニズムを使用してセッション データをデータベースに再保存するか、ユーザーのリクエストが確実に同じサーバーに送信されるように独自のメカニズムを実装することです。

4. 構成

このトピックは PHP とは特に関係ありませんが、それでも言及する必要があると感じます。クラスター化されたサーバーを実行する場合、サーバー間で構成ファイルの同期を保つ何らかの方法を用意することをお勧めします。構成ファイルに一貫性がない場合、非常に奇妙な断続的な動作が発生し、トラブルシューティングが困難になる可能性があります。

バージョン管理システムを使用して個別に管理することをお勧めします。このようにして、さまざまなプロジェクトのインストールに応じてさまざまな php 構成ファイルを保存し、すべてのサーバー構成ファイルの同期を保つことができます。

5. ロギング

設定の問題と同様、ロギングは PHP だけに関連するものではありません。ただし、サーバーを健全な状態に維持することは依然として非常に重要です。適切なログ システムがなければ、PHP コードがエラーを生成し始めたかどうかをどうやって知ることができるでしょうか (システムが正式に実行されているときは、常に display_errors 設定をオフにしますよね?)

いくつかの方法があります。ロギングを実装します:

1. 各サーバーのログを記録します。これが最も簡単な方法です。各マシンは 1 つのファイルのみを記録します。利点は、シンプルで構成がほとんど必要ないことです。ただし、サーバーの数が増えると、各サーバー上のログ ファイルを監視することが非常に困難になります。
2. ログを共有に記録する: 各サーバーにはログ ファイルがまだありますが、ログ ファイルは共有メカニズムを通じて中央のファイル サーバーに保存されるため、ログの監視が容易になります。このソリューションの問題は、ファイル サーバーが利用できない場合、単純なログ書き込みの問題により、最終的にアプリケーション全体がクラッシュすることです。
3. ログ サーバーにログを記録する syslog などのログ ソフトウェアを使用して、すべてのログを中央サーバーに書き込むことができます。この方法ではさらに多くの構成が必要になりますが、最も堅牢なソリューションも提供されます。

#php ロード バランシング インスタンス

ロード バランシングを使用する場合は、http ノードの構成を次のように変更できます。

#设定http服务器,利用它的反向代理功能提供负载均衡支持
            http {
            #设定mime类型,类型由mime.type文件定义
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            #设定日志格式
            access_log    /var/log/nginx/access.log;
#省略上文有的一些配置节点
#。。。。。。。。。。
#设定负载均衡的服务器列表
            upstream mysvr {
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
            server 192.168.8.2x:80  weight=1;
            server 192.168.8.3x:80  weight=6;
            }
upstream mysvr2 {
            #weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.x:80  weight=1;
            server 192.168.8.x:80  weight=6;
            }
#第一个虚拟服务器
            server {
            #侦听192.168.8.x的80端口
            listen       80;
            server_name  192.168.8.x;
#对aspx后缀的进行负载均衡请求
            location ~ .*\.aspx$ {
root   /root;      #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称
proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;    #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;  #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}

関連推奨:

PHP 負荷分散でのセッション共有ケースの詳細な説明 (コード付き)

以上がPHPで負荷分散を実現するにはどうすればよいですか? PHP 負荷分散の例 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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