1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

XServer VPSに乗り換えて、Docker上にWordPressを構築する|データ移行・サブドメイン対応編

Last updated at Posted at 2025-09-28

前回の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内のhomesiteurlが書き換わってしまうため、一時的にアクセスができなくなります。

最終的にはサブドメインにするのですが、一時的に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アドレスに書き換えたhomesiteurlですが、これらもサブドメインに変換します。なお、この時点では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、いつかの自分がまた同様な作業をしたり、「あれ?この辺どういう構成になってたっけ?」と振り返ったりする時に意義が出てくる、そんな気がしています!

シリーズ三部作


最後までご覧いただき、ありがとうございます。ここでひとつ宣伝をさせてください。

規約上、「広告や販売を主目的とする」でなければよさそうなので!

本規約で定めがない場合又は別途当社が承認していない限り、客観的に宣伝広告や販売を主目的とすると判断される記事の投稿をしないこと

楽天モバイル従業員紹介キャンペーン

楽天モバイルでは、楽天従業員による紹介キャンペーンを引き続き実施中です!

今すぐの乗り換えでなくても、下記からログインしておくと一定期間はキャンペーン対象になるので、検討中の方もぜひー。

JP_1200x675.png

▼ キャンペーン適用はこちらからログインしてお申し込みください!
https://r10.to/hkJoD3

従業員紹介キャンペーンは、通常の紹介キャンペーンと比べても、下記のように大変魅力的な特典となっております。

  • 乗り換え・新規共に、1,000ポイント多くもらえる!

  • 再契約や二回線目以降(最大五回線)の契約も特典の付与対象!

  • データタイプやWi-FiルーターのRakuten Turboの契約も特典の付与対象!

※本記事執筆時点のご案内です

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?