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へ、ミステリーはコアサーバーのままという振り分けができる、というわけです。
作業の全体像
| 順番 | やること | 場所 |
|---|---|---|
| 1 | SSHで接続できるようにする | コアサーバー管理画面+PowerShell |
| 2 | フォルダ構成とDB名を確認 | SSH |
| 3 | DBをバックアップ | SSH |
| 4 | DNSの確認 | PowerShell(Windows側) |
| 5 | サブドメインを追加 | コアサーバー管理画面 |
| 6 | WP-CLIを使えるようにする | SSH |
| 7 | URL置き換えの予行演習 | SSH |
| 8 | フォルダ移動とURL置き換え(本番) | SSH |
| 9 | .htaccess の修正 | SSH |
| 10 | 旧URLからの301リダイレクト | SSH |
コマンド中の「アカウント名」「サーバー名」などは、自分の環境のものに読み替えてください。
1. コアサーバーにSSHで接続する
SSH接続IP許可
コアサーバーのSSHは、接続するパソコンのIPアドレスを先に許可しておく方式です。
- コントロールパネルにログインします。
- 「ツール」から「SSH設定」を開きます。
- 「SSH接続IP許可」ボタンを押します(VPNやプロキシは外しておきます)。
- 5分ほど待ちます。
許可は30日で切れるので、期限が過ぎたらもう一度ボタンを押します。
パスワードの確認
SSHのパスワードは、管理画面のログインパスワードではなくFTPのパスワードです。FTPソフトに保存していて分からない場合は、管理画面で見られます。
- コントロールパネル右上のサーバー名をクリックします。
- 「契約情報」を開きます。
- 「サーバーアカウント情報」のパスワード横の「表示」を押します。
同じ欄に、アカウント名とサーバー名も載っています。
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 ~alla * は「どんなサブドメインでも、この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 phpphp82cli、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/mysterywp 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_options | option_value | 9 |
| wp_postmeta | meta_value | 1 |
| wp_posts | post_content | 123 |
| wp_posts | guid | 34,124 |
合計34,257件と出ましたが、ほとんどは guid(記事の内部ID)でした。guidは変えないのがWordPressの基本です。変えると、RSSリーダーで全記事が新着扱いになったりします。なので本番ではguidを除外し、実際に置き換えるのは133件です。
8. フォルダ移動とURL置き換え(本番)
ここから数分、ミステリーサイトが表示できない時間が出ます。
コアサーバーが作った空のフォルダを削除します。
rmdir public_html/mystery.example.commysteryフォルダを、サブドメインのフォルダ名に移動します。2万記事分あっても一瞬で終わります。
mv public_html/example.com/mystery public_html/mystery.example.comURLを置き換えます。今度は --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.baksed -i 's#/mystery/#/#g' public_html/mystery.example.com/.htaccess直ったか確認します。
grep -E "RewriteBase|index.php \[L\]" public_html/mystery.example.com/.htaccessRewriteBase / と RewriteRule . /index.php [L] になっていればOKです。表示できるか確認します。
curl -sI https://mystery.example.com | head -1HTTP/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. ブラウザで最終確認
- https://mystery.example.com のトップと記事をいくつか開いて、表示を確認します。
- Googleで旧URLの記事を検索してクリックし、新しいURLの同じ記事に飛ぶか確認します。
- 表示がおかしい場合は、キャッシュ系プラグイン(私の場合はWP-Optimize)のキャッシュを削除します。
全部問題なし。バッチリでした。
つまずいたポイントまとめ
| 症状 | 原因 | 対処 |
|---|---|---|
| du コマンドが「Killed」 | 共用サーバーで重いコマンドが強制終了された | コピーをやめてフォルダ移動(mv)に変更 |
| wp コマンドが警告だらけ | Web用のPHPで動いていた | php82cli などコマンド用PHPを指定 |
| wp コマンドが Fatal error | プラグインがPHP 8.3以上を要求 | php84cli に変更 |
| 置き換え件数が3万件超え | guid(記事の内部ID)が含まれていた | –skip-columns=guid で除外 |
| サブドメインのフォルダがない | 管理画面での追加が反映途中 | 数分待つ |
まとめ
やったことを3つにまとめると、こうなります。
- フォルダの名前を変えただけなので、2万記事分のファイルを1つもコピーしていません。
- WP-CLI が、DBの中のURLを133か所まとめて書き換えてくれました。
- 301リダイレクトで、旧URLに来た人を新しいURLの同じページへ案内しています。
SSHの準備さえできれば、あとはコマンド数行で済みました。マジックみたいです。
注意点として、今回作ったリダイレクトはコアサーバー上にあります。example.com 本体をConoHaに移したら、同じリダイレクトをConoHa側にも設定し直す必要があります。忘れると旧URLからのアクセスが全部切れてしまうので、本体の引っ越しのときに忘れずにやります。





コメント