WordPress環境を手軽にコピーする(WordmoveでNginxからApacheへ)


Shellの使えるレンタルサーバで動かしているWordPressのバックアップを定期的に取得し、リモートに送り、そのデータを使って、運用中のWordPress環境と全く同じ環境を、他のサーバ上に構築したいです。目的は下記の通り。

  • 万が一本番サーバが壊れた場合には、復旧するためのデータを手元に残しておきたい
  • テンプレートやプラグインのテストの為に実運用環境と同じ環境が手元にほしい
  • スクリプト一発で何時でもリモート環境を再現したい
  • cronで定期処理することでバックアップを取りたい

最初は、mysqldumpでバックアップして、WordPressの各種ファイルと一緒にtar.gzに固めてリモートに送り、その復元までを行うスクリプトを書こうとしていましたが、既に先駆者がRubyで実装済みでした。Wordmoveというパッケージ名で公開されています。

という事で、Ubuntu15.04導入後からの設定を書いていきます。

Ruby2.2のインストール

rubyはディストビューション付属のパッケージをapt-getでインストールすると、結構古いバージョンがインストールされるので、rbenvを使ってインストールします。rbenvは下記のスクリプトを実行したユーザーのホームディレクトリ以下に必要なファイルを配備するため、他のユーザーの環境を汚さずに、いつでも最新のRubyが使える優れものです。

~/.bash_profileに、rbenvをロードするためのコードを書いて、Ruby等へのパスを通します。which rubyすれば、どこにインストールされているのかがわかりますよ。

# Rubyを導入するために必要なライブラリを入れる。
sudo apt-get install libssl-dev libffi-dev build-essential  git-core curl  libreadline-dev  \
  zlib1g-dev libyaml-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev \
  python-software-properties libffi-dev

# rbenvを入れる
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

# ruby-buildを入れる
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
source ~/.bash_profile

# インストール可能なRubyのバージョンを確認する。
# 時期によっては、2.3等になっているかもしれないので、その場合には読み替えてください。
rbenv install -l
rbenv install 2.2.2
rbenv global 2.2.2
ruby -v

# gemでのインストール時のオプションを.gemrcに書いておく。
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler

インストール時に使う環境変数のセット

下記、4つの環境変数を適宜設定してください。MYSQL_ROOT_PASSだけは絶対に書き換えないと、MYSQLに接続できないはずです。

# opensslコマンドでの生成でも良いし、お好きなものを指定してもいいです。
export NEW_DB_PASS=`openssl rand -hex 10`

# MySQLのROOTパスワードを指定してください。
# インストール中に使います。
export MYSQL_ROOT_PASS=yourpassword

# ローカル側に作成するDB名を指定してください。このままでもOKです。
# 面倒なので、DB名とユーザー名は同じにします。
export DB=wordpress

# ローカル側にコピーしたWordPressにアクセスする際のURLです。
export MY_FQDN=wordpress.local

# ローカル側DBユーザーに対応するMySQLのパスワード。
echo $NEW_DB_PASS

必要なパッケージのインストール

# ApacheやMySQLのインストール
sudo apt-get install mysql-server mysql-client libmysqlclient-dev apache2 \
  php5-mysqlnd dbconfig-common libapache2-mod-php5

# wordmoveをインストール。
gem install wordmove

DBのセットアップ

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak
sudo sed -i "s/\[client\]/[client]\ndefault-character-set=utf8/g" \
  /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i "s/\[mysqld\]/[mysqld]\ncharacter-set-server=utf8/g" \
  /etc/mysql/mysql.conf.d/mysqld.cnf

sudo service mysql restart

# DB作成
mysql -uroot -p$MYSQL_ROOT_PASS -e "drop database if exists $DB;"
mysql -uroot -p$MYSQL_ROOT_PASS -e "CREATE DATABASE $DB character set utf8;"
mysql -uroot -p$MYSQL_ROOT_PASS -e "grant all privileges on $DB.* to '$DB'@'localhost' identified by '$NEW_DB_PASS'"
mysql -uroot -p$MYSQL_ROOT_PASS -e "flush privileges"
mysql -u$DB -p$NEW_DB_PASS -e "show databases"

Apacheのセットアップ

sudo tee /etc/apache2/sites-available/$MY_FQDN.conf  <<_EOF_ > /dev/null
<VirtualHost *:80>
  ServerName $MY_FQDN
  DocumentRoot /var/www/$MY_FQDN/
  <Directory /var/www/$MY_FQDN/>
    AllowOverride all
    Options -MultiViews
    Require all granted
  </Directory>
</VirtualHost>
_EOF_

sudo ln -s /etc/apache2/sites-available/$MY_FQDN.conf /etc/apache2/sites-enabled/$MY_FQDN.conf
sudo a2enmod rewrite

sudo service apache2 restart

echo "下記のURLにブラウザでアクセスする"
echo "http://$MY_FQDN/"

Wordmoveの設定ファイルを作成する

wordmove initで、実行したディレクトリにMovefileができます。その中身をvi等で直接編集してもいいですし、その下に定義しておいた環境変数を突っ込んでひな型を作るスクリプトを用意しておいたので、そちらを実行してもいいです。

cd /var/www/$MY_FQDN
wordmove init

vi Movefile

 

Movefileのひな型はwordmove initでできますが、ここまで、各種環境変数をセットしていたので、下記のコマンドでも作成可能です。本番環境のDB接続ユーザーや、SSH接続ユーザーは、適当な文言が入っているので、作成した後に、見直してください。なお、このファイルはYAML形式なので、各行の先頭のスペースの数が間違っているとエラーが出ます。

# 下記2つの環境変数は適宜修正してください。
export HONBAN_URL=eco.senritu.net
export HONBAN_PATH=/var/www/eco.senritu.net

# teeコマンドでMovefileを上書きする。
tee Movefile <<_EOF_ > /dev/null
local:
 vhost: 'http://$MY_FQDN'
 wordpress_path: '/var/www/$MY_FQDN'
 database:
 name: '$DB'
 user: '$DB'
 password: '$NEW_DB_PASS'
 host: '127.0.0.1'

staging:
 vhost: 'http://$HONBAN_URL'
 wordpress_path: '$HONBAN_PATH'
 database:
 name: 'wordpress'
 user: 'wordpress'
 password: 'password'
 host: 'localhost'

 exclude:
 - '.git/'
 - '.gitignore'
 - '.sass-cache/'
 - 'bin/'
 - 'tmp/*'
 - 'Gemfile*'
 - 'Movefile'
 - 'wp-config.php'
 - 'wp-content/*.sql'

 ssh:
 host: '$HONBAN_URL'
 user: '$USER'
 port: 22
 rsync_options: '--verbose'
_EOF_

sshによるリモートログインができるようにする。

SSHでリモートにログインするために、Linux、macOSから対象サーバへパスワード無しで高速ログインするの設定を行ってください。既に似たようなことを実施済みの方も多いと思うので、実施済みであれば次に進んでください。

Wordmoveの実行

wordmove pull --all

他にも、下記のようにオプションが各種そろっています。

Options:
 -w, [--wordpress], [--no-wordpress]
 -u, [--uploads], [--no-uploads]
 -t, [--themes], [--no-themes]
 -p, [--plugins], [--no-plugins]
 -l, [--languages], [--no-languages]
 -d, [--db], [--no-db]
 -v, [--verbose], [--no-verbose]
 -s, [--simulate], [--no-simulate]
 -e, [--environment=ENVIRONMENT]
 -c, [--config=CONFIG]
 [--no-adapt], [--no-no-adapt]
 [--all], [--no-all]

コピーしたWordPress環境にログインする

この例だと、wordpress.localにブラウザでアクセスすることになります。最初にアクセスすると、WordPress用の設定ファイルがコピーされていないので、初期設定画面が表示されます。初期設定といっても、コピーした環境用のwp-config.phpがないだけなので、wp-config.phpを作るまでをインストールウィザードを使って進める感じです。

wordmove000000

コピーした環境なので、間違って初期化されてしまっても問題ないので、『さあ、始めましょう!』を押します。

wordmove000001

データベース名やユーザー名は、セットアップ中に出てきた通りです。パスワードは『echo $NEW_DB_PASS』で、予め設定しておいた環境変数に入っていると思います。テーブル接頭辞は、リモートの本番環境を構築した際に設定したはずです。デフォルトだとWP_となっているとので、特に設定した覚えがなければ、デフォルトのままでいいでしょう。

wordmove000002

上記の大きな赤枠内のコードをローカルのWordpress環境状にwp-config.phpとして保存します。その後、インストール実行を押します。

wordmove000004

インストール実行を押しても、既にインストール済みであることから、『すでにインストールされています』と出て、ログイン画面に遷移するので、ログインします。

wordmove000006

上記のように、ログインしたら本番環境と同じデータが表示されました。

トラブルシューティング

  • TOPページは見れるが、カテゴリや各投稿が表示できない場合には、設定>パーマリンク設定>で『投稿名』が選ばれているが、.htaccessが無い場合には、その画面で『変更を保存』ボタンを押してください。.htaccessが再作成されます(nginxからApacheに移行した場合に、コピー元が無いのでそうなった模様)、もしくは.htaccessを有効にしていない原因も考えられます。/etc/apache2/apache2.conf内のAllowOverrideがAllになっていなければ、Allにして、sudo service apache2 restartしてください。
  • DBにつながらない場合は、mysql -u<ユーザー名> -pで、設定したパスワードを指定してログイン可能なことを確認してください。
  • リモート側で、DBのバックアップに失敗する場合には、wp-contentの下に一時的にダンプファイルを出力するようなので、SSHでログインするユーザーがそのディレクトリ上にファイルを書き込めない場合に、パーミッションエラーとなります。リモート側の権限設定を見直してください。

参考情報

 

タグ付けされた , . ブックマークする へのパーマリンク.

コメントを残す

メールアドレスが公開されることはありません。