WordPressのドメイン変更を含むサーバー移行のまとめ

#はじめに
WordPressやLaravelのサーバー移行をすることが多くあったため、移行方法についてまとめました。
やることは以下の2つです。移行元のファイルを修正し、修正したファイルを移行先に移行します。
・DBであるsqlファイルの修正
・サーバーのディレクトリ内のファイルの修正

#前提条件

- `https://hoge.com`から`https://fuga.jp`にドメインを変更
- `WordPress`もしくは`Laravel`を使用
- 移行元と移行先どちらもDBは、MySQL
- サーバーは、`レンタルサーバー`もしくは`AWS EC2(DBはRDS）`

#流れ

①移行元のsqlファイルをエクスポート
②sqlファイルを修正
③移行元のサーバーのディレクトリをローカルにコピーする
④移行元のサーバーのディレクトリ内のファイルを修正
⑤修正したsqlファイルを移行後のサーバーにインポート
⑥修正したディレクトリを移行後のサーバーにアップロード
⑦移行先のドメインのDNS設定

#①移行元のsqlファイルをエクスポート
phpMyAdminやadminerでDB管理をしている場合、エクスポート機能がありますので、移行後のサーバーで使用するsqlファイルをエクスポートします。
DB管理ツールがなくサーバーがAWSを使用している場合は、こちらを参考にします。
[EC2踏み台サーバーを経由して、RDSのDBを別のRDSのDBに移す方法](https://qiita.com/holdout0521/items/c998f63a6b39913c4aa7)

コマンドでエクスポートする場合は、移行元サーバーにssh接続した状態で、mysqlをインストールし、mysqldumpでエクスポートします。

```
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ sudo yum install mysql
$ mysql --version
mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

#レンタルサーバー
$ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME

#AWSのRDS
$ mysqldump -u 別のRDSのユーザー名 -p -h RDSのエンドポイント DB名 > OUTPUT_FILE_NAME
```
OUTPUT_FILE_NAME　は、例えば `/var/tmp/dump.sql` にする


#②sqlファイルを修正

移行先では、`https://fuga.jp`のドメインを使用するため、エクスポートしたsqlファイルを修正します。
`MySQLWorkBench`などを使用し、以下の箇所を検索と置換を用いて修正します。
####・URLの修正
　WordPressでは、optionsというテーブルの`siteurl`と`home`カラムにURLがありますので、修正します

####・ドメインの修正
`hoge.com`を修正をします。ただし、メールアドレスなどに`hoge.com`が使われている可能性がありますので、置換するときは、必ず一つ一つ確認しましょう。

####・DB名とDBユーザー名を修正
　（特に、レンタルサーバーでは変更される場合が多いです。）

修正後、DB管理ツールを用いて移行先にインポートします。
インポートするファイルはgzip化する必要があります。

```
$　gzip　 〇〇.sql
```

#③移行元のサーバーのディレクトリをローカルにコピーする


移行元がレンタルサーバーやAWS EC2の場合、SFTP接続でローカルにダウンロード可能で、安全かつ転送時間が短縮することができます。
SFTP設定で必要な、ホスト名、ユーザー名、サーバーアドレス等は、レンタルサーバーのマニュアルを参考にしましょう。

SFTP接続できない場合、以下のコマンドで移行元ディレクトリをローカルディレクトリにコピーできます。

```
#ローカル
$ scp [オプション] [鍵].pem ユーザ名@サーバのホスト名(or IPアドレス):コピー元パス 保存先パス


$ scp -r -p -i [鍵].pem  ec2-user@xxx.xxx.xxx.xxx:/usr/share/nginx/html/hoge ./wordpress
```
上記ではIPアドレス:`xxx.xxx.xxx.xxx`のhogeディレクトリをローカルのカレントディレクトリに保存されます。
`-p`:コピー元のタイムスタンプやパーミッションを保持する
`-r`:ディレクトリごと再帰的にコピーする

###Permission deniedが出た場合
原因は2つあります。ひとつは、コピー先とコピー元のディレクトリが間違っている可能性があります。
もうひとつは、権限の問題です。
コピー元の権限とコピー先のディレクトリの権限を変更します。

```
$ scp -r -p -i [鍵].pem  ec2-user@xxx.xxx.xxx.xxx:/usr/share/nginx/html/hoge ./wordpress
scp: /usr/share/nginx/html/hoge: Permission denied


$ chmod 755 ./wordpress

#サーバにssh接続して、コピー先のディレクトリの権限変更
$ chmod 755 /usr/share/nginx/html/hoge

```
権限755がだめならひとまず777に変更してみましょう。

#④移行元のサーバーのディレクトリ内のファイルを修正
ローカルにコピーしたディレクトリは、以下の箇所に対して、Visual Studio Code等のエディターで、検索と置換を用いて修正します。

####・URLを修正
内部リンクとして、ドメインが指定されていることがあります。
また、`https://hoge.com`だけでなく、`http://www.hoge.com`などの`http`の場合や`www`がある場合もあるため、同じく修正します

####・ドメインを修正
`hoge.com`を検索し、一つ一つ確認しながら修正します。

####・Laravelの場合、.envファイルにURLやDB情報が記載されていますので、修正

```.env
APP_URL=https://fuga.jp
DB_CONNECTION=mysql
DB_HOST=host_name_here
DB_PORT=port_here
DB_DATABASE=database_name_here
DB_USERNAME=username_here
DB_PASSWORD=password_here
```


####・WordPressの場合、wp-config.phpファイルにDB情報が記載されていますので、修正

 ```wp-config.php
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'database_name_here' );
/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'username_here' );
/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'password_here' );
/** MySQL のホスト名 */
define( 'DB_HOST', 'localhost' );

$table_prefix = 'wp_';
 ```

####・エラーログファイル等はフルパスのため、修正する
サーバーに移行するディレクトリ名を`hoge`から`fuga`に変更する場合、エラーログファイル等はフルパスになっているため、`fuga`に置換します。
例:`var/www/user_html/fuga/wp-content/plugin/error.log`


#⑤修正したsqlファイルを移行先にインポート
phpMyAdminやadminerでDB管理をしている場合、インポート機能がありますので、移行後のサーバーに修正したsqlファイルをインポートします。
DB管理ツールがなくサーバーがAWSを使用している場合は、こちらを参考にします。
[EC2踏み台サーバーを経由して、RDSのDBを別のRDSのDBに移す方法](https://qiita.com/holdout0521/items/c998f63a6b39913c4aa7)

コマンドでインポートする場合は、移行先サーバーにssh接続した状態で、mysqldumpでインポートします。

```
#レンタルサーバー
$ mysql -u USER_NAME -p -h HOST_NAME DB_NAME < OUTPUT_FILE_NAME

#AWSのRDS
$ mysql -h RDSのエンドポイント -u 別のRDSのユーザー名 -p  DB名 < OUTPUT_FILE_NAME
```
OUTPUT_FILE_NAME　は、例えば `/var/tmp/dump.sql` です

#⑥修正したディレクトリを移行後のサーバーにアップロードする
修正したディレクトリをSFTP接続で移行先のサーバーにアップロードします。

SFTP接続できない場合、以下のコマンドでローカルディレクトリを移行先ディレクトリにコピーできます。

```
#ローカル
$ scp [オプション] [鍵].pem コピー元パス　　ユーザ名@サーバのホスト名(or IPアドレス):保存先パス
$ scp -r -p -i　[鍵].pem test　ec2-user@xxx.xxx.xxx.xxx:/usr/share/nginx/html/hoge
```
上記では、ローカルのtestディレクトリをIPアドレス:`xxx.xxx.xxx.xxx`のhogeディレクトリ内に保存します。



#移行先のドメインのDNS設定
移行先のドメインを購入していない場合、お名前ドットコム等で購入し、レンタルサーバーやAWSの場合Route53で、ドメインとサーバーを結びつける作業は必要です。
AレコードとNSレコードの登録は必須です。

移行先がレンタルサーバーの場合、こちらの記事を参考にしてください

https://hostingstock.net/article/heteml_jp/another-registrar2/


![スクリーンショット 2021-12-17 17.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/433149f4-c376-787a-fb74-595811d036d2.png)

NSを変更後、移行前のDNSデータのキャッシュがクライアントにあるので、キャッシュが切れた後、移行後のNSが反映されます。

digコマンドで確認できます。サイトはこちら↓

https://www.cman.jp/network/support/nslookup.html


#サーバー移行後、WEBページがうまく表示されない場合
###移行前と移行後で、ミドルウェアのWEBサーバーソフトウェア（ApacheとNginx）が異なる場合
#####基本的な変更は以下が参考になりました。
[apacheからnginxへ](https://codelikes.com/apache-to-nginx/)
[nginx + php-fpm でエラーが出て動かない場合の確認箇所と対処方法](https://pig-log.com/nginx-php-fpm-error/)
[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)

また、エラーログ等を見ることも大切です。
ssh接続し、以下のコマンドでエラー原因の特定に役立ちます

```
nginxのログファイル内を確認
$ sudo nano /var/log/nginx/error.log

nginxの状態確認
$ sudo systemctl status nginx

nginx設定ファイルのチェック
$ nginx -t

修正後、無停止で再起動
$ sudo nginx -s reload
```