[WordPress事例] 約15GBのサイトをロリポップ-ロリポップ間で移設

福井県福井市にある企業さまから、ファイル総サイズ約15GBのWordPressサイトの移設依頼をたまわりました。運用中のレンタルサーバ(以下、旧サーバ)はロリポップのスタンダードプランで、ロリポップのスタンダードプランで別途運用中のサーバ(以下、新サーバ)への移設というご希望です。

同様の課題を抱えていらっしゃる方に向け、弊社で行った作業の流れをおおまかに紹介します。

WordPressにはサイトバックアップや移転に適した定評のあるプラグインがいくつかありますが(BackWPup、All-in-One WP Migration、UpdraftPlusなど)、本事例ではそうしたプラグインを使わずに行っています(理由は後述)。

移設の流れ

  1. 旧サーバのデータベースをエクスポート
  2. 旧サーバの wp-content ディレクトリをバックアップ
  3. 新サーバにWordPressを新規インストール
  4. 1・2を新サーバに転送
  5. 2を新サーバの wp-content 以下に配置
  6. 1を新サーバのデータベースにインポート

作業は wp-content ディレクトリ以下のファイル・ディレクトリ群をいかに移すかがポイント。プラグインを使わずに行うため、新旧両サーバにSSH接続してコマンドを実行しながら進めていきます。


下準備

SSH接続の有効化

ロリポップではSSH接続がデフォルトで使えません。オンラインマニュアルに沿って、新旧サーバともSSH接続を有効化しておきます。

WP-CLIのインストール

WordPressを管理するためのコマンドラインインターフェース『WP-CLI』を新旧両サーバにインストール。GitHubにある拙作スクリプトを使って導入します。

作業用ディレクトリの作成

新旧両サーバのユーザディレクトリ直下に tmp ディレクトリを作っておきます。

旧サーバデータベースのエクスポート

旧サーバのWordPressインストールディレクトリが ~/web/ 直下であるとします。

~/web/wp-content/ に移動して、WP-CLIでデータベースをエクスポートしておきます。

$ cd ~/web/wp-content/
$ wp db export

旧サーバ wp-content ディレクトリの複製

旧サーバにて下記のコマンドを実行します。以降の作業は ~/tmp/ 内で行います。

$ cd ~/web/
$ cp -r wp-content/ ~/tmp/

公開鍵認証の設定

旧サーバから新サーバへのファイル転送は scp コマンドを使って行います。接続の手順を簡略化するため、旧サーバで ssh-keygen コマンドを実行しキーペアを作っておきます。

$ ssh-keygen

新サーバにも ~/.ssh ディレクトリを作り、旧サーバの ~/.ssh/ ディレクトリにある公開鍵を登録します。

$ ~/.ssh/id_rsa.pub | ssh -p 2222 {ssh_account}@ssh.lolipop.jp "cat >> ~/.ssh/authorized_keys"

新サーバに公開鍵を登録したら、旧サーバの ~/.ssh/ 内に config ファイルを作っておきます。

Host newHost
 User {ssh_account}
 Hostname ssh.lolipop.jp
 IdentityFile ~/.ssh/id_rsa
 Port 2222

wp-content ディレクトリの処理

約15GBの大半を占めるのは wp-content/uploads/ ディレクトリにあるファイル群です。

サイトは2019年9月運用開始と比較的最近だったものの、 wp-content/uploads/ にあるメディアファイルだけで54503ファイル・総計約14GB。50MBを超える多数の動画ファイルもサイズを押し上げていました。

こうなるとバックアップ系のプラグインでは歯が立ちません。コマンドで処理する前に、常用している『BackWPup』を使ってみたのですが、バックアップジョブが始まったきりプログレスバーがまったく進まない。タイムアウトして処理が止まっているのかどうかもわからないという状況でした。

そこで、コマンドで wp-content ディレクトリを圧縮して scp で転送するという方針に切り替えたわけです。

zipでの圧縮は不成功 tarでの圧縮でもエラーに

ところが、これまた一筋縄ではいきません。zipでは圧縮がうまくいかないのです。

$ zip -r wp-content.zip wp-content/

コマンドを実行してできたのは謎のファイル。

$ ls
wp-content  zimarttl

試しに展開してみると…

$ unzip zimarttl
Archive:  zimarttl
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of zimarttl or
        zimarttl.zip, and cannot find zimarttl.ZIP, period.

zipがダメなら…ということでtarで圧縮します。

$ tar czvf wp-content.tgz wp-content/
$ ls
wp-content  wp-content.tgz

ところが、これもきちんと圧縮されません。

$ tar tf wp-content.tgz
⁝
wp-content/uploads/2020/05/example.jpg

gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

原因は定かでないのですが、ターミナルに流れる圧縮の過程を観察するに、動画ファイルの圧縮時に処理につまずいてエラーを引き起こしているようでした。

メディアファイルを月別にtarで圧縮

~/tmp/wp-contents/uploads/ 内に年月ベースで存在するメディアファイルから、動画ファイルだけを別ディレクトリに移します。動画ファイルは2020年の4月・5月・6月だけにあったので、以下のようなディレクトリ構造としました。

📁 wp-content
  📁 uploads
   📁 2019
   ⁝
   📁 2020
   ⁝
    📁 04
    📁 04-movie
    📁 05
    📁 05-movie
    📁 06
    📁 06-movie
   ⁝
  📁 2021
   ⁝

月別の圧縮ファイルとするため、下記のコマンドを実行します。

$ cd ~/tmp/wp-content/uploads/
$ find 2019/* -type d -exec tar czvf {}.tgz {} \;
$ cd 2019/
$ ls | grep tgz | sed -e s/\.tgz// | awk '{print $1 ".tgz " "2019-" $1 ".tgz"}' | xargs -n 2 mv

これで ~/tmp/wp-contents/uploads/2019/ 内に「2019-MM.tgz」というファイル群ができます(MM は2桁の月表記)。2020年・2021年のメディアファイルについても同様の処理を行います。

圧縮ができたら ~/tmp/wp-contents/uploads/YYYY/ 内で圧縮ファイルを検証します(YYYY は4桁の年表記)。

$ tar tf YYYY-MM.tgz

圧縮されたファイル数も確認しておきます。

$ find ./MM -type f | wc -l
$ tar tf YYYY-MM.tgz | grep -v "/$" | wc -l

テーマ、プラグイン、言語ファイルのディレクトリもそれぞれ圧縮

これはメディアファイルほどに難ある作業ではありません。

$ cd ~/tmp/wp-content/
$ find -type d -regex "\(./themes\|./plugins\|./languages\)" -exec tar czvf {}.tgz {} \;

圧縮ファイルの検証・確認も行っておきます。テーマ、プラグイン、言語ファイルそれぞれ同様に。

$ tar tf themes.tgz
$ find ./themes -type f | wc -l
$ tar tf themes.tgz | grep -v "/$" | wc -l

新サーバにWordPressを新規インストール

コントロールパネルでデータベースを作成した上でWordPressを新規インストールします。ここでは、GitHubに公開している拙作シェルスクリプトを使いました。インストール先は、~/web/ 直下に作成した foo ディレクトリです。

インストールできたら一応、~/web/foo/wp-content/ あたりにデータベースをエクスポートしておきます。

$ cd ~/web/foo/wp-content/
$ wp db export

旧サーバから新サーバにscpでファイル転送

~/tmp/wp-content/ 内にある

  • plugins.tgz
  • themes.tgz
  • languages.tgz
  • エクスポートしたデータベース(.sql)

および ~/tmp/wp-content/uploads/YYYY/ 内にある

  • YYYY-MM.tgz
  • YYYY-MM-movie.tgz

を、新サーバの ~/tmp/ に scp で転送します。

$ scp *.tgz newHost:~/tmp

といった具合に実行すればすんなりいくかと思いきや、ある程度転送したところで

connection to ssh.lolipop.jp closed by remote host.

と強制的に切断されてしまいました… ~/.ssh/config に ServerAliveInterval や ServerAliveCountMax を記述するも改善が見られなかったので、ここは地道に scp コマンドを何回か実行しました。


新サーバに転送されたファイルを適宜配置して展開

新サーバの ~/tmp/ 内にある *.tgz と *.sql を移動します。

  • ~/web/foo/wp-content/ に移動
    • plugins.tgz
    • themes.tgz
    • languages.tgz
    • エクスポートしたデータベース(.sql)
  • ~/web/foo/wp-content/uploads/ に移動
    • YYYY-MM.tgz
    • YYYY-MM-movie.tgz

移動したら ~/web/foo/wp-content/ と ~/web/foo/wp-content/uploads/ のそれぞれで下記のコマンドを実行します。

$ find -maxdepth 1 -name "*.tgz" -exec tar xzvf {} \;

~/web/foo/wp-content/uploads/YYYY/MM-movie/ というディレクトリに動画ファイルが展開されているので、対応する月のディレクトリに移動します。

$ cd ~/web/foo/wp-content/uploads/YYYY/
$ mv MM-movie/* MM/
$ rmdir MM-movie/

エクスポートしたデータベースを新サーバにインポート

~/web/foo/wp-content/ にあるエクスポート済みファイルをWP-CLIでインポートします。

$ wp db import {exported_db_file}

企業さまのご依頼はサイトURL変更(旧:www.example.com 新:www.example.jp)を伴う移設だったので、WP-CLIでデータベース内の置換も行いました。

$ wp search-replace 'https://www.example.com' 'https://www.example.jp'

これで作業は完了です。不要になったディレクトリ・圧縮ファイルなどを適宜削除しておきます。

以上、プラグインを使わず、約15GBのWordPressサイトをロリポップ-ロリポップ間で移設しました。


WordPressサイト移設のご相談承ります

企業や店舗のウェブ担当者さま、WordPressサイトの移設やバックアップにお困りでしたらメールフォームよりお気軽にご相談ください。お使いのサーバ・移転先サーバの情報などをうかがい、移設の可否について簡易的に診断いたします(サーバ環境により移設が困難な場合もあります)。