スケーラブルなWordPressサイトの展開の自動化
序章
このガイドでは、MySQLデータベースサーバー、GlusterFS分散ファイルシステム、Nginx Webサーバー、およびNginxロードバランサーで構成されるスケーラブルなWordPressインスタンスを作成してデプロイします。 user-dataとDropletmeta-data を使用して、サイトの展開を自動化します。 最後に、このプロセス全体を自動化し、スケーラブルなWordpressサイトの作成を容易にするRubyスクリプトを提供します。 このチュートリアルでは、DigitalOceanにサービスを展開する際のユーザーデータとDropletメタデータの能力と柔軟性について学習します。
ステップ1—展開の計画
このチュートリアルで作成するデプロイメントは、単一のMySQLデータベースサーバー、クラスター内の複数のGlusterFSサーバー、複数のNginx Webサーバー、および単一のNginxロードバランサーで構成されます。
始める前に、次のことを知っておく必要があります。
- MySQLサーバーに使用するドロップレットのサイズ
- 作成するGlusterFSノードの数
- GlusterFSノードのサイズはどのくらいになりますか
- 必要なWebサーバーノードの数
- Webサーバーに使用するドロップレットのサイズ
- ロードバランサーに使用するドロップレットのサイズ
- 新しいサイトに使用するドメイン名
後で必要になった場合は、ノードを追加したり、作成したノードをスケールアップしたりできます。 これらの詳細を決定したら、サイトの展開を開始できます。
ステップ2—MySQLのデプロイ
まず、MySQLサーバーをデプロイします。 これを行うには、次のユーザーデータを使用してデフォルトのUbuntu14.04×64ドロップレットを作成します。
#!/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 "mysql_password";
sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;
mysql -uroot -pmysql_password -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY 'mysql_password'";
mysql -uroot -pmysql_password -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";
このユーザーデータスクリプトは、新しいドロップレットで次の機能を実行します。
まず、次のように指示する変数をエクスポートします apt-get
パッケージのインストール時に入力の入力を求められないように、非対話型モードで実行していること。
export DEBIAN_FRONTEND=noninteractive;
次に、Dropletメタデータを使用してDropletのパブリックIPアドレスとプライベート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;
次に、MySQLrootユーザーのパスワードを設定します。
mysqladmin -u root password "mysql_password";
MySQLサーバーはWebサーバーからのクエリを受け入れるため、プライベートIPアドレスだけでなく、プライベートIPアドレスでリッスンする必要があります。 localhost
. これを行うには、 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 -pmysql_password -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY 'mysql_password'";
mysql -uroot -pmysql_password -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
データベースとインストール python-software-properties
、GlusterFSのPPAを追加するために必要です。
apt-get update;
apt-get install -y python-software-properties;
次に、GlusterFS PPAを追加して、debパッケージを取得できるようにします。
add-apt-repository -y ppa:gluster/glusterfs-3.5;
次に、更新します apt
データベースを再度作成し、glusterfs-serverをインストールします。
apt-get install -y glusterfs-server;
最初の3つのノードでは、これが必要なすべてです。 最終的なGlusterFSノードを作成してボリュームを作成するときに必要になるため、これらの新しいドロップレットのそれぞれに割り当てられたプライベート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 node1_private_ip;
gluster peer probe node2_private_ip;
gluster peer probe node3_private_ip;
gluster volume create file_store replica 2 transport tcp node1_private_ip:/gluster node2_private_ip:/gluster node3_private_ip:/gluster $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 node1_private_ip;
gluster peer probe node2_private_ip;
gluster peer probe node3_private_ip;
次に、レプリカ設定が2で、4つのノードすべてを含む「file_store」という名前のGlusterFSボリュームを作成します。 最新のノードのIPアドレスはまだわからないため、$PRIVATE_IP変数を使用します。
gluster volume create file_store replica 2 transport tcp node1_private_ip:/gluster node2_private_ip:/gluster node3_private_ip:/gluster $PRIVATE_IP:/gluster force;
最後に、新しいボリュームを開始して、クライアントからアクセスできるようにします。
gluster volume start file_store;
これで、すべてのWebサーバーノードからアクセスできるWordPressファイルを保持できる分散ファイルシステムができました。
ステップ4—NginxWebサーバーのデプロイ
データベースサーバーと分散ファイルシステムがすべて設定されたので、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 gluter_node_private_ip:/file_store /gluster;
echo "gluster_node_private_ip:/file_store /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', 'mysql_password'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', 'mysql_private_ip'/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ボリュームをマウントします。 次に、fstabエントリを作成して、Dropletの起動時にGlusterFSボリュームが自動的にマウントされるようにします。
mkdir /gluster;
mount -t glusterfs gluter_node_private_ip:/file_store /gluster;
echo "gluster_node_private_ip:/file_store /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
次に、というフォルダを作成します www
GlusterFSボリュームで。 このフォルダは、Webルートとして機能します。
mkdir /gluster/www;
次に、リモートサーバーから新しいNginx構成ファイルをプルします。 このファイルは、Webルートをに設定します /gluster/www
NginxがPHPを使用するように構成されていることを確認します。 この構成ファイルはここで表示できます。 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', 'mysql_password'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', 'mysql_private_ip'/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_node_private_ip:/file_store /gluster;
echo "gluster_node_private_ip:/file_store /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 web_node_1_private_ip
server web_node_2_private_ip
}
"
echo $lbconf > /etc/nginx/sites-enabled/default;
service nginx restart;
ロードバランサーのユーザーデータスクリプトでは、スクリプトで直接Nginx構成を構築します。 他のドロップレットと同じように、次のことを確認して開始します。 apt
非対話型モードで実行していることを認識しています。
export DEBIAN_FRONTEND=noninteractive;
次に、Nginxをインストールします。
apt-get update;
apt-get -y install nginx;
次に、という変数に新しいNginx構成を作成します lbconf
. アップストリームバックエンドセクションに各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 web_node_1_private_ip
server web_node_2_private_ip
}
"
次に、 lbconf
Nginx構成ファイルの変数で、現在のコンテンツを置き換えます。
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サイトにアクセスできます。
ここで、ユーザーアカウントを作成し、新しいサイトに名前を付けるように求められます。 これが完了すると、展開が完了し、新しいサイトの使用を開始できます。
ステップ8—プロセスの自動化
DropletにSSH接続することなくWordPressデプロイメントを作成できるようになったので、さらに一歩進んで、 DigitalOceanAPIを使用してこのプロセスを自動化できます。
このチュートリアルに基づいてサンプルのRubyスクリプトが作成されました。このスクリプトは、ユーザーに関連する詳細を提供するように促し、新しいスキャブル可能なWordPressインスタンスを自動的にデプロイします。 このスクリプトはGitHubにあります。
結論
これでスケーラブルなWordPressの展開ができましたが、新しいサイトの安全性と安定性を確保するために実行できる追加の手順があります。