Ubuntu12.10でWebアプリケーションをスケーリングする方法
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リポジトリを使用することである可能性があります。これは、将来のチュートリアルの主題になります。
これで、負荷分散された構成が機能するはずです。 いつものように、コメントでのフィードバックは大歓迎です!