Memo

メモ > サーバ > 各論: エトセトラ > サーバ2台構成でWordPress(rsyncでファイル双方向同期、MySQLレプリケーションでデータベース同期)

■サーバ2台構成でWordPress(rsyncでファイル双方向同期、MySQLレプリケーションでデータベース同期)
■前提 AWSに環境を構築したときのメモ web1とweb2の二台に、WordPressの動作する環境が構築済みとする ■ホスト名の設定(web1、web2とも)
# hostnamectl set-hostname web1.refirio.net # vi /etc/hosts
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
※web2では「web1.refirio.net」という名前で同様の設定を行う ■レプリケーションの設定 web1をMaster、web2をSlaveとする □Master
$ curl http://10.0.1.42/ # vi /etc/my.cnf
[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
□Slave
$ 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 … レプリケーション設定
[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; … レプリケーションを開始
□いったん動作確認 Master側でテーブルを作成&データを登録し、Slave側にも反映されていることを確認する ■WordPressの接続設定を調整 □Master
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
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
■rsync設定(双方向同期) 「rsync(一方向同期)」の設定を、同期元と同期先を逆にして追加設定する
# 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
/var/www/html/rsync ↓ /home/kusanagi/wordpress/DocumentRoot
※2箇所あるパスを修正
# 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
自動同期も大丈夫なら、管理画面から記事の登録やメディアのアップロードなどをテストする

Advertisement