前回のWordPress構築編の続編です。
現行サーバから記事データを移行するのと、アクセスするURLをサブドメイン、かつHTTPSにしていきます。
記事にするにあたり、実際に行った作業そのままではなく、試行錯誤の過程を一部省略しているので、もしかしたら前後で辻褄が合っていない箇所があるかもしれません。
前回同様、コマンドの先頭が%
の場合はローカル、$
の場合はVPS上の一般ユーザ(sudoが使える)、#
の場合はVPS上のrootとします。
WordPressのデータ移行
現行サーバからデータ取得
$ mysqldump -u admin -p admin_wp > wp_db_backup.sql
⇒ SFTP等で新サーバに転送
新サーバのDBにインポート
$ docker cp /home/admin/wp_db_backup.sql mariadb:/tmp/
Successfully copied 29MB to mariadb:/tmp/
$ docker exec -it mariadb bash
# mysql -u admin -p admin_wp < /tmp/wp_db_backup.sql
Enter password:
元のデータをインポートしたことにより、DB内のhome
やsiteurl
が書き換わってしまうため、一時的にアクセスができなくなります。
最終的にはサブドメインにするのですが、一時的にhttp://IPアドレス
に書き換えておきます。
$ docker exec -it mariadb mysql -u admin -p admin_wp
Enter password:
確認
現行サーバに設定しているドメインmydomain.com
の/wp
というpathに置き換わっています。あと、https://
になっています。
> SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl','home');
+-------------+-------------------------+
| option_name | option_value |
+-------------+-------------------------+
| home | https://mydomain.com/wp |
| siteurl | https://mydomain.com/wp |
+-------------+-------------------------+
2 rows in set (0.001 sec)
更新
http://IPアドレス
に戻します。
> UPDATE wp_options SET option_value='http://xxx.xxx.xxx.xx' WHERE option_name='siteurl';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0
> UPDATE wp_options SET option_value='http://xxx.xxx.xxx.xx' WHERE option_name='home';
Query OK, 1 row affected (0.000 sec)
Rows matched: 1 Changed: 1 Warnings: 0
> SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl','home');
+-------------+-----------------------+
| option_name | option_value |
+-------------+-----------------------+
| home | http://xxx.xxx.xxx.xx |
| siteurl | http://xxx.xxx.xxx.xx |
+-------------+-----------------------+
2 rows in set (0.001 sec)
サブドメイン & HTTPS対応
上記の通り、従来は/wp
というpathでアクセスできるようにしていましたが、せっかく独自ドメインを持っているので、それのサブドメインを使ってみることにします。
つまり、こうです。
Before: https://mydomain.com/wp
▼
After: https://sub.mydomain.com
また、他にもサブドメインで動かしたいWordPressがあったので、複数のWordPressに対応するべく、ちょっとしたpathの変更を行います。
Before: /home/admin/app/wordpress/html
▼
After: /home/admin/app/wordpress/admin_wp
./app/wordpress
配下に複数のWordPressを置くイメージです(本稿ではそこまで扱わないですが。)
サブドメイン対応
nginx
側のvolumes
を/var/www/sub.mydomain.com
に変更します。
/var/www/html
のままだと、複数のWordPressを置きづらいので、わかりやすくするためにhtml
の部分をサブドメインにした感じです。
docker-compose.yml(抜粋)
services:
nginx:
image: nginx:latest
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/log:/var/log/nginx
- ./nginx/html:/var/www/mydomain.com
- ./wordpress/admin_wp:/var/www/sub.mydomain.com
depends_on:
- admin_wp
networks:
- app-network
admin_wp:
image: wordpress:php8.2-fpm
container_name: admin_wp
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: admin
WORDPRESS_DB_PASSWORD: admin9999
WORDPRESS_DB_NAME: admin_wp
volumes:
- ./wordpress/admin_wp:/var/www/html
networks:
- app-network
// 以下略
WP-CLIでPath変換
インポートした記事など、DB内の各種pathを変換します。
WP-CLIのインストール
$ docker exec -it admin_wp bash
# curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6975k 100 6975k 0 0 7948k 0 --:--:-- --:--:-- --:--:-- 7944k
# php wp-cli.phar --info
# chmod +x wp-cli.phar
# mv wp-cli.phar /usr/local/bin/wp
Path変換実行
$ docker exec -it admin_wp wp search-replace 'https://mydomain.com/wp/' 'https://sub.mydomain.com/' --all-tables --allow-root
+---------------------------+-------------------------+--------------+------+
| Table | Column | Replacements | Type |
+---------------------------+-------------------------+--------------+------+
// 略
+---------------------------+-------------------------+--------------+------+
Success: Made 11228 replacements.
home / siteurlの更新
一度、IPアドレスに書き換えたhome
とsiteurl
ですが、これらもサブドメインに変換します。なお、この時点ではhttp
とするのが正解ですが、後続でHTTPS対応をするのでhttps
にしておきます。
> UPDATE wp_options SET option_value='https://sub.mydomain.com' WHERE option_name='siteurl';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0
> UPDATE wp_options SET option_value='https://sub.mydomain.com' WHERE option_name='home';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0
> SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl','home');
+-------------+--------------------------+
| option_name | option_value |
+-------------+--------------------------+
| home | https://sub.mydomain.com |
| siteurl | https://sub.mydomain.com |
+-------------+--------------------------+
2 rows in set (0.000 sec)
HTTPS対応
dnf(EPEL)からcertbotをインストール
$ sudo dnf install -y epel-release
$ sudo dnf install -y certbot python3-certbot-nginx
証明書発行(サブドメイン)
この発行コマンドの時点では、http
、つまり、80番ポートでアクセスできる必要があるようです。
$ sudo certbot certonly --webroot -w /home/admin/app/wordpress/admin_wp -d sub.mydomain.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for sub.mydomain.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/sub.mydomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/sub.mydomain.com/privkey.pem
This certificate expires on 2025-12-05.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
証明書の自動更新設定(list-timers)
有効期限が来るたびに自分で更新作業をするのは忘れてしまうリスクがあまりに高いので、自動更新の設定を入れておくことにします。
自動更新設定
$ sudo systemctl enable --now certbot-renew.timer
確認
$ systemctl list-timers | grep certbot
Fri 2025-09-05 10:59:13 JST 12h - - certbot-renew.timer certbot-renew.service
実行後のログ確認
$ sudo journalctl -u certbot-renew.service
証明書更新時にnginxをリロード
Certbotのフック用ディレクトリにnginx reloadを仕込んでおきます。
(証明書に更新があった時だけ実行されるようです)
$ sudo vi /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
-----
#!/bin/bash
docker exec nginx-proxy nginx -s reload
-----
$ ll /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
-rw-r--r--. 1 root root 52 9月 8 23:32 /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
$ ll /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
-rwxr-xr-x. 1 root root 52 9月 8 23:32 /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
nginx/conf.d/default.conf
生成された証明書をnginx
に設定します。なお、基本的にhttp
でアクセスすることはないので、80番ポートは301 redirect
を設定します。
server {
listen 80;
server_name mydomain.com;
}
server {
listen 80;
server_name sub.mydomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name sub.mydomain.com;
ssl_certificate /etc/letsencrypt/live/sub.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sub.mydomain.com/privkey.pem;
root /var/www/sub.mydomain.com;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass admin_wp:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
}
また、今回の一連の作業で最も詰まったのがこの部分で、nginx-proxy
のドキュメントルートと、admin_wp
のpathが違うので、どのように設定すれば辻褄が合うのか試行錯誤しました。
root /var/www/sub.mydomain.com;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
admin_wp
のほうを/var/www/sub.mydomain.com
に置くプランも試してみましたが、wordpressイメージはデフォルトで/var/www/html
にしかファイルを持ってこない??とかで、手動コピーしないといけなかったり云々...
(間違っていたらすみません)
ちょっとこのあたりはどうするのが良いのか自分の中でも曖昧ですが、上記のように、/var/www/html$fastcgi_script_name
とするのも100%アンチではない気がしています。
(再)起動
$ docker compose up -d
というわけで、これにて「XServer VPSに乗り換えて、Docker上にWordPressを構築する」の三部作完結となります。
慣れていれば作業自体は半日もかからないものだと思いますが、今回はVPSの選定やらDocker環境の構成検討、そして試行錯誤もあったので数日の作業となりました。
本シリーズと同じ作業をされる方はおそらくいないと思いますがw、いつかの自分がまた同様な作業をしたり、「あれ?この辺どういう構成になってたっけ?」と振り返ったりする時に意義が出てくる、そんな気がしています!
シリーズ三部作
最後までご覧いただき、ありがとうございます。ここでひとつ宣伝をさせてください。
規約上、「広告や販売を主目的とする」でなければよさそうなので!
本規約で定めがない場合又は別途当社が承認していない限り、客観的に宣伝広告や販売を主目的とすると判断される記事の投稿をしないこと
楽天モバイル従業員紹介キャンペーン
楽天モバイルでは、楽天従業員による紹介キャンペーンを引き続き実施中です!
今すぐの乗り換えでなくても、下記からログインしておくと一定期間はキャンペーン対象になるので、検討中の方もぜひー。
▼ キャンペーン適用はこちらからログインしてお申し込みください!
https://r10.to/hkJoD3
従業員紹介キャンペーンは、通常の紹介キャンペーンと比べても、下記のように大変魅力的な特典となっております。
-
乗り換え・新規共に、1,000ポイント多くもらえる!
-
再契約や二回線目以降(最大五回線)の契約も特典の付与対象!
-
データタイプやWi-FiルーターのRakuten Turboの契約も特典の付与対象!
※本記事執筆時点のご案内です