Vagrant, ChefでWordPressをEC2, Nginxに引っ越し

vagrant-chef-ubuntu-ec2-nginx

今まではレンタルサーバーでWordPressを動かしていましたが、最近EC2に引っ越しました。WordPressはDBに設定の値も入っていてDBも移行しないといけなく大変だったので、簡単に引っ越しできればと思ってVagrantfileとChefレシピを書きました。

はじめに

WordPressはwp-contents,wp-includesなどのサーバー上にアップしているファイル(以下wordpressディレ)には、テーマ、プラグイン、記事の画像ファイルなどが保存されていて、記事内容、ユーザー情報、設定値などはMySQLのDBに保存されていると思います。
そこで引っ越ししたり開発環境を作りたいと思ったときはそれをそのままコピーしてくればいいと思いきやうまくいきませんよね。
たぶんユーザーパスワードのハッシュあたりが原因でログインできなくなります。
なのでWordPressのユーザー情報が登録されている、wp_usersテーブルだけはコピーしないで試したらうまく行きました。

■Githubにもアップしています。
vagrant-chef-ubuntu-nginx-wordpress

chefのレシピでやっていること

おおまかに以下のことをchefでやっています。

  1. 日本時間に設定
  2. nginx,mysql,phpなどインストール
  3. nginx,mysql,php-fpm設定・再起動
  4. wp-cliインストール
  5. WordPressデータベース設定
  6. WordPressユーザー登録
  7. DBデータとsitemapのホスト名置き換え
  8. 既存のDBデータインポート

今回wp-cliのインストール部分などこちらを参考にしました!

開発環境構築・引っ越し

今回は開発環境をVirtualBoxで、本番環境をEC2でWordPressを運用するのを想定してそれぞれのVagrantfileを作りました。Chefのレシピは共通の物を使うようにしています。
開発・本番の環境は以下の通りです。すべてapt-getでインストールしたときのバージョンです。

Ubuntu  12.04 64-bit
Nginx   1.1.19
php     5.3.10
php-fpm 5.3.10
MySQL   5.5.34   

1. wordpressディレクトリを用意

既に運用しているwordpressディレをローカルに持ってきます。無い場合は公式サイトからダウンロードしてきてください。

2. VirtualBoxインストール

https://www.virtualbox.org/

3. Vagrantインストール

gemでも管理されていますが公式サイトからインストールするのが主流みたいです。
http://www.vagrantup.com/

4. Vagrantプラグインインストール

今回必要なプラグインをインストールします。

vagrant plugin install vagrant-aws
vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-hostsupdater

5. 初期設定

以下のコマンドを実行します。

# wordpressフォルダをローカルに準備
cd wordpress
git clone https://github.com/takatoshi/vagrant-chef-ubuntu-nginx-wordpress.git vagrant
cd vagrant

# 環境依存ファイルを準備
cp vb/Vagrantfile.Sample vb/Vagrantfile
cp aws/Vagrantfile.Sample aws/Vagrantfile
cp vb/wordpress_import.sh.Sample vb/wordpress_import.sh
cp aws/wordpress_export.sh.Sample aws/wordpress_export.sh

6. wordpressのDBインポート・エクスポートshell編集

wordpress_import.sh

本番環境のwordpressデータベースをdumpしたファイルをchefのtemplateフォルダに入れるシェルを書いてみました。
ec2の場合は例えば以下の様な感じに定数部分を入力します。今回は引っ越しなのでここに前のサーバの情報を入れます。

#!/bin/sh
# ec2 user
USER=ubuntu
# ec2 Public IP
HOST=111.222.333.444
# ec2 private key file location
ID_FILE=~/.ssh/tactosh.pem
MYSQL_USER=root
MYSQL_PASS=root
MYSQL_HOST=localhost
MYSQL_DB_NAME=wordpress
ssh -i $ID_FILE $USER@$HOST "mysqldump -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST $MYSQL_DB_NAME wp_usermeta wp_term_taxonomy wp_term_relationships wp_terms wp_posts wp_postmeta wp_options wp_links wp_comments wp_commentmeta > ~/wordpress.sql"
scp -i $ID_FILE $USER@$HOST:~/wordpress.sql ../site-cookbooks/wp-install/templates/default/wordpress.sql

wordpress_export.sh

これは開発環境のDBを本番にエスクスポートするシェルで以下のようにしてみました。

#!/bin/sh
# vagrant user
USER=vagrant
# vagrant private ip
HOST=192.168.56.110
# vagrant private key file location
ID_FILE=~/.vagrant.d/insecure_private_key
MYSQL_USER=root
MYSQL_PASS=root
MYSQL_HOST=localhost
MYSQL_DB_NAME=wordpress
ssh -i $ID_FILE $USER@$HOST "mysqldump -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST $MYSQL_DB_NAME wp_usermeta wp_term_taxonomy wp_term_relationships wp_terms wp_posts wp_postmeta wp_options wp_links wp_comments wp_commentmeta > ~/wordpress.sql"
scp -i $ID_FILE $USER@$HOST:~/wordpress.sql ../site-cookbooks/wp-install/templates/default/wordpress.sql

7. Vagrantfile編集

Vagrantfile(開発版)

こちらも例えば以下の様に定数部分を埋めます。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

# Server
HOSTNAME       = "vm.wordpress.com"
SSH_USER_NAME  = "vagrant"
IP_ADDRESS     = "192.168.56.100"
WP_INSTALL_DIR = File.join("/home/", SSH_USER_NAME)

# WordPress
WP_TITLE       = "Hello WordPress"
WP_ADMIN_USER  = "wordpress"
WP_ADMIN_PASS  = "wordpress"
WP_ADMIN_EMAIL = "wordpress@wordpress.com"

# MySQL
MYSQL_ROOT_PASSWORD = "root"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.name = HOSTNAME
  end

  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.vm.network :private_network, ip: IP_ADDRESS
  config.vm.hostname = HOSTNAME

  config.vm.synced_folder "../../", File.join(WP_INSTALL_DIR, HOSTNAME), create: true, owner: SSH_USER_NAME, group: SSH_USER_NAME

  config.omnibus.chef_version = :latest
  config.hostsupdater.remove_on_suspend = true

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["../site-cookbooks", "../cookbooks"]
    chef.json = {
      :wp_install => {
        :user_name      => SSH_USER_NAME,
        :install_dir    => WP_INSTALL_DIR,
        :server_root    => File.join(WP_INSTALL_DIR, HOSTNAME),
        :server_name    => HOSTNAME,
        :wp_title       => WP_TITLE,
        :wp_admin_user  => WP_ADMIN_USER,
        :wp_admin_pass  => WP_ADMIN_PASS,
        :wp_admin_email => WP_ADMIN_EMAIL
      },
      :mysql => {
        :root_password => MYSQL_ROOT_PASSWORD
      }
    }
    chef.add_recipe "wp-install"
  end

end

Vagrantfile(本番版)

こちらはさらにEC2情報も埋めます。後は開発版と同様です。

8. 開発環境でテスト

以下のコマンドを実行します。最初は10分くらいかかるかもしれません。
終わったらVagrantfileのHOSTNAMEに入力したURLにアクセスすればきっと表示されるはず!

cd wordpress/vagrant/vb
# 本環境のDBインポート
./wordpress_import.sh
vagrant up

もしネットワーク不調が原因でこけたら

vagrant provision

でうまく行くかもしれません。

9. 本番環境にデプロイ

EC2にvagrant upしてデプロイします。
wordpressディレはsynced_folder機能でrsyncされ、開発環境のDBはchefで本番のDBにインポートさせています。

初回

cd wordpress/vagrant/aws
# 開発環境のDBをエクスポート
./wordpress_export.sh
vagrant up

初回以降

# 開発環境でWordPressのアップデート、プラグインインストール、テーマ編集など
cd wordpress/vagrant/aws
./wordpress_export.sh
vagrant provision

これで本番URLでもうまく表示されれば引っ越し成功です!

おわりに

VagrantとChefのおかげで今までは大変だった引っ越し作業もほぼ自動でやってくれるのが非常に便利だと思いました。
今は記事を書いたり設定を変更するのもすべて開発環境でしてからDBエクスポートして

vagrant provision

しています。記事を書いてる途中にコメントがあってからDBエクスポートしたらコメント消えちゃいますが、今のところ心配ないです!