BitnamiのWordPressのコンテナって、普通にコンテナ内でPHPを yum / apt upgrade できない。Bitnami側にも事情はあるんだろうけど勘弁してほしい。ということで、今後のことを考えて素の Compute Engine(Debian 11)に当ブログを引越すことにしました。
進行手順
- 旧 サーバのWordPress のデータエクスポート
- 新 サーバにWordPress環境の構築し、旧サーバのデータをインポート
- 新 サーバのSSL設定
- Cloudflareの設定変更
- 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から取得する
- 証明書と秘密鍵は、ダッシュボードの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設定まわりの参考
- Cloudflareを使ってウェブサイトを無料でHTTPS化してみた
- Origin CA certificates(Cloudflare公式情報)
- Ubuntu Server with Apache2: Create CSR & Install SSL Certificate (OpenSSL)
- 全ページをSSLにする方法(Apache)
4. Cloudflareの設定変更
– 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 のファイアウォールに設定する とか参考に、時間あるとき自動化設定する
作業後記
移行作業って、仕事でも何度もやってるけど、手順が多くて面倒。仕事でやるぶんには、でも対価を頂けるし、チームワークで楽しくできるんだけども、個人でやるの時はつかれるは・・・