この記事の続き。
Amazon Lightsail上にWordPressを配置し運用していたこのブログ(killtime.blog)をWebARENA Indigoに引っ越しした。その流れを記す。
大まかなの手順については目次ママです。
これをたどれば、アクセスの途切れる時間を最小で抑えられるし、新サーバでのドメインの設定とかちゃんとうまく行ってるよね?というのを確認してから移行できるという安心感もあるので、本稿ではこれで行きます。
では早速。
テスト用サブドメインのDNSレコード割り当て
ブログのドメインはkilltime.blog、URLはhttps://killtime.blogであるとする。
サブドメインとして、mgr.killtime.blogを割り当てる(mgrはmigrationの略語のつもり)。そして、
- killtime.blogは移転元のIPアドレスを参照する
- mgr.killtime.blogは移転先のIPアドレスを参照する
といった状態にしたい。
お使いのDNSの設定画面にて、Aレコードを設定する。名前を”mgr”、アドレスを移転先のIPアドレスにする。
例えばCloudflareならこう。管理画面、「DNS」タブから「レコードを追加」ボタンを押下。
このように入力し、保存すれば良い。
移転先のVPSの、NGINXのデフォルトページが表示されたので、ルーティングはうまく行っている模様。
また、ご承知のとおりこの時点でkilltime.blogは移転元のIPアドレスを参照している。
WordPress本体のファイルを引っ越す
まぁるっとWordPressの構成ファイルすべてを移転元でzipにして、それを移転先に展開する。
移転元VPSにて:
$ zip -r FILENAME.zip /path/to/wordpress/dir/
手元PC側(クライアントPC)にて:
$ scp -i {秘密鍵} -P {ポート} {ユーザ名}@{IPアドレス}:/path/to/zip/FILENAME.zip FILENAME.zip ##移転元VPSからダウンロード
$ scp -i {秘密鍵} -P {ポート} FILENAME.zip {ユーザ}@{IPアドレス}:~/FILENAME.zip #移転先VPSのとりあえずホームディレクトリにアップロード
移管先VPSにて:
$ mkdir /path/to/wordpress/dir/ #必要に応じて
$ unzip FILENAME.zip -d /path/to/wordpress/dir/ #解凍
$ sudo chown -R www-data:www-data /path/to/wordpress/dir/ #
データベースの引っ越し
移転元のVPSでバックアップファイルを作って、移転先VPSでリストアする。
移転元VPSにて:
$ mysqldump -u root -p --databases {WordPressのDB} > FILENAME.sql
なお、–databasesをつけることで、CREATE DATABASEのクエリも発行してくれるバックアップが出来上がる。
手元PCにて:
$ scp -i {秘密鍵} -P {ポート} {ユーザ名}@{IPアドレス}:/path/to/mysqldump/FILENAME.sql FILENAME.sql ##移転元VPSからダウンロード
$ scp -i {秘密鍵} -P {ポート} FILENAME.sql {ユーザ}@{IPアドレス}:~/FILENAME.sql #移転先VPSのとりあえずホームディレクトリにアップロード
移転先VPSにて:
$ mysql -u root -p
Enter password:<<パスワードを入力>>
mysql> source FILENAME.sql; #データベースをリストア
mysql> create user '{WP_USERNAME}'@localhost identified by '{PASSWORD}'; #WordPressのデータベース用のユーザを作成
mysql> grant all on WP_DBNAME.* to WP_USERNAME; #作ったユーザにWordPRessデータベースの権限を付与
CloudflareでSSL証明書を発行する
長くなったので別記事にまとめたので参照されたい。
NGINXの設定
移転先VPSで配置したWordPressにアクセスできるよう、NGINXの設定ファイルを書く。
# vim /etc/nginx/conf.d/wordpress.conf
#configuration file for killtimeblog
#httpリクエストはhttpsにリダイレクトさせる
server {
listen 80;
server_name mgr.killtime.blog;
return 301 https://killtime.blog$request_uri;
}
#httpsのリクエストを処理
server {
#httpsのみアクセスを許可
listen 443 ssl;
#証明書の設定
ssl_certificate /etc/ssl/certs/origin.pem; #オリジン証明書のパス
ssl_certificate_key /etc/ssl/private/privatekey.pem; #プライベートキーのパス
server_name mgr.killtime.blog; #サーバー名
index index.php;
root /path/to/wordpress/files/;
#wp-config.phpへのアクセスを拒否する
location ~* /wp-config.php {
deny all;
}
#@wordpressに処理を飛ばす
location / {
try_files $uri $uri/ @wordpress;
}
#フロントページ用の処理
#これを書かないと、ただphpファイルがダウンロードされるだけになってしまう
location ~ \.php$ {
try_files $uri @wordpress;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#フロントページ以外の処理
location @wordpress {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;
}
}
設定ファイルの読み込みを行う
# nginx -s reload
で、ブラウザから https://mgr.killtime.blogにアクセスすると、
こんな感じで表示され、WordPressが動作していることが確認できる。
ただ、この状態から各記事へジャンプすると、移管元のVPSに飛んでしまう。これはWordPressの設定でサイトURLがmgr.killtime.blogではなくkilltime.blogであると認識されているからだ。
この設定を変える。mysqlを開いて、
# mysql -u USERNAME -p
mysql>use {WordPressのDB名}
mysql> update wp_options set option_value ='https://mgr.killtime.blog' where option_value='https://killtime.blog';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
のようにする。すると、WordPress自身が自サイトのURLをmgr.killtime.blogであると認識するようになる。
ブラウザで、記事内をジャンプしてもURLがmgr.killtime.blogのまま遷移することを確認する。
なお、この状態を長く放置する場合は、検索エンジンがmgr.のほうをインデックスしないように設定しておく。
本番ドメインに切り替え
テスト用サブドメインでの遷移が確認できたら、設定を本番ドメインに切り替える。
NGINXの設定
こんな感じ。mgr.killtime.blogだった部分をkilltime.blogにする。
#configuration file for killtimeblog
#httpリクエストはhttpsにリダイレクトさせる
server {
listen 80;
server_name killtime.blog; #mgr.を消した
return 301 https://killtime.blog$request_uri; #mgr.を消した
}
#httpsのリクエストを処理
server {
#httpsのみアクセスを許可
listen 443 ssl;
#証明書の設定
ssl_certificate /etc/ssl/certs/origin.pem; #オリジン証明書のパス
ssl_certificate_key /etc/ssl/private/privatekey.pem; #プライベートキーのパス
server_name killtime.blog; #サーバー名 #mgr.を消した
#以下略
}
Cloudflareの設定
DNSで、killtime.blogのAレコードの値を移転先VPSのIPアドレスにする。
※モザイク部分は移転先VPSのIPアドレス。
以上で引っ越しは完了。数分で参照がすべて切り替わる。移転先VPSが本当に参照されているかどうかについては、例えば移転先のVPSでアクセスログを見れば良い。
# tail -f /var/log/nginx/access.log
アクセスログを開いたまま、ブラウザにアクセスしたタイミングでログが更新されていれば、間違いなく参照が切り替わっていると言える。