WordPress 移転メモ

環境

移転元

  • さくらのレンタルサーバー (スタンダードプラン)
  • Apache 2.2

移転先

  • さくらの VPS
  • Docker
    WordPress と MySQL 、二種類のコンテナを立ち上げる。WordPress 用のコンテナでは、サーバーソフトウェアとして Nginx を使用する。

Docker のホストとなる環境には、以下のソフトウェアやツールをインストールしておく。

  • Nginx
    リバースプロキシとして使用。
  • Unbound
    コンテナ間通信時の DNS として使用。
  • docker-ip-register
    起動中の Docker コンテナの IP アドレスを Unbound のコンフィグに登録する自作ツール。

移行データの準備

今回サーバーソフトウェアが Apache と Nginx と、移行前後で異なるため、移行対象を投稿データのみに限定した。

投稿データ

ブログ管理画面から、 ツール → エクスポート → すべてのコンテンツ → エクスポートファイルをダウンロード でデータを作業用 PC に落とす。

投稿データには通常のブログ記事のほか、コメント等も含まれる。

画像等

FTP とかでログインし、 WordPress のディレクトリ下にある /wp-contents/uploads を作業用 PC に落とす。

プラグイン

サーバーソフトウェアの違いから、直接ファイルを操作して移行すると不具合が起きる可能性がある。

設定をメモっておき、その情報を元に手動で設定をおこなう。

MySQL

MySQL は Docker を利用しているが、特に設定することは変わらない。

WordPress 用のデータベースを作成し、作業用のユーザーを充てる。

Docker

MySQL のコンテナは Docker Hub Registory で確認できる オフィシャルリポジトリ を使って立ち上げた。

以下のようなシェルスクリプトを書き、実行している。

内容の補足をすると…

  • 変数 DB_PASSWORD は MySQL サーバーの root のパスワード。ホストの外側からアクセスできないようにしているが、変えておいた方がよいと思う。
  • シェルスクリプトのある位置に data という名前のディレクトリを作り、それを MySQL の情報が書き込まれるようにしている。
  • 変数 CONT_NAME をもとに Unbound にホスト名が設定される。以下の場合、 mysql-1.mydocker がホスト名になる。 (mydocker 部分は docker-ip-register が設定する TLD の初期値)

WordPress 用コンテナの作成

Dockerfile Project の dockerfile/nginx リポジトリ を元に Dockerfile を作成している。

Dockerfile の記述は以下のような感じ。

内容の補足をすると…

  • システム時間を日本に。
  • 言語設定を英語圏の UTF-8 に。(癖で書いているが、必要ないかも)
  • PHP の実行環境として php-fpm をインストール。
  • メール通知用にメールソフト (ここでは sendmail) をインストール。
  • リバースプロキシ経由でアクセスすると、接続元の情報がリバースプロキシのものになる。正しい IP アドレスを渡すためのヘッダ情報をセットしている。

Dockerfile を好みで弄って、 docker build -t {イメージ名} . 。ここでつけたイメージ名は覚えておくこと。

WordPress 用コンテナの起動

こんな感じのシェルスクリプトを作成して保存する。

補足。

  • シェルスクリプトの位置を基準に、 nginx と www のディレクトリを作成する。
    • nginx の下には certs, log, sites-enabled のディレクトリを作成する。それぞれの意味は docker run の行を参照。
    • www は公開の基準となるディレクトリ。 sites-enabled 内では /var/www として扱う。
  • この時点では sites-enabled 内に設定ファイルがないためコンテナの起動にコケる。

コンテナ の Nginx 設定

上記スクリプト実行後、 sites-enabled 内にコンテナ用の設定ファイルを作成する必要がある。

以下のような内容で作成し、 sites-enabled 内に好きな名前で保存する。

補足。

  • location / の if 部分は WordPress のパーマリンク用。
  • location ~ \.php$ 部分は php-fpm 用の設定。

再度 docker run 用のスクリプトを実行すると、打ち間違いがなければコンテナ内で正常に Nginx が実行されるはず。

今後コンテナ用の Nginx の設定ファイルを書き換えた場合も、同じように docker run 用のスクリプトを実行すると設定が反映される。

ホストの Nginx 設定

この時点で WordPress 用のコンテナが起動できているはずだが、現時点ではホスト側からしかアクセスができない。

ホストの Nginx にリバースプロキシを設定してやる必要がある。

/etc/nginx/sites-enabled 下に、以下のような設定ファイルを作成する。

補足。

  • {ホスト名} の部分は運用時のホスト名を書く。更新日時点のここの場合は blog.indeep.xyz となる。
    • テスト時はまったく別のホスト名を用意したり、別のポートから繋ぐようにした方がいいかもしれない。

ホストの Nginx をリロードすると、上記のホスト名でコンテナ内の Nginx サーバーにアクセスできる。もちろんドメインは事前に通しておく必要がある。

WordPress のインストール

これまでの時点で、コンテナ内の Nginx にアクセスすることはできるようになったはず。

WordPress のインストールは、 docker run スクリプトの下の www ディレクトリ下でおこなう。

特徴のある作業ではないのでざっと書くが、 www ディレクトリに cd して、 wget で WordPress の圧縮ファイルを落として unzip する。 docker run スクリプトの位置から見て、 www/wordpress に WordPress のルートが来るように配置する。

所有者を chown -R www-data:www-data wordpress で変更する。ホストの OS によっては www-data の uid, gid が違う可能性もある。うまく動かない場合は chown -R 33:33 wordpress で変更。

普通どおりに wp-config.php を設定したら、普通どおりに wp-admin/install.php から初期設定をおこなう。

wp-admin/install.php がうまくいかない場合は、 wp-config.php のアドレスを確認したり、ホストの Unbound デーモンを再起動させてみるとよい。ホストの Unbound が Docker コンテナからの接続を許可していることも確認。標準では 172.17.0.0/16 の範囲だ。

データの移行

投稿データ

WordPress プラグイン WordPress Importer をインストールし、有効化する。

ブログ管理画面から、 ツール → インポート → WordPress で事前に落としておいた移行元の xml ファイルをアップロードしてインポート。次の画面でインポート時の著作ユーザーの名前を設定し、チェックボックス Download and import file attachments を有効化し、 Submit 。

画像等

WordPress のディレクトリ下にある /wp-contents/uploads を移行元のデータで上書き。

所有者を www-data:www-data に書き換えるのを忘れずに。

プラグイン

移行前の情報をもとに同じように設定していく。

以上です

自分なりの復習として順を追って書いてみました。

くっそ長いですね。

セキュリティ上の判断と、コンテナ等に自分向けの方言的な設定が混じっていることから各設定を直接 GitHub や Docker Hub に公開することを控えたのですが、これだったら修正してアップした方がラクだったかもしれません。

移行による変化

今回、さくらのレンタルサーバー (スタンダード) からさくらの VPS に移行したのですが、読み込み速度が大きく改善しました。

前回は基本となる HTML 部分を読み込むのに 3 秒はかかっていたのに、今は 1 秒を切りました。以前はブログの設定を変更したり、記事の修正する際にイライラとしていたのですが、これで平然と作業することができそうです。

Docker を使った利点としては、立ち上げ時と運用時に使うファイルがより具体的になったことが挙げられます。コンテナ内部に独自の環境を作り上げているので、今後の作業で環境が汚染されることもありません。いつか問題が起きたときも、調べる範囲が小さく済むことでしょう。

というわけで、記事が縦に長過ぎるという欠点はありますが、作業内容自体はとても身になるものでした。

参考サイト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です