CloudflareとGCPにWordPressを引越した話

BitnamiのWordPressのコンテナって、普通にコンテナ内でPHPを yum / apt upgrade できない。Bitnami側にも事情はあるんだろうけど勘弁してほしい。ということで、今後のことを考えて素の Compute Engine(Debian 11)に当ブログを引越すことにしました。

進行手順

  1. 旧 サーバのWordPress のデータエクスポート
  2. 新 サーバにWordPress環境の構築し、旧サーバのデータをインポート
  3. 新 サーバのSSL設定
  4. Cloudflareの設定変更
  5. GCP firewall 設定

1. 旧 WordPress のデータエクスポート

All-in-One WP Migration というプラグイン(無料)を利用する事にしました。 wordpressのディレクトリを tar.gz で固めて、DBテーブルエクスポートトしてみたいな事を試そうと思ったんですが、wordpressのディレクトリ内に、Bitnamiの管理用と思われるファイルがいくつかあって、それらを調査して切り分けするのに時間がかかりそうな予感がしたので。そこで思考停止させて、プラグインを利用してエクスポート。

2. 新 サーバでのWordPress環境の構築

<a href=”https://cloud.google.com/free/docs/free-cloud-features?hl=ja#compute” rel=”noopener” target=”_blank>オレゴン(us-west1)の e2-micro VM の 1ヶ月分の利用合計料金が無料対象のようなので、そのインスタンスをたてました。OSは、デフォルトとなっていた Debian 11 で。firewall は HTTP / HTTPS / SSH のみ許可で。

2-1. swap 作成・設定

メモリが少ないインスタンスでは定番の、swap 作成・設定

# サイズを指定し、空のファイル作成
dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile

# スワップ領域に指定
mkswap /swapfile

# スワップ領域有効化
swapon /swapfile

# 再起動時の自動スワップ設定
emacs /etc/fstab
## /swapfile swap swap defaults 0 0 を追加

reboot now

# 確認
free -m

2-2. WordPressのインストール・移行

apt update
apt upgrade
apt install apache2 php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip mariadb-server

# 移行時に大きなファイルアップロードが必要なため
emacs /etc/php/7.4/apache2/php.ini
## - post_max_size = 8M## + post_max_size = 200M
## - upload_max_filesize = 2M
## + upload_max_filesize = 200M

systemctl enable apache2
systemctl restart apache2

# mysqlの準備
mysql -uroot -p
CREATE DATABASE [database_name] DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER '[user_name]'@'localhost' IDENTIFIED BY '[user_password]';
GRANT ALL PRIVILEGES ON [database_name].* TO [user_name]@localhost IDENTIFIED BY '[user_password]';
FLUSH PRIVILEGES;

# wordpressの準備
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvfz latest-ja.tar.gz
rm -rf /var/www/html/
mv wordpress/* /var/www/html/
chown -R www-data:www-data /var/www/html/

その後、/var/www/html/wp-config.php を作成し、DB系とsalt系の設定。不要なファイルを削除し、ブラウザ上から適当にwordpressを初期化処理。

初期化後、新サーバのWordPressにも All-in-One WP Migration プラグインをインストールし、「1」でエクスポートしたファイルをインポート。しようとしたけど、タイムアウトが発生してあきらめ、ローカルのMacに docker-compose で wordpress + mysql 環境をつくって 同じことを試してみる。

Migrationプラグインを入れて「1」のファイルをインポートしてみたら成功。なので、この環境の /var/www/html ディレクトリを tar.gz して、mysqldump して、新サーバはscp。dumpしたファイル内の「localhost:8000 を、新サーバのIPアドレスの置換して、wp-config.php の内容も新サーバで作成したものをコピー。

その後、mysqlインポートして、wordpressのディレクトリ(/var/www/html/)一式を入れ替えた後、ブラウザからアクセスしてみたところ、引越成功。最初からこれでよかたやん。という話しはおいておいて・・・

3. 新 サーバのSSL設定

今回、end-to-end 暗号化したいので、新サーバをSSL対応にしたいので、必要な証明書、秘密鍵、CAルート証明書をCloudflareから取得する
cloudflare ssl tls origin server

  • 証明書と秘密鍵は、ダッシュボードのSSL/TLS > Origin Server で生成し取得
  • CAルート証明書は、<a href=”https://developers.cloudflare.com/ssl/origin-configuration/origin-ca#cloudflare-origin-ca-root-certificate” rel=”noopener” target=”_blank>Cloudflare Origin CA root certificate から取得

scpで新サーバに送信後、適当なディレクトリに配置し、権限設定
chmod 400 -R /path/to/files-directory

 

配置した3ファイルをapacheのconfファイルで指定

emacs /etc/apache2/sites-enabled/default-ssl.conf
### 32,33行目 : cloudflare で取得した証明書に変更
## SSLCertificateFile /path/to/files-directory/xxxxxxxxx.pem
## SSLCertificateKeyFile /path/to/files-directory/xxxxxxxx.key
### 45行目 : コメント解除して cloudflare で取得したCAルート証明書に変更
##SSLCertificateChainFile /path/to/files-directory/origin_ca_rsa_root.pem

設定した内容の反映

a2ensite default-ssl
a2enmod ssl
systemctl restart apache2

全ページをSSLに設定

emacs /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
DocumentRoot /var/www/virtual.host
ServerName www.virtual.host
ServerAdmin webmaster@virtual.host
ErrorLog /var/log/apache2/virtual.host.error.log
CustomLog /var/log/apache2/virtual.host.access.log combined
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

# 設定した内容の反映
a2enmod rewrite
systemctl restart apache2

SSL設定まわりの参考

4. Cloudflareの設定変更

cloudflare ssl tls
– Cloudflareのダッシュボードから、Websites にて、新サーバのIPアドレスを登録
– Cloudflareのダッシュボードから、SSL/TLS > Overview で「Full(Strict)設定

5. GCP firewall 設定

新サーバにHTTP/HTTPSアクセスするのはCloudflareだけなので、新サーバのネットワークのfirewall設定(httpとhttps)に、CloudFlareのIPレンジを登録。これ仕事だったら自動化しないとだめなところだけど、個人なので今回は手動で実施。

TODO: flexchar/cf-to-gcp とか Terraform で CloudFlare の IP を取得して GCP のファイアウォールに設定する とか参考に、時間あるとき自動化設定する

作業後記

移行作業って、仕事でも何度もやってるけど、手順が多くて面倒。仕事でやるぶんには、でも対価を頂けるし、チームワークで楽しくできるんだけども、個人でやるの時はつかれるは・・・