テーマをCocoonに変更しました!
wordpress

コアサーバーでサブディレクトリのWordPressをサブドメインに引っ越し!2万記事をコマンド数行で移した手順

FavoriteLoadingお気に入り登録
wordpress

example.com がたまに500エラーを吐くので、ConoHa VPSへの引っ越しを考え始めました。ところが、example.com の中には WordPress が複数入っていて、その中の1つ「ミステリーサイト(example.com/mystery/)」だけはコアサーバーに残したい…という事情がありました。

この記事では、サブディレクトリ(/mystery/)にあったWordPressを、同じコアサーバーの中でサブドメイン(mystery.example.com)に引っ越した手順をまとめます。記事数は約2万件ありましたが、ファイルを1つもコピーせずに、コマンド数行で終わりました。

なぜサブドメインに移す必要があったのか

ドメインの「道案内」をするDNSは、ドメインやサブドメイン単位でしかサーバーを振り分けられません。

URLの形別のサーバーに向けられる?
example.com/mystery/(フォルダ)できない(example.com と同じサーバーに行く)
mystery.example.com(サブドメイン)できる(DNSで個別に向け先を決められる)

つまり、example.com 本体をConoHaに向けると、/mystery/ も一緒にConoHaへ行ってしまいます。

そこで、先にサブドメインへ移しておけば、本体だけConoHaへ、ミステリーはコアサーバーのままという振り分けができる、というわけです。

作業の全体像

順番やること場所
1SSHで接続できるようにするコアサーバー管理画面+PowerShell
2フォルダ構成とDB名を確認SSH
3DBをバックアップSSH
4DNSの確認PowerShell(Windows側)
5サブドメインを追加コアサーバー管理画面
6WP-CLIを使えるようにするSSH
7URL置き換えの予行演習SSH
8フォルダ移動とURL置き換え(本番)SSH
9.htaccess の修正SSH
10旧URLからの301リダイレクトSSH

コマンド中の「アカウント名」「サーバー名」などは、自分の環境のものに読み替えてください。

1. コアサーバーにSSHで接続する

SSH接続IP許可

コアサーバーのSSHは、接続するパソコンのIPアドレスを先に許可しておく方式です。

  1. コントロールパネルにログインします。
  2. 「ツール」から「SSH設定」を開きます。
  3. 「SSH接続IP許可」ボタンを押します(VPNやプロキシは外しておきます)。
  4. 5分ほど待ちます。

許可は30日で切れるので、期限が過ぎたらもう一度ボタンを押します。

パスワードの確認

SSHのパスワードは、管理画面のログインパスワードではなくFTPのパスワードです。FTPソフトに保存していて分からない場合は、管理画面で見られます。

  1. コントロールパネル右上のサーバー名をクリックします。
  2. 「契約情報」を開きます。
  3. 「サーバーアカウント情報」のパスワード横の「表示」を押します。

同じ欄に、アカウント名とサーバー名も載っています。

PowerShellから接続

ssh アカウント名@サーバー名

初回は「Are you sure you want to continue connecting?」と聞かれるので yes と入力し、パスワードを入れます(入力中は何も表示されませんが、そのままEnterでOKです)。プロンプトが [アカウント名@サーバー名 ~]$ になればログイン成功です。

2. フォルダ構成とDB名を確認する

ホームの中を見ると、ドメインごとのフォルダは public_html の中にありました。

ls public_html/example.com/

中には home(本体)、サイトB(別のWordPress)、mystery などが並んでいました。

ミステリーサイトが使っているDBの情報を確認します。パスワードの行は画面に出さないようにしています。

grep -E "DB_NAME|DB_USER|DB_HOST|table_prefix" public_html/example.com/mystery/wp-config.php

つまずき:容量を調べたら「Killed」

フォルダの容量を調べようとしたら、途中で止められてしまいました。

du -sh public_html/example.com/mystery

結果は「Killed」。共用サーバーなので、重いコマンドは強制終了されるようです。2万記事分の画像があるので、フォルダを丸ごとコピーするのも途中で止まる可能性が高いと判断しました。

そこで方針を変更し、コピーではなく「移動(フォルダ名の変更)」で対応することにしました。移動なら中身を読み込まないので一瞬で終わります。

3. DBをバックアップする

ファイルは移動するだけで中身は変わりませんが、DBはURLの置き換えで中身が変わります。なので、バックアップはDBを重点的に取ります。

パスワードを聞かれたら、wp-config.php の DB_PASSWORD の値を入力します。

mysqldump --single-transaction --quick -u DBユーザー名 -p DB名 | gzip > ~/mystery_backup.sql.gz

できたファイルのサイズを確認します。

ls -lh ~/mystery_backup.sql.gz

最後まで正常に書き出せたかも確認します。

zcat ~/mystery_backup.sql.gz | tail -1

-- Dump completed on ... と出ればバックアップ成功です。圧縮後で21MBでした。念のため、WinSCPでPCにもダウンロードしておきました。

4. DNSを確認する

サブドメインをコアサーバーに向けるDNS設定が必要かどうかを確認します。これはWindows側のPowerShellで打ちます(SSHの画面ではありません)。

まず、ドメインのネームサーバーを確認します。

nslookup -type=ns example.com

結果は ns1.value-domain.com でした。つまり、DNSはValue Domainで管理されています。

次に、まだ作っていないサブドメインがどこを向いているか確認します。

nslookup mystery.example.com

コアサーバーのIPアドレスが返ってきました。Value DomainのDNS設定を見ると、こうなっていました。

a * コアサーバーのIP
mx @ 10
txt @ v=spf1 ip4:コアサーバーのIP ~all

a * は「どんなサブドメインでも、このIPへ向ける」という意味です。すでに全部のサブドメインがコアサーバーに向いているので、DNSの作業はなしでした。

5. コアサーバーでサブドメインを追加する

コントロールパネルのドメイン設定から mystery.example.com を追加し、無料SSLもあわせて設定します。

反映には少し時間がかかります。SSHでフォルダができたか確認します。

ls -la public_html/mystery.example.com/

最初は「No such file or directory」でしたが、少し待つと空のフォルダが作られました。

6. WP-CLIを使えるようにする

2万記事の中にある旧URLを、一括で新URLに置き換えるために WP-CLI を使います。コアサーバーには最初から入っています。

つまずき:wpコマンドがエラーだらけ

wp --info

これを打つと、PHPの警告がズラッと出て動きませんでした。原因は、wp がWeb用のPHPで動いてしまっていることです。コアサーバーには、コマンド用のPHP(名前に cli が付くもの)が別に用意されています。

ls /usr/local/bin/ /usr/bin/ | grep -i php

php82cli、php84cli などが見つかりました。これで試すと、正常に動きました。

php82cli /usr/local/bin/wp --info

毎回長いコマンドを打つのは大変なので、wp だけで動くように短縮設定をします(SSHを切ると消えるので、つなぎ直したら再設定します)。

alias wp='php82cli /usr/local/bin/wp'

おまけのつまずき:PHPのバージョンが足りない

別のサイト(本体)でWP-CLIを使ったときは、「Contact Form 7 が PHP 8.3以上を必要としている」というエラーで止まりました。その場合は、新しいPHPを指定し直せばOKです。

alias wp='php84cli /usr/local/bin/wp'

今のURLを確認

wp option get home --path=public_html/example.com/mystery
wp option get siteurl --path=public_html/example.com/mystery

どちらも https://example.com/mystery でした。

7. URL置き換えの予行演習

まず、新しいサブドメインでSSLが使えるか確認します。

curl -sI https://mystery.example.com | head -1

結果は HTTP/2 403。これは「フォルダが空っぽで見せるものがない」という意味で、SSL自体は正常につながっています。

次に、置き換え対象の件数を数えます。--dry-run を付けているので、数えるだけでDBは一切変わりません。

wp search-replace '//example.com/mystery' '//mystery.example.com' --path=public_html/example.com/mystery --dry-run --report-changed-only

検索する文字を https:// からではなく // からにしているのは、http と https の両方をまとめて置き換えるためです。

テーブル列件数
wp_optionsoption_value9
wp_postmetameta_value1
wp_postspost_content123
wp_postsguid34,124

合計34,257件と出ましたが、ほとんどは guid(記事の内部ID)でした。guidは変えないのがWordPressの基本です。変えると、RSSリーダーで全記事が新着扱いになったりします。なので本番ではguidを除外し、実際に置き換えるのは133件です。

8. フォルダ移動とURL置き換え(本番)

ここから数分、ミステリーサイトが表示できない時間が出ます。

コアサーバーが作った空のフォルダを削除します。

rmdir public_html/mystery.example.com

mysteryフォルダを、サブドメインのフォルダ名に移動します。2万記事分あっても一瞬で終わります。

mv public_html/example.com/mystery public_html/mystery.example.com

URLを置き換えます。今度は --dry-run なしの本番で、--skip-columns=guid でguidを除外しています。

wp search-replace '//example.com/mystery' '//mystery.example.com' --path=public_html/mystery.example.com --skip-columns=guid --report-changed-only

「Success: Made 133 replacements.」と出れば成功です。DBは元の場所のものをそのまま使うので、DBの引っ越しは不要です。

9. .htaccess を修正する

.htaccess の中身を確認します。

cat public_html/mystery.example.com/.htaccess

旧フォルダ名の /mystery/ が2か所残っていました。

RewriteBase /mystery/
RewriteRule . /mystery/index.php [L]

念のためコピーを取ってから、/mystery/ を / に置き換えます。

cp public_html/mystery.example.com/.htaccess public_html/mystery.example.com/.htaccess.bak
sed -i 's#/mystery/#/#g' public_html/mystery.example.com/.htaccess

直ったか確認します。

grep -E "RewriteBase|index.php \[L\]" public_html/mystery.example.com/.htaccess

RewriteBase / と RewriteRule . /index.php [L] になっていればOKです。表示できるか確認します。

curl -sI https://mystery.example.com | head -1

HTTP/2 200 が出ました。これで新しいURLで表示できています。

10. 旧URLから301リダイレクトする

最後に、検索結果やブックマークから旧URLに来た人を、新しいURLの同じページへ案内します。

旧URLの場所に空のフォルダを作ります。

mkdir public_html/example.com/mystery

その中に、新しいURLへ飛ばす .htaccess を作ります。

printf 'RewriteEngine On\nRewriteRule ^(.*)$ https://mystery.example.com/$1 [R=301,L]\n' > public_html/example.com/mystery/.htaccess

$1 の部分に「/mystery/ より後ろのURL」が入るので、記事ページも同じ記事の新しいURLに飛びます。

ちゃんと飛ぶか確認します。

curl -sI https://example.com/mystery/ | grep -iE "^HTTP|^location"

HTTP/2 301 と location: https://mystery.example.com/ が出れば成功です。

11. ブラウザで最終確認

  1. https://mystery.example.com のトップと記事をいくつか開いて、表示を確認します。
  2. Googleで旧URLの記事を検索してクリックし、新しいURLの同じ記事に飛ぶか確認します。
  3. 表示がおかしい場合は、キャッシュ系プラグイン(私の場合はWP-Optimize)のキャッシュを削除します。

全部問題なし。バッチリでした。

つまずいたポイントまとめ

症状原因対処
du コマンドが「Killed」共用サーバーで重いコマンドが強制終了されたコピーをやめてフォルダ移動(mv)に変更
wp コマンドが警告だらけWeb用のPHPで動いていたphp82cli などコマンド用PHPを指定
wp コマンドが Fatal errorプラグインがPHP 8.3以上を要求php84cli に変更
置き換え件数が3万件超えguid(記事の内部ID)が含まれていた–skip-columns=guid で除外
サブドメインのフォルダがない管理画面での追加が反映途中数分待つ

まとめ

やったことを3つにまとめると、こうなります。

  1. フォルダの名前を変えただけなので、2万記事分のファイルを1つもコピーしていません。
  2. WP-CLI が、DBの中のURLを133か所まとめて書き換えてくれました。
  3. 301リダイレクトで、旧URLに来た人を新しいURLの同じページへ案内しています。

SSHの準備さえできれば、あとはコマンド数行で済みました。マジックみたいです。

注意点として、今回作ったリダイレクトはコアサーバー上にあります。example.com 本体をConoHaに移したら、同じリダイレクトをConoHa側にも設定し直す必要があります。忘れると旧URLからのアクセスが全部切れてしまうので、本体の引っ越しのときに忘れずにやります。

気になる中古パソコン

パソコン

Supported by Rakuten Web Service

コメント

📖目次
タイトルとURLをコピーしました
PR

当サイトは、Amazon、楽天アソシエイト・他プログラムの参加者です。リンクを通じて商品を購入すると、紹介料を得る場合があります。

⚠ 免責事項

本記事は、筆者が実際に行った作業を記録したものです。サーバーの環境や設定によっては、同じ手順でも結果が異なる場合があります。

作業を行う際は、事前にバックアップを取ったうえで、ご自身の責任で実施してください。本記事の内容を参考にしたことによって生じたトラブルや損害について、当サイトは一切の責任を負いかねますので、あらかじめご了承ください。