UbuntuでのWebアプリケーションのスケーリング

Webアプリケーションのスケーリングは、Web管理者がしなければならない最もエキサイティングなことの1つです。 スケーリングは、システム管理者が複数のサーバーを利用して単一のWebアプリケーションを提供するプロセスです。

ほとんどのスケーリングでは、Webサーバーとデータベースを分離し、各側面に冗長システムを追加します。

この記事では、冗長Webサーバーを追加することにより、アプリケーションを1台のサーバーから2台に移行する手順について説明します。

2つのサーバー(「サーバーA」および「サーバーB」と呼ばれます)がWebサーバーになり、負荷分散にnginxを使用します。

このチュートリアルのすべての例では、次のサーバーからIPへのマップが適用されます。

サーバーA:1.1.1.1

サーバーB:2.2.2.2

サーバーAとBは、nginxと呼ばれるプログラムを使用して負荷分散されます。 NginxはWebサーバー自体で機能できますが、この場合、Apacheを実行している2つのサーバー間のロードバランサーにのみ使用します。

ステップ1-サーバーAでNginxを構成する

次の手順により、サーバーAとサーバーBがWebサイトトラフィックからの負荷を共有します。

最初に行うことは、サーバーAにnginxをインストールして、負荷分散を行うことです。

 
sudo apt-get install nginx php5-fpm

インストールしたら、少し設定する必要があります。 / etc / nginx / sites-enabled / defaultを編集し、nginxにWebサイトが実際にホストされるIPアドレスとポート番号を通知する必要があります。

先に進み、そのファイルを開きます。

sudo nano /etc/nginx/sites-enabled/default

これは、アップストリームブロックで実行できます。 ここにアップストリームブロックの例を示し、以下に1行ずつ説明します。 次の一連の例では、

upstream nodes {
	ip_hash; 
        server 1.1.1.1:8080 max_fails=3 fail_timeout=30s;
	server 2.2.2.2:8080 max_fails=3 fail_timeout=30s; 
}

最初の行はアップストリームブロックを定義し、「ノード」という名前を付け、最後の行はそのブロックを閉じます。

アップストリームブロックはいくつでも作成できますが、一意の名前を付ける必要があります。

2つの「サーバー」ラインは重要なものです。 これらは、実際のWebサーバーがリッスンしているIPアドレスとポート番号を定義します。

このIPアドレスは、nginxを実行しているのと同じサーバーのIPアドレスである可能性があることに注意してください。

その場合でも、80以外のポートを使用することをお勧めします。

エンドユーザーがWebサーバーの負荷分散に使用される個々のサーバーに誤って遭遇するのを防ぎたいため、デフォルトのHTTPポート以外のポートをお勧めします。

アップストリーム内のサーバーへのすべてのWeb接続は、nginxを実行しているサーバーのIPアドレスから発信されるため、ファイアウォールを予防策として使用することもできます。 Webサーバーのセキュリティを強化する手順については、この記事の後半で説明します。

次に行う必要があるのは、特定のホスト名のリクエストに応答して転送するようにnginxを構成することです。 proxy_pass行を含むvirtualhostブロックを使用して、これらの両方を実現できます。

例と説明については、以下を参照してください。

server {
        listen   1.1.1.1:80;

        root /path/to/document/root/;
        index index.html index.htm;

        server_name domain.tld www.domain.tld;

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        location / {
                proxy_pass http://nodes;
        }
}

この構成には、「listen」行、「server_name」行、「location」ブロックなど、いくつかの重要な要素があります。

必ずドキュメントルートを編集して、サイトを指すようにしてください

最初の2つは標準の構成要素であり、WebサーバーがそれぞれリッスンしているIPアドレスとポートを指定しますが、サーバーの負荷分散を可能にする最後の要素である「location」ブロックです。

サーバーAは、ユーザーが接続するエンドポイントと負荷分散サーバーの1つの両方として機能するため、着信接続を非標準ポートでリッスンする2番目の仮想ホストブロックを作成する必要があります。

server {
        listen   127.0.0.1:8080; 

         root /path/to/document/root/;
        index index.html index.htm index.php;

        server_name domain.tld www.domain.tld;

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

完了したら、nginxをリロードします。

sudo service nginx reload

ステップ2-サーバーBでnginxを構成する

サーバーBに同様の仮想ホストブロックを設定して、ドメインの要求にも応答するようにする必要があります。 これは、サーバーAにある2番目のサーバーブロックと非常によく似ています。

server {
        listen   2.2.2.2:8080; 

        root /path/to/document/root/;
        index index.html index.htm index.php;

        server_name domain.tld www.domain.tld;

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

2番目のサーバーにもnginxをリロードします。

sudo service nginx reload

これが、このサーバーで実行する必要がある唯一の構成です。

負荷分散されたWebサーバーを処理する場合の欠点の1つは、サーバー間でデータが同期していない可能性があることです。

この問題の解決策は、各サーバーに同期するためにgitリポジトリを使用することである可能性があります。これは、将来のチュートリアルの主題になります。

これで、負荷分散された構成が機能するはずです。 いつものように、コメントでのフィードバックは大歓迎です!

ジェイソン・カーツ