スケーラブルな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.04x64ドロップレットを作成します。
#!/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サーバーからのクエリを受け入れるため、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 -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;
次に、GlusterFSボリュームにwww
というフォルダーを作成します。 このフォルダは、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;
次に、lbconf
という変数に新しいNginx構成を作成します。 アップストリームバックエンドセクションに各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の展開ができましたが、新しいサイトの安全性と安定性を確保するために実行できる追加の手順があります。