ヤマムギ

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レコードを変更して無事に移行完了しました。

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


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

【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

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

 - AWS, WordPress , , , ,

ad

ad

  関連記事

AWS DataLake 構築ハンズオンに行ってきました

AWSJ大阪が増床されて2019年10月限定でAWS pop-up loftとい …

ブラウザからJavaScript SDKを使ってAmazon S3 への写真のアップロードチュートリアルをやってみました

ブラウザから Amazon S3 への写真のアップロードをやってみました。 HT …

EC2 セッションマネージャにEC2インスタンスの一覧から接続できるようになりました

EC2に接続する時に、どうしてもSSHクライアントから接続しないといけない場合を …

Cloud9でAWS CDK環境

最初ローカルに作ろうと思ったのですが、環境依存がというか、Macbookの環境で …

AWS EC2 でインスタンスにIPアドレスを紐付ける

AWS EC2で作ったサーバは何もしなければ起動するたびにIPアドレスが変わって …

CloudFrontからのバーチャルホストなサイトのテストってどうしてます?

このブログの構成です。 AWSで構築しています。 4つのサイトを1つのEC2で配 …

MySQL WorkbenchからRDSに接続する

MySQL WorkbenchからAWS RDSのMySQLに接続するために、「 …

php-fpm で Out of memoryが発生した際にメール通知する(AWS CloudWatch , Amazon SNS)

AWS CloudWatch LogsエージェントでAmazon EC2上のNg …

AWS CDK とにかくサンプルでやってみる

Cloud9でAWS CDK環境で作った環境でサンプルプロジェクトからのデプロイ …

Application Load Balancer スティッキーセッションでどれぐらい偏るかを偶然見ました

Amazon Linux2のPHPを7.2から7.3へアップデートしましたでアッ …