WordPressのカスタマイズやテーマファイル、プラグインの作り方などデータベース構造から詳しく解説します。

EC2で冗長化したWordPressをGithubでコード管理、rsyncで同期する

2015.03.27

AWS上のWordPressをGithubでコード管理する

EC2やRDS、ELBを用いて冗長構成を構築する方はこちらの記事でご紹介しています。
今回はこの続きで、Github上でコード管理を行いrsyncでWebサーバー間の同期を実現する手順をご紹介します。

Github連携手順

WordPressでのGithub連携の際にキモとなるのは.gitignoreの設定と、連携を行う手順です。

.gitignoreを設定

たとえばDB接続用アカウントのユーザー名やパス、ホストが記載されているwp-configはサーバーごとに設定内容が違うので、Githubで共有してしまっては困りますよね。
また、投稿画像が格納される/wp-content/uploads/も同様です。
これらをGithubで共有しないために、.gitignoreというファイルを作成してGit管理下から外すファイル/ディレクトリを記述します。
Github上に、WordPress用の.gitignoreファイルが公開されているので参考にしてみてください。
(僕はこのまま使っています。)

*.log
.htaccess
sitemap.xml
sitemap.xml.gz
wp-config.php
wp-content/advanced-cache.php
wp-content/backup-db/
wp-content/backups/
wp-content/blogs.dir/
wp-content/cache/
wp-content/upgrade/
wp-content/uploads/
wp-content/wp-cache-config.php

連携を行う手順

既にファイルが存在している状態で、これから新たにGitを導入する手順になります。
1.Gitをインストールしinitする

#EC2に接続後
sudo yum install git #gitのインストール
cd /var/www
git init #gitの初期設定

2./var/www/htmlをコピー
※前回記事でご紹介したように、S3を/wp-content/uploads/に仮想マウントしている状況から、Git管理を行う手順になります。
既にGithub上でレポジトリを作成し、該当レポジトリにローカルからコードをpush済みとします。
次にこのレポジトリから/var/www/html/へcloneをしたいわけですが、空でないディレクトリへcloneをすることができません。
そこで、s3fsで仮想マウントしているS3バゲットをアンマウントしたのち、一旦/var/www/htmlのコピーをとり、/var/www/htmlを空に。
その後wp-configなど必要ファイルをコピーし、S3を再度マウントします。

sudo fusermount -u /var/www/html #S3をアンマウント
cp /var/www/html /var/www/html_bu #コピー
sudo rm -rf /var/www/html
mkdir /var/www/html
cd /var/www
git clone レポジトリURL html #htmlフォルダ内にClone
cp /var/www/html_bu/wp-config.php /var/www/html #必要ファイルをコピー
sudo /usr/local/bin/s3fs バゲットURL /var/www/html/wp-content/uploads -o rw,allow_other,uid=(ユーザーID),gid=(グループID),default_acl=public-read

wp-config以外にもdb-config.phpなど必要なファイルを適宜コピーし、サイトへアクセス、問題なく表示される事を確認して下さい。
これで次回以降、/var/www/htmlまで移動してgit pullをすればGithub上のコードが反映される体制が整いました。

rsyncで同期

次に、Webサーバーを冗長化しているため、各Webサーバーへ/wp-contents/themesと/wp-contents/pluginsなど自分が変更を加える可能性のあるディレクトリをrsyncを使って同期するように設定をします。
参考にしたのはこちら。
同期設定(rsync)を今一度整理してみる
僕はユーザー設定は省略しましたが、つまずいたのは同期の方向です。
「同期元」と「同期先」の定義がややこしいのですが、Gitを導入し最新のコードが反映されるサーバーを便宜的にマスターサーバー、マスターサーバーから同期を必要とするサーバーをスレイブサーバーと呼びます。

マスターサーバー

・rsyncをインストール
・同期が必要なときにrsyncコマンドを実行

スレイブサーバー

・rsync,xinetdをインストール
・/etc/xinetd.d/rsync、/etc/rsyncd.confを参考サイトを見ながら編集
※参考

#--------------
# Global options
#--------------
uid           = root
gid           = root
log file      = /var/log/rsyncd.log
pid file      = /var/run/rsyncd.pid
hosts allow   = VPCのプライベートIP
hosts deny    = *
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png


#--------------
# Module options
#--------------
[themes]
        comment      = update themes
        path         = /var/www/html/wp-content/themes/
        use chroot    = true
        read only    = false
        exclude      = *.mp
        include      = *.mp30

[plugins]
        comment      = update plugins
        path         = /var/www/html/wp-content/plugins/
        use chroot    = true
        read only    = false
        exclude      = *.mp
        include      = *.mp30

となります。途中で混乱しないようご注意下さい。また、EC2間の接続にはパブリックIPではなくプライベートIPを使用します。
パブリックIPはインスタンスの再起動の度に変更されてしまうからです。(Elastic IPを割り振って固定化しない限り)
この状態で

rsync -aIvz /var/www/html/wp-content/themes/ スレイブのプライベートIP::themes
rsync -aIvz /var/www/html/wp-content/plugins/ スレイブのプライベートIP::plugins

を実行して、それぞれ同期が行われれば成功です。

シェルスクリプト+aliasでコマンド登録

最後に、git pull からrsyncの実行まで一連の流れをコマンドとして登録します。

shellファイルの作成

マスターサーバーへとssh接続し、

cd /usr/local/bin
sudo vim update.sh
#!/bin/sh
cd /var/www/html;
git pull https://Gitユーザー名:パスワード@github.com/レポジトリ.git;
rsync -aIvz /var/www/html/wp-content/themes/ スレイブのプライベートIP::themes
rsync -aIvz /var/www/html/wp-content/plugins/ スレイブのプライベートIP::plugins
:wq
./update.sh

これでshellファイルの作成と実行をテストしています。shellファイルとは、複数コマンドを1つのファイルとしてまとめて記述し、該当ディレクトリで./ファイル名.shと入力するとファイル内のコマンドが順次実行される仕組みです。
これを活用してGitの操作とrsyncの同期の操作をひとつにまとめます。

aliasの登録

最後に、ssh接続してshellファイルを実行するまでを一つのコマンドとしてローカルマシンに登録します。

cd ~/
vim .bash_profile
alias コマンド名='ssh ホスト名 "cd /usr/local/bin;./update.sh"'

これでローカルで指定したコマンドを入力するだけで、Githubからのコード反映と、サーバー間の同期が自動で実行されます。

関連記事

ページ上部へ戻る