メモ > サーバ > 各論: エトセトラ > サーバ2台構成でWordPress(rsyncでファイル双方向同期、MySQLレプリケーションでデータベース同期)
サーバ2台構成でWordPress(rsyncでファイル双方向同期、MySQLレプリケーションでデータベース同期)
■前提
AWSに環境を構築したときのメモ
web1とweb2の二台に、WordPressの動作する環境が構築済みとする
■ホスト名の設定(web1、web2とも)
# hostnamectl set-hostname web1.refirio.net
# vi /etc/hosts
※web2では「web1.refirio.net」という名前で同様の設定を行う
■レプリケーションの設定
web1をMaster、web2をSlaveとする
□Master
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 refirio.net refirio.net
↓
127.0.0.1 localhost web1.refirio.net localhost4 localhost4.localdomain4 refirio.net refirio.net
# vi /etc/sysconfig/network
HOSTNAME=web1.refirio.net
$ curl http://10.0.1.42/
# vi /etc/my.cnf
□Slave
[mysqld]
log-bin=mysql-bin
server-id = 1001
# systemctl restart mysql
# mysql -u root -p
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@10.0.1.42 IDENTIFIED BY 'gV0+8k6BM#z7';
mysql> FLUSH PRIVILEGES;
mysql> SELECT host,user FROM mysql.user;
mysql> FLUSH TABLES WITH READ LOCK; … データ手動コピー前にテーブルロック
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 633 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
# cd /var/lib/mysql
# ll
# tar czf wordpress.tar.gz wordpress … MySQLのデータをバックアップ
mysql> UNLOCK TABLES; … データ手動コピー後にテーブルロック解除
# cp /var/lib/mysql/wordpress.tar.gz /usr/share/nginx/html/wordpress.tar.gz
$ wget http://10.0.1.253/wordpress.tar.gz
# cd /home/centos
# cp /home/centos/wordpress.tar.gz /var/lib/mysql/wordpress.tar.gz
$ curl http://10.0.1.253/ … 疎通テスト
$ mysql -h 10.0.1.253 -u repl -p … 疎通テスト
※最初MySQLで通信できなかった。内部通信を許可するために、セキュリティグループに「default」を追加
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-network-security.html#default-securit...
# systemctl stop mysql
# cd /var/lib/mysql … MySQLのデータをバックアップから復元
# mv wordpress wordpress.backup
# tar xvzf wordpress.tar.gz
# vi /etc/my.cnf … レプリケーション設定
□いったん動作確認
Master側でテーブルを作成&データを登録し、Slave側にも反映されていることを確認する
■WordPressの接続設定を調整
□Master
[mysqld]
server-id=1002
# systemctl start mysql
# mysql -u root -p
mysql> CHANGE MASTER TO … Masterへの接続情報を設定
MASTER_HOST='10.0.1.253',
MASTER_USER='repl',
MASTER_PASSWORD='gV0+8k6BM#z7',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002', … 「SHOW MASTER STATUS」で確認した「File」
MASTER_LOG_POS=633; … 「SHOW MASTER STATUS」で確認した「Position」
mysql> FLUSH PRIVILEGES;
mysql> START SLAVE; … レプリケーションを開始
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@10.0.1.253 IDENTIFIED BY 'Hy8R63mAdF'; … WordPress用ユーザ追加
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@10.0.1.42 IDENTIFIED BY 'Hy8R63mAdF'; … WordPress用ユーザ追加
mysql> FLUSH PRIVILEGES;
mysql> SELECT host,user FROM mysql.user;
□両方のサーバにHyperDBをインストール
# cd
# wget http://downloads.wordpress.org/plugin/hyperdb.zip
# unzip hyperdb.zip
# cd hyperdb
# cp db-config.php /home/kusanagi/wordpress/DocumentRoot/
# chown kusanagi. /home/kusanagi/wordpress/DocumentRoot/db-config.php
# cp db.php /home/kusanagi/wordpress/DocumentRoot/wp-content/
# chown kusanagi. /home/kusanagi/wordpress/DocumentRoot/wp-content/db.php
# cd /home/kusanagi/wordpress/DocumentRoot/ … 公開ディレクトリへ移動
# vi db-config.php
217行目あたり
$wpdb->add_database(array(
'host' => DB_HOST, // If port is other than 3306, use host:port.
'user' => DB_USER,
'password' => DB_PASSWORD,
'name' => DB_NAME,
));
以下のように編集(「write」と「read」の指定を追加)
$wpdb->add_database(array(
'host' => DB_HOST, // If port is other than 3306, use host:port.
'user' => DB_USER,
'password' => DB_PASSWORD,
'name' => DB_NAME,
'write' => 1,
'read' => 1,
));
228行目あたり
$wpdb->add_database(array(
'host' => DB_HOST, // If port is other than 3306, use host:port.
'user' => DB_USER,
'password' => DB_PASSWORD,
'name' => DB_NAME,
'write' => 0,
'read' => 1,
'dataset' => 'global',
'timeout' => 0.2,
));
以下のように編集(「host」の指定を変更)
$wpdb->add_database(array(
'host' => DB_HOST_RO, // If port is other than 3306, use host:port.
'user' => DB_USER,
'password' => DB_PASSWORD,
'name' => DB_NAME,
'write' => 0,
'read' => 1,
'dataset' => 'global',
'timeout' => 0.2,
));
WordPressの設定ファイルをバックアップし、設定ファイルを編集
# cp -p wp-config.php wp-config.php.backup
# vi wp-config.php
32行目あたり
define('DB_HOST', 'localhost');
以下のように編集
//define('DB_HOST', 'localhost');
define('DB_HOST', '10.0.1.253');
define('DB_HOST_RO', '10.0.1.42');
■rsync設定(一方向同期)
□同期元サーバ:キーを作成
# ssh-keygen -t rsa
# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC 〜略〜 JKFwq52AwP root@web1.refirio.net
□同期先サーバ:ユーザを作成
# useradd rsync
# usermod -G wheel rsync
# usermod -a -G apache rsync
# usermod -a -G kusanagi rsync
□同期先サーバ:キーの設定
# mkdir -p /home/rsync/.ssh
# chmod 700 /home/rsync/.ssh
# vi /home/rsync/.ssh/authorized_keys
□同期元サーバ:接続確認
ssh-rsa xxxxxxxxxx
# chmod 600 /home/rsync/.ssh/authorized_keys
# chown -R rsync:rsync /home/rsync
# ssh -p 22 rsync@10.0.1.42
□同期元サーバ:lsyncdインストール
# yum install --enablerepo=epel lsyncd
# chmod 0775 /home/kusanagi
# mkdir /home/kusanagi/rsync
# chown kusanagi. /home/kusanagi/rsync
# chmod 0775 /home/kusanagi/rsync
# cd /home/kusanagi/rsync
# rsync -e "ssh -p 22" -avz --delete /home/kusanagi/rsync rsync@10.0.1.42:/home/kusanagi … 動作確認
□同期元サーバ:自動同期設定
# vi /etc/lsyncd.conf
■rsync設定(双方向同期)
「rsync(一方向同期)」の設定を、同期元と同期先を逆にして追加設定する
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.stat",
maxProcesses = 2,
statusInterval = 1,
insist = 1
}
sync {
default.rsync,
source = "/home/kusanagi/rsync",
target = "rsync@10.0.1.42:/home/kusanagi/rsync",
delay = 2,
exclude = {
"*.swp"
},
rsync = {
archive = true,
compress = false,
rsh = "ssh -p 22"
}
}
# systemctl start lsyncd.service
# systemctl enable lsyncd.service
# systemctl is-enabled lsyncd.service
# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC 〜略〜 kATrJQOJ+J root@web2.refirio.net
# ssh -p 22 rsync@10.0.1.253
# rsync -e "ssh -p 22" -avz --delete /home/kusanagi/rsync rsync@10.0.1.253:/home/kusanagi
■WordPress同期
□同期を停止させておく
web1&web2:
# sudo su -
# systemctl stop lsyncd.service
□公開フォルダを退避
web1&web2:
# cd /home/kusanagi/wordpress
# mv DocumentRoot DocumentRootTmp
# mkdir DocumentRoot
# chown kusanagi. DocumentRoot
# chmod 0775 DocumentRoot
□上位ディレクトリのパーミッションを調整
# chmod 0775 /home/kusanagi
□公開フォルダで同期をテスト
web1:
# vi DocumentRoot/index.php
# rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.42:/home/kusanagi/wordpress
web2:
# vi DocumentRoot/test.php
# rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.253:/home/kusanagi/wordpress
□自動同期対象を変更
web1&web2:
# vi /etc/lsyncd.conf
※2箇所あるパスを修正
/var/www/html/rsync
↓
/home/kusanagi/wordpress/DocumentRoot
# systemctl start lsyncd.service
自動同期を確認後、また停止させておく
# systemctl stop lsyncd.service
□公開フォルダを戻す
web1で公開ディレクトリ内をWordPressに戻す
(web2では公開ディレクトリ内をカラにしておく)
# mv DocumentRoot DocumentRootTmp2
# mv DocumentRootTmp DocumentRoot
□ファイルの所有者を調整
web1&web2:
/home/kusanagi/wordpress 内で作られたファイルの所有者を kusanagi にする
# chown kusanagi. /home/kusanagi/wordpress
# chmod 0775 /home/kusanagi/wordpress
# chmod g+s /home/kusanagi/wordpress
# chmod g+s /home/kusanagi/wordpress/DocumentRoot
web1:
# find /home/kusanagi/wordpress -type d -print | xargs chown kusanagi.
# find /home/kusanagi/wordpress -type f -print | xargs chown kusanagi.
□WordPressを同期
web1の公開ディレクトリ内はWordPress、
web2の公開ディレクトリ内はカラ、
という状態でweb1で以下を実行。同期テストする
# rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.42:/home/kusanagi/wordpress
完了したら、web2からも同期をテストする
# rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.253:/home/kusanagi/wordpress
どちらも大丈夫なら、自動同期を開始してテストする
# systemctl start lsyncd.service
自動同期も大丈夫なら、管理画面から記事の登録やメディアのアップロードなどをテストする