スケーラブルなWordPressサイトの展開の自動化

前書き

このガイドでは、MySQLデータベースサーバー、GlusterFS分散ファイルシステム、Nginx Webサーバー、およびNginxロードバランサーで構成されるスケーラブルなWordPressインスタンスを作成してデプロイします。 user-dataおよびhttps://www.digitalocean.com/community/tutorials/an-を使用してドロップレットメタデータの紹介[ドロップレットメタデータ]、サイトの展開を自動化します。 最後に、このプロセス全体を自動化し、スケーラブルなWordpressサイトの作成を容易にするRubyスクリプトを提供します。 このチュートリアルでは、DigitalOceanにサービスを展開する際のユーザーデータとDropletメタデータの能力と柔軟性について学習します。

ステップ1-展開の計画

このチュートリアルで作成するデプロイメントは、単一のMySQLデータベースサーバー、クラスター内の複数のGlusterFSサーバー、複数のNginx Webサーバー、および単一のNginxロードバランサーで構成されます。

image:https://assets.digitalocean.com/articles/automate_wp_cluster/wp-cluster.png [WordPressの展開]

始める前に知っておくべきこと:

  • MySQLサーバーに使用するDropletのサイズ

  • 作成するGlusterFSノードの数

  • GlusterFSノードのサイズ

  • 必要なWebサーバーノードの数

  • Webサーバーに使用するドロップレットのサイズ

  • ロードバランサーに使用するドロップレットのサイズ

  • 新しいサイトに使用するドメイン名

後で必要になる場合は、追加のノードを追加するか、作成したノードを拡大できます。 これらの詳細を決定したら、サイトの展開を開始できます。

ステップ2-MySQLの展開

まず、MySQLサーバーを展開します。 これを行うには、次のユーザーデータを使用してデフォルトのUbuntu 14.04 x64ドロップレットを作成します。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PUBLIC_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install mysql-server;
mysqladmin -u root create wordpress;
mysqladmin -u root password "";
sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;
mysql -uroot -p -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY ''";
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";

このユーザーデータスクリプトは、新しいドロップレットで次の機能を実行します。

まず、パッケージをインストールするときに入力を求めないようにするために、非インタラクティブモードで実行していることを「+ apt-get +」に伝える変数をエクスポートします。

export DEBIAN_FRONTEND=noninteractive;

次に、Dropletメタデータを使用して、DropletのパブリックおよびプライベートIPアドレスを取得し、変数に割り当てます。

export PUBLIC_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
Note: Droplet Meta-Data is not available in NYC1, NYC2, and AMS1 at this time.

次に、 `+ apt +`を使用してMySQLサーバーをインストールします。

apt-get update;
apt-get -y install mysql-server;

ここで、* wordpress *という新しいデータベースを作成する必要があります。

mysqladmin -u root create wordpress;

次に、MySQLルートユーザーのパスワードを設定します。

mysqladmin -u root password "";

MySQLサーバーはWebサーバーからのクエリを受け入れるため、 `+ localhost`だけでなくプライベートIPアドレスでリッスンする必要があります。 これを行うには、 `+ sed +`を使用して、検索と置換を実行し、サービスを再起動してMySQL構成ファイルを更新します。

sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;

最後に、* wordpress *という新しいMySQLユーザーを作成し、_wordpress_データベースへのアクセス許可を付与します。

mysql -uroot -p -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY ''";
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";

このユーザーデータスクリプトを使用して新しいDropletをデプロイすると、SSHまたはコンソール経由でログインすることなく、プライベートIPアドレスでリッスンされた構成済みのMySQLサーバーと、構成済みのデータベースとユーザーが作成されます。

ステップ3-GlusterFSの展開

GlusterFSクラスターをデプロイする前に、デプロイするノードの数を決定する必要があります。 この決定には2つの変数があります。 まず、必要なスペースの量を決定する必要があります。次に、使用するレプリカ設定を決定する必要があります。 レプリカ設定は、保存するファイルのコピーの数をGlusterFSに伝えます。 たとえば、レプリカ設定が2の場合、すべてのファイルが少なくとも2つのサーバーに複製されます。 各ファイルのコピーを2つ保持しているため、使用可能なストレージが半分になりますが、冗長性が向上します。 作成するGlusterFSノードの数は、レプリカ設定の倍数でなければなりません。 レプリカ設定が2のクラスターの場合、2の倍数でノードを作成する必要があります(したがって、2、4、6、または8ノードが許容されます)。

この例では、レプリカ設定2を使用して4ノードのGlusterFSクラスターをデプロイします。

最初の3つのノードでは、次のユーザーデータスクリプトを使用します。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
apt-get update;
apt-get install -y python-software-properties;
add-apt-repository -y ppa:gluster/glusterfs-3.5;
apt-get update;
apt-get install -y glusterfs-server;

繰り返しますが、最初に `+ DEBIAN_FRONTEND `変数を設定して、 ` apt +`が非インタラクティブモードで実行されていることを認識します。

export DEBIAN_FRONTEND=noninteractive;

次に、 `+ apt `データベースを更新し、GlusterFS用のhttps://help.launchpad.net/Packaging/PPA[PPA]を追加するために必要な ` python-software-properties +`をインストールします。

apt-get update;
apt-get install -y python-software-properties;

次に、debパッケージを取得できるように、GlusterFS PPAを追加します。

add-apt-repository -y ppa:gluster/glusterfs-3.5;

次に、 `+ apt +`データベースを再度更新し、glusterfs-serverをインストールします。

apt-get install -y glusterfs-server;

最初の3つのノードでは、これですべてです。 最終的なGlusterFSノードを作成してボリュームを作成するときに必要になるため、これらの新しいDropletのそれぞれに割り当てられたプライベートIPアドレスをメモします。

最後のノードでは、次のユーザーデータスクリプトを使用します。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get install -y python-software-properties;
add-apt-repository -y ppa:gluster/glusterfs-3.5;
apt-get update;
apt-get install -y glusterfs-server;
sleep 30;
gluster peer probe ;
gluster peer probe ;
gluster peer probe ;
gluster volume create file_store  transport tcp    $PRIVATE_IP:/gluster force;
gluster volume start file_store;
Note: If you do not want to enable replication you should not include the "replica" setting in your "volume create" command.

このユーザーデータスクリプトの最初のセクションは、他のGlusterFSノードで使用したものとかなり似ていますが、新しいDropletのプライベートIPを$ PRIVATE_IP変数に割り当てています。 ただし、 `+ glusterfs-server +`をインストールしたら、追加の作業を行います。

まず、スクリプトは新しいglusterfs-serverが起動して利用可能になるまで30秒待機します。

sleep 30

次に、4つすべてをクラスターに追加するために、前に作成した3つのGlusterFSドロップレットをプローブします。

gluster peer probe ;
gluster peer probe ;
gluster peer probe ;

次に、レプリカ設定が2で、4つのノードすべてを含む「filestore」という名前のGlusterFSボリュームを作成します。 最新のノードのIPアドレスがわからないため、$ PRIVATEIP変数を使用します。

gluster volume create file_store replica 2 transport tcp    $PRIVATE_IP:/gluster force;

最後に、新しいボリュームを開始して、クライアントからアクセスできるようにします。

gluster volume start file_store;

これで、すべてのWebサーバーノードがアクセスできるWordPressファイルを保持できる分散ファイルシステムができました。

ステップ4-Nginx Webサーバーの展開

データベースサーバーと分散ファイルシステムがすべて設定されたので、Webサーバーを展開できます。 次のユーザーデータスクリプトを使用して、最初のNginx Webサーバーノードを展開し、GlusterFSボリューム内にWordPressインストールを構成します。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;
sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;
mkdir /gluster;
mount -t glusterfs  /gluster;
echo " /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
mkdir /gluster/www;
wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;
# Get Wordpress Files
wget https://wordpress.org/latest.tar.gz -O /root/wp.tar.gz;
tar -zxf /root/wp.tar.gz -C /root/;
cp -Rf /root/wordpress/* /gluster/www/.;
cp /gluster/www/wp-config-sample.php /gluster/www/wp-config.php;
sed -i "s/'DB_NAME', 'database_name_here'/'DB_NAME', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_USER', 'username_here'/'DB_USER', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_PASSWORD', 'password_here'/'DB_PASSWORD', ''/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', ''/g" /gluster/www/wp-config.php;
chown -Rf www-data:www-data /gluster/www;

このスクリプトは以前のスクリプトよりも少し複雑なので、ステップごとに分けてみましょう。

最初に、以前のスクリプトの場合と同様に、 `+ DEBIAN_FRONTEND `変数を再度設定し、 ` $ PRIVATE_IP +`変数を設定します。

export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)

次に、 `+ apt +`データベースを更新し、必要なNginx、glusterfsクライアント、およびphpライブラリをインストールします。

apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;

次に、「+ sed 」の検索および置換機能を使用して、「 php.ini +」ファイルを更新し、cgi.fixpathinfo変数を0に設定します。

sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;

次に、ディスクイメージのルートに「+ / gluster +」というフォルダーを作成し、そこにGlusterFSボリュームをマウントします。 次に、fsletエントリを作成して、GlusterFSボリュームがドロップレットの起動時に自動的にマウントされるようにします。

mkdir /gluster;
mount -t glusterfs  /gluster;
echo " /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;

次に、GlusterFSボリュームに「+ www +」というフォルダーを作成します。 このフォルダーはWebルートとして機能します。

mkdir /gluster/www;

次に、リモートサーバーから新しいNginx構成ファイルを取得します。 このファイルはWebルートを「+ / gluster / www +」に設定し、NginxがPHPを使用するように設定されていることを確認します。 この構成ファイルはhttps://raw.githubusercontent.com/ryanpq/do-wpc/master/default[here]で確認できます。 Nginx構成ファイルを置き換えたら、この変更を有効にするためにサービスを再起動します。

wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;

次に、WordPressの最新バージョンのコピーを取得し、それを抽出して、そのコンテンツを新しいWebルートにコピーします。

wget https://wordpress.org/latest.tar.gz -O /root/wp.tar.gz;
tar -zxf /root/wp.tar.gz -C /root/;
cp -Rf /root/wordpress/* /gluster/www/.;

次に、サンプルのWordPress設定ファイルを `+ wp-config.php`にコピーします。

cp /gluster/www/wp-config-sample.php /gluster/www/wp-config.php;

そして、 `+ sed +`の検索および置換機能を使用して、新しい環境に合わせて変数を更新します。

sed -i "s/'DB_NAME', 'database_name_here'/'DB_NAME', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_USER', 'username_here'/'DB_USER', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_PASSWORD', 'password_here'/'DB_PASSWORD', ''/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', ''/g" /gluster/www/wp-config.php;

最後に、Webルートのファイルが、Nginxプロセスを実行するユーザー* www-data *によって所有されていることを確認します。

chown -Rf www-data:www-data /gluster/www;

これで、最初のWebサーバーノードがすべて設定され、リクエストを受信する準備が整いました。

各Webサーバーノードはストレージ用に同じGlusterFSボリュームを共有するため、作成する追加ノードごとの手順は少なくなります。 追加のノードには、次のユーザーデータスクリプトを使用します。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;
sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;
mkdir /gluster;
mount -t glusterfs  /gluster;
echo " /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
mkdir /gluster/www;
wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;

追加のWebノードについては、同じパッケージをインストールし、GlusterFSボリュームをマウントし、Nginx構成ファイルを置き換えますが、最初のノードを作成するときにこれを行ったため、WordPressインスタンスをセットアップする必要はありません。

ステップ5-ロードバランサーの展開

この展開の最後の手順は、ロードバランサーを作成することです。 この目的のために、別のNginxサーバーを使用します。 このノードをセットアップするには、次のユーザーデータスクリプトを使用します。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
apt-get update;
apt-get -y install nginx;
lbconf="
server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.php index.html index.htm;

   location / {
     proxy_pass  http://backend;
     include proxy_params;
   }

}

upstream backend  {
   ip_hash;
   server
   server
}
"
echo $lbconf > /etc/nginx/sites-enabled/default;
service nginx restart;

ロードバランサーのユーザーデータスクリプトについては、スクリプトでNginx構成を直接構築します。 非インタラクティブモードで実行していることを `+ apt +`が認識していることを確認することで、他のDropletで行ったように始めます。

export DEBIAN_FRONTEND=noninteractive;

次に、Nginxをインストールします。

apt-get update;
apt-get -y install nginx;

次に、 `+ lbconf +`という変数に新しいNginx設定を作成します。 _upstream backend_セクションで各Webサーバーのエントリを追加します。

lbconf="
server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.php index.html index.htm;

   location / {
     proxy_pass  http://backend;
     include proxy_params;
   }

}

upstream backend  {
   ip_hash;
   server
   server
}
"

次に、Nginx設定ファイルに変数「+ lbconf +」を書き込み、現在のコンテンツを置き換えます。

echo $lbconf > /etc/nginx/sites-enabled/default;

そして最後に、この構成を有効にするためにNginxを再起動します。

service nginx restart;

ステップ6-DNSのセットアップ

ここで、ブラウザから新しいWordPressサイトにアクセスする前に、そのサイトのDNSエントリを設定する必要があります。 これはコントロールパネルから行います。

DigitalOceanコントロールパネルで、* DNS *をクリックします。 *ドメインの追加*フォームで、ドメイン名を入力し、ドロップダウンメニューからロードバランサードロップレットを選択して、*ドメインの作成*をクリックします。

サイトで* www *サブドメインを使用するには、この新しいドメインに別のレコードを作成する必要があります。

[レコードの追加]をクリックして、* CNAME レコードタイプを選択します。 名前フィールドに www と入力し、ホスト名フィールドに @ *と入力します。 これにより、wwwサブドメインの要求がメインドメイン(ロードバランサードロップレット)と同じ場所に転送されます。

ステップ7-WordPressの設定

すべてのドロップレットを起動してドメインを構成したので、Webブラウザーで新しく構成したドメインにアクセスして、新しいWordPressサイトにアクセスできます。

画像:https://assets.digitalocean.com/articles/automate_wp_cluster/wp-setup.png [Wordpressの設定]

ユーザーアカウントを作成し、新しいサイトに名前を付けるように求められます。 これが完了すると、展開が完了し、新しいサイトの使用を開始できます。

ステップ8-プロセスの自動化

ドロップレットにsshする必要なくWordPressデプロイメントを作成できるようになったので、さらに一歩進んでhttps://developers.digitalocean.com/documentation/v2/[DigitalOcean API]を使用してこのプロセスを自動化できます。

このチュートリアルに基づいてサンプルRubyスクリプトが作成され、ユーザーに関連する詳細を入力して、新しいスケーラブルなWordPressインスタンスを自動的にデプロイするように求められます。 このスクリプトはhttps://github.com/ryanpq/do-wpc[on GitHub]にあります。

結論

現在、スケーラブルなWordPress展開を行っていますが、新しいサイトが安全で安定していることを確認するために実行できる追加の手順があります。

Related