ヤマムギ

growing hard days.

*

Amazon LinuxのNginx+RDS MySQLにレンタルWebサーバーからWordPressを移設する(失敗、手戻りそのまま記載版)

      2015/05/11

nginx_logo copy

勉強のためブログサイトを長らくお世話になったロリポップさんから、AWSに移設することにしました。

環境

移設前

  • ロリポプラン
  • MySQL
  • 多分Apache
  • Word Press
  • Word Press to Dropboxで日次バックアップ

移設後

  • AWS EC2 Amazon Linux
  • AWS RDS MySQL
  • Nginx
  • Word Press

移設先AWS環境の構築

EC2インスタンスの構築

手前味噌ではありますが、「試したい事があるのでAWS でとりあえずAmazon Linuxのサーバを作る」を参照してください。

作成したEC2インスタンスにグローバルIPアドレスを設定

またまた手前味噌ではありますが、「AWS EC2 でインスタンスにIPアドレスを紐付ける」を参照してください。

設定したグローバルIPアドレスを使用して移設用ドメインにAレコードを作成しておく

ここで設定したドメインを仮に tmp.mydomain.com と www.tmp.mydomain.com とします。
TTLは念のため60秒にしておきます。
ちなみに本番ドメインは、mydomain.com と www.mydomain.com の想定です。

Amazon LinuxにNginxをインストールする

MySQLはRDSを使用するのでここではクライアントのみをインストールする

[bash]
$ sudo yum install nginx
$ sudo yum install mysql
$ sudo yum install php php-fpm php-mbstring php-mysql php-gd
[/bash]

Nginxの設定をする

default.confを設定する

[bash]
$ sudo cp -r /usr/share/nginx/html /usr/share/nginx/tmp
$ sudo vim /etc/nginx/conf.d/mydomain.conf
[/bash]

  • mydomain.conf
    server_nameには移設用の仮ドメインを設定します。

※tmpディレクトリは適宜変更してください。

[text]
server {
listen 80;
server_name tmp.mydomain.com www.tmp.mydomain.com;
root /usr/share/nginx/tmp;
location / {
index index.php index.html;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[/text]

Nginxとphp-fpmを自動起動してサービススタートする

[bash]
$ sudo chkconfig nginx on
$ sudo chkconfig php-fpm on
$ sudo service nginx start
$ sudo service php-fpm start
[/bash]

Nginx-Test-Page

ブラウザから確認すると無事Nginxが起動してました。

ついでのphpinfo()も無事確認出来ました。

確認が出来たので、「server_name tmp.mydomain.com www.tmp.mydomain.com;」のtmpを外しておきます。

EC2インスタンスのバックアップ(AMI)を作成する

この時点でEC2インスタンスのバックアップを作成しておきます。

AWS EC2でAMI(Amazon Machine Image)を作成しておく」を参照してください。

Nginx構築まででのハマりどころ

事象

  • index.phpもphpinfo.phpもブラウザで見ると「File not found」の文字が表示されるのみ。
  • /var/log/nginx/error.log を見ると「Primary script unknown」と表示されていた。

対応

/etc/nginx/conf.d/mydomain.conf の下記を修正、追記してnginxサービス再起動

  • [root /usr/share/nginx/tmp;] の記述をserver{のセクションに移動してスコープを変更

RDS MySQLの構築

MySQLはRDSで構築します。

MySQLの構築からEC2からの接続テストまでは、「AWS RDS でMySQLインスタンスを構築する」を参照してください。

MySQL 設定

Databaseとユーザーだけ作成します。

作成するデータベース情報、ユーザー情報、文字コードはバックアップしているwp-config.phpを参照します。
データベース名、ユーザー名、パスワードはwp-config.phpをあわせて変更してもかまいません。

[bash]
$ mysql -h エンドポイント -u RDSユーザ -p
Enter password:RDSユーザのパスワード
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 290
Server version: 5.6.22-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> CREATE DATABASE データベース名 CHARACTER SET 文字コード;
Query OK, 1 row affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON データベース名.* TO WordPressのユーザ@EC2のプライベートIP IDENTIFIED BY ‘WordPressユーザのパスワード’ WITH GRANT OPTION;
Query OK, 0 rows affected (0.10 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)

mysql> exit
Bye

$ mysql -h エンドポイント -u WordPressのユーザー -p
Enter password:WordPressユーザのパスワード
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 290
Server version: 5.6.22-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>
[/bash]

バックアップの確認

さて、WordPress用のユーザーを作ってと思って、バックアップファイルを確認していると、4/25からまともに動いていない事が判明。
WPB2Dを使っているのですが、原因は分からず、そして設定変更しても反映せず、ですので、急遽BackWPUpプラグインをインストールして手動でファイルとデータベースそれぞれのバックアップを作成しました。

データベースリストア用SQLで置換

とにかく変更が発生するものを軒並み検索して置換します。

  • ABSPATH
  • データベース名 など

バックアップしたファイルとデータベースリストア用SQLをDropboxにアップロードして、EC2インスタンスからダウンロードする

ダウンロードした後に解答してファイル群はドキュメントルートディレクトリに移動してしまいます。

[bash]
$ mkdir tmp
$ cd tmp
$ sudo wget Dropboxのファイル用ダウンロードリンク
$ cd ..
$ mv -r tmp /usr/share/nginx/tmp
$ mkdir dbsql
$ cd dbsql
$ sudo wget Dropboxのデータベース用SQLダウンロードリンク
[/bash]

wp-config.phpの変更

[plain]
define(‘DB_NAME’, ‘データベース名’);

/** MySQL のユーザー名 */
define(‘DB_USER’, ‘WordPressのユーザ’);

/** MySQL のパスワード */
define(‘DB_PASSWORD’, ‘WordPressユーザのパスワード’);

/** MySQL のホスト名*/
define(‘DB_HOST’, ‘RDSのエンドポイント’);
[/plain]

データベースのリストア

[bash]
$ cd dbsql
$ mysql -h RDSのエンドポイント -u WordPressのユーザ -pWordPressユーザのパスワード データベース名 < リストア用.sql
[/bash]

※ -pの後はスペースなしでパスワードを続けます
※ sqlファイル名の前は <

今日はここまでです。

ここまで来て「えいっ」ってDNSを変更してみて大失敗してあわてて戻しました。

とりあえずhtaccessをまずなんとかしないとならない、のと、
キャッシュやバックアップを止めてすっきりした状態で移行したい、のと、
ドメイン変更して移行テストして手順を確率してやるべきです。

仕切り直して

バックアッププラグインを無効化する

Dropboxに向けているバックアップもあるので、それらが競合しないように一回止めます。

  • BackWPUpはジョブだけ止めます。
  • WordPress Backup to Dropboxは無効化します。

BackWPUpで手動バックアップを取得

  • 新規ジョブを作成します。
  • 対象は、データベース、ファイル、インストール済プラグインリストです。
  • 保存方法はDropboxにします。
  • スケジュールは手動です。
  • ジョブ一覧から「すぐに実行」で実行します。

BackWPUpでmysqliのエラーが発生する場合

  • PHP 5.4以上にする事で解消出来ました。
  • ロリポップでは、[Webツール]-[PHP設定]から変更出来ます。

AWSでDropboxからバックアップファイルをダウンロードする

展開用ディレクトリを作成して、そこにダウンロードして解凍します。
※ダウンロードしたファイルにはURLコマンドが付いた状態になっているのでダウンロード後、リネームします。

[bash]
$ mkdir tmp
$ cd tmp
$ wget DropboxのバックアップファイルURL
$ mv Dropboxのバックアップファイル tmp.tar.gz
$ tar vxfz tmp.tar.gz
[/bash]

テスト用Nginx環境を作成する

[bash]
$ sudo vim /etc/nginx/conf.d/tmp.conf
[/bash]

[text]
server {
listen 80;
server_name tmp.mydomain.com www.tmp.mydomain.com;
root /usr/share/nginx/tmp;
location / {
index index.php index.html;
try_files $uri $uri/ /index.php;
if (!-e $request_filename) {
rewrite ^.+?(/wp-.) $1 last;
rewrite ^.+?(/.
.php)$ $1 last;
rewrite ^ /index.php last;
}
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[/text]

データベースバックアップのSQLを置換する

[bash]
$ vim バックアップ用SQLファイル
[/bash]

[vim]
:%s;置換前のテキスト;置換後のテキスト;g
[/vim]

  • ABSPATHの置換
  • データベース名(任意)を置換
  • URLをテスト用に置換

データベースのリストア

[bash]
$ mysql -h RDSのエンドポイント -u WordPressのユーザ -pWordPressユーザのパスワード データベース名 < リストア用.sql
[/bash]

※ -pの後はスペースなしでパスワードを続けます
※ sqlファイル名の前は <

ファイルの移動

[bash]
$ cd ~
$ sudo mv tmp /usr/share/nginx/tmp
$ sudo chown -R apache /usr/share/nginx/tmp
$ sudo chgrp -R apache /usr/share/nginx/tmp
[/bash]

wp_config.phpの編集

[plain]
define(‘DB_NAME’, ‘データベース名’);

/** MySQL のユーザー名 */
define(‘DB_USER’, ‘WordPressのユーザ’);

/** MySQL のパスワード */
define(‘DB_PASSWORD’, ‘WordPressユーザのパスワード’);

/** MySQL のホスト名*/
define(‘DB_HOST’, ‘RDSのエンドポイント’);
[/plain]

nginx再起動

[bash]
$ sudo service nginx restart
[/bash]

テスト用ドメインで検証

WordPressの管理画面にログインしてURLを変更する

検証結果

WordPress Popular Postsのサムネイルが表示されなくなった

php-gd がない事が原因でした。
なので、インストールして、php-fprmとnginxを再起動。

[bash]
$ sudo yum install php-gd
$ sudo service php-fpm restart
$ sudo service nginx restart
[/bash]

検証で行った手順を本番にあわせて実施する

そしてDNSのAレコードを変更して無事に移行完了しました。

この記事は失敗も踏まえて残しますが、正解手順だけの記事も別途作成します。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS, WordPress , , , ,

ad

ad

  関連記事

WordPress、プラグインのアップデートしてBlue/Greenデプロイ

現在のブログの構成です。 WordPressとプラグインのアップデートをして、デ …

ヤマムギ vol.10 (AWS)EC2モニタリングハンズオン 手順

このブログは2020/5/6に開催しました、「ヤマムギ vol.10 (AWS) …

AMIをOrganizations組織で共有しました

よく使うAMIをOrganizations組織内のリソースパブリッシュ用のアカウ …

AWS Organizationsでアカウントを50作って指定したOUに移動するスクリプト

AWS Organizationsでアカウントを50個作る必要がありましたので、 …

EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効期限は短くできるのでしょうか

「EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効 …

AWSアカウント内のCloudWatchアラームを削除する

やりたいこと 特定アカウント特定リージョン内のCloudWatdchアラームを全 …

Amzon Linux のApacheでRedmineとWordPressをバーチャルホストで共存する

EC2とRDSを節約しようと思いまして、Redmineを動かしてるとこに検証用W …

AWS Client VPNの接続ログを確認しました

AWS Client VPNを設定しましたで証明書とかせっかく作ったので、いろい …

VPC新コンソールの日本語UIでルートテーブル編集時のエラー(2021/6/10)が発生したのでフィードバックを送った

VPCの新コンソールがリリースされていたので使って作業してましたところ、こんなエ …

既存のAWSアカウントをAWS Control Towerに追加

Account Factoryからは既存アカウントは追加できない? AWS Co …