WordPressをDockerへ移行した話

概要

本ブログを構築しているWordPressですが、コンテナ環境に移行しました。
それによりDB専用サーバを用意してコンテナからDBサーバを参照しています。
また、合わせてLet’s Encryptをワイルドカード証明書にしました。

移行した理由は?

以下の2つを目的としています。

  • サーバー台数を減らすことによるコスト削減
  • コンテナ運用の学習

証明書をワイルドカードにした理由は?

サブドメインごとの証明書管理が面倒だった。

DB専用サーバを用意した理由は?

MastodonサーバでPostgreSQLを運用している関係上、RDSではなくEC2にDB専用サーバーを用意した方が拡張性を考慮しつつコストを抑えられた。
PostgreSQLはDockerサーバ内で動作しているため、今後移行を考えています。

今後の懸念は?

Dockerエンジンで複数のコンテナ上で動作しているため、Masotodnコンテナの負荷が上がった際にWordPressコンテナも影響を受ける可能性があります。
なので今後は状況に応じてスケールアップすることで対応を考えています。

移行の段取り

  1. DBサーバーの構築
  2. 既存WordPressのエクスポート
  3. 既存WordPressサーバの停止
  4. ワイルドカード証明書の新規取得
  5. Nginxのバーチャルホストの設定
  6. WordPressコンテナの作成・稼働
  7. WordPressデータのインポート

DBサーバーの構築

新規のDBサーバーの作業です。
OSインストールは割愛します。

OS周辺の設定

MariaDBのインストール

baseurlは以下のURLを参考にバージョン指定できます。
http://yum.mariadb.org/

yumをアップデートしてMariaDBをインストールします。

MariaDBの起動・自動起動設定をします。

MariaDBのセットアップ

WordPress専用のDBとユーザを作成します。

DB名 wordpress
DBユーザ名 wpadmin
DBユーザのパスワード wppassword
%は接続許可するホストになりますが、%は全て許可となります。セキュリティ上接続元ホストを指定してください。

これで構築完了です。最後に再起動しておきます。

既存WordPressのエクスポート

既存のWordPressサーバーの作業です。

「All-in-One WP Migration」というアドオンを使いました。

フリーの範囲では500MBまでの移行データをダウンロードできます。
私が実施した時は170MBでした。

エクスポートからファイルを指定します。

少し待つとダウンロードできるようになるので、エクスポートデータをダウンロードします。
拡張子は「wpress」になります。

ツール使わずにdumpとったり、ファイルをコピーしたりと試しましたが、Docker環境への移行ということもあり、ツールでデータを入れ直す方が早く綺麗に移行ができました。

既存WordPressサーバの停止

Let’s Encryptを使っており証明書の申請時にサーバのIPアドレス(Aレコード)のチェックが行われます。
なのでこのタイミングでブログのAレコードを変更する必要があり既存WordPressへアクセスすることができなくなります。
なお、Let’sEncryptの証明書はNginxに記載する証明書ファイルとそのシンボリックリンクファイルがあればサーバ間でコピーして正常に動くようです。
証明書をサーバ間でコピーすれば停止時間は0にすることも可能です。

ワイルドカード証明書の新規取得

Dockerサーバーの作業です。

適当なディレクトリにGitHubからcertbotをcloneしてきます。

ワイルドカード証明書なので、いろいろサーバなど指定したオプションで実行する必要があります。
サブドメインなしのドメインも含めたい場合は明示的に指定しないといけません。「–domain loner.jp」

前提
証明書を取得するサーバのIPアドレスとドメインのAレコードは一致させておかないとエラーになります。

まず1回目のTXTレコード登録です。
「_acme-challenge.loner.jp」に「XXXXXX….」のTXTレコードを登録します。
TTLによりますが、しばらく時間を開けないとTXTレコードが引くことができずエラーになります。

digコマンドで確認することができます。

なぜか2回確認が出るようです。
先ほど登録した「XXXX…」を「YYYYY…」に変更します。しばらく時間を置いてEnterを押します。

以下の場所に証明書が配置されます。

Nginxのバーチャルホストの設定

Dockerサーバーの作業です。

Nginxはすでに導入済みのため今回はインストール手順は別記事を参考にしてください。
ログなどの設定は一旦省略しています。

  • 80ポートはhttpsにリダイレクト
  • 443ポートはローカルホストのWordPressコンテナのポートに通信

WordPressコンテナの作成・稼働

Dockerサーバーの作業です。

/opt/wordpress配下にWordPressのファイルを永続化します。
environmentは.envファイルなど別ファイルを読み込ませることも可能です。

docker-composeから起動します。

WordPressの初期設定

https://loner.jp<自分のサイト>にアクセスします。
CSSがmix-content(http,https混在)によりブロックされます。
そのままやりづらいですが、サイト名やユーザを設定します。

後ほどデータをインポートするので上書きされます。

管理画面にログインしたら、「設定」の「一般」でWordPressアドレスとサイトアドレスをhttpsに修正します。

  • WordPress アドレス (URL)
  • サイトアドレス (URL)

画面を更新すると、以下の画面が表示されます。

このページは動作していません
loner.jp でリダイレクトが繰り返し行われました。

WordPressのコンフィグファイルを編集し「$_SERVER[‘HTTPS’] = ‘on’;」を追加ます。

これで管理画面にアクセスできるようになりました。

WordPressデータのインポート

新しいWordPressにデータをインポートするため「All-in-One WP Migration」のプラグインをインストールします。

インポート>ファイルから先ほどダウンロードした「.wpress」拡張子のファイルを選択してインポートして完了です。
全てのデータが復旧されており、優秀なプラグインでした。

苦労した点

停止時間を発生させるか悩みましたが、まとめて作業をしたかったこともあり、サーバ停止させました。
データ移行でdumpを取得したりファイル移行を試しましたが、WordPressに限ってはプラグインが優秀なので、そちらを利用する方が結果的によかったです。
Docker化することで、ファイルをコピーしてくるとファイルのパーミッションやhtaccessなどいろいろ変更点があり、その整理から解放されました。

今後は他のコンテナと共有のホストになるので、パフォーマンスや停止時間などいろいろ考慮して構成を変更していきたいと思います。

コメントを残す

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