WordPress を Docker で構築、既存のデータを移設したのでまとめてみた。
Contents
概要
既存の WordPress稼働マシンが故障したため、
新環境に別途 WordPress を立てて、既存のデータを移すことになった。
前環境は Ubuntu Server 18.04 上に、Apache + MariaDB でシステムに直接構築していた。
今回はせっかくなので、ちょっと色々詰め込んでやってみようということで、
ホストマシン Ryzen 7 3700X + Ubuntu Server 20.04 上に、
構成 Nginx + MariaDB を (rootless-) Docker で構築する。
という訳で、今回を含めてここ数回の記事は以下の一連の流れとなっている。
- Ubuntu Server 20.04 LTS のセットアップ
- Rootless Docker の導入
- WordPress を Docker で構築、移設する ←イマココ
WordPress のセットアップ
Docker コンテナの設定
WordPress + Nginx + MariaDB の構成で、docker-compose を使って駆動します。
まずは docker-compose.yml を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
version: '3' services: nginx: image: nginx:stable container_name: wordpress-nginx ports: - '80:80' volumes: - ./nginx:/etc/nginx/conf.d - ./logs/nginx:/var/log/nginx - ./wordpress:/var/www/html restart: always environment: TZ: Asia/Tokyo depends_on: - wordpress mysql: image: mariadb:latest container_name: wordpress-mariadb ports: - '3306' volumes: - ./db-data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABSE} TZ: Asia/Tokyo wordpress: image: wordpress:fpm container_name: wordpress expose: - '9000' volumes: - ./wordpress:/var/www/html restart: always environment: WORDPRESS_DB_HOST: wordpress-mariadb WORDPRESS_DB_USER: ${WORDPRESS_DB_USER} WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD} WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME} TZ: Asia/Tokyo depends_on: - mysql links: - mysql |
MariaDB と WordPress の DB に関する初期設定: ${MYSQL_XXX}, ${WORDPRESS_XXX} を適当に設定します。
WORDPRESS_DB_HOST については MariaDB のコンテナ名を指定します。
私の実環境では、後述する既存 WordPress からのデータ移行のために、
wordpress は php7.2-fpm を指定しました。
次に WordPress 用の Nginx の設定をします。
docker-compose.yml のある階層を基準にして、nginx/wordpress.conf を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
server { listen 80; server_name _; root /var/www/html; index index.php; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; #client_max_body_size 128M; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass wordpress:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } |
fastcgi_pass の項は docker-compose.yml で指定した wordpress のコンテナ名、expose したポート番号を指定します。
ここが対応していないと、正しく動かないので注意が必要です。
以上の設定ができたら、
上記の docker-compose.yml があるディレクトリで以下を実行します。
1 |
$ docker-compose up [-d] |
'-d' を付けるとデタッチモード、つまりバックグラウンドで動作します。
最初は付けずに開始したほうが、上手く行ったのか否かがわかりやすいかもしれません。
出力されるログが正常そうだったら、アクセスしてみます。
この状態でアクセスを行い、以下のWordPressの初期設定画面に飛ばされればひとまず成功です。
アップロードファイルサイズ上限の拡張
さて、この設定で WordPress の稼働を始めると恐らくすぐに躓きます。
それは取り扱えるファイルサイズの上限です。
下記で触れる既存データの移行や、画像などメディアのアップロードなどを行おうとすると、
ファイルサイズの上限に引っかかり進まなくなります。
私の環境では 2MB にリミットがかかっていました。
この制限は2箇所から掛かっており、それぞれ設定を緩める必要があります。
- PHP が扱うファイル、メモリサイズなど
- Nginx が扱うファイルサイズ
前者は WordPress 上で直接的に 何MBまでと表示され警告される数字に対応します。
こちらを修正・拡張すると、一見通ったように見えるのですが、処理が上手く行きません。
これは後者の制限に掛かっており、Nginx のログなどを見ると 413エラーが出ています。
PHP が扱うファイルサイズ上限の拡張
wordpress の PHP の設定は /usr/local/etc/php/conf.d/ 以下に置かれます。
そこで以下のような内容のファイルを用意します。
1 2 3 |
upload_max_filesize = 128M post_max_size = 128M memory_limit = 256M |
このファイルを docker-compose.yml の階層基準で wordpress/uploads.ini などとして保存し、
上記の docker-compose.yml 内の wordpress下 volumes の項に以下のように設定します。
1 2 3 |
volumes: ... - ./wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini |
この設定が正しく反映されていれば、
WordPress上でメディア等をアップロードする際に表示されるファイルサイズの上限が拡張されているはずです。
前述の通り、この状態で大きなファイルをアップロードしようとすると、
一見通ったように見えるのですが、処理が上手く行きません。
これを直すために、次の手順に進みます。
Nginx が扱うファイルサイズ
同様に上記の docker-compose.yml の場合、wordpress 用の nginx の設定は、
docker-compose.yml と階層の nginx ディレクトリ以下におきます。
私は nginx/wordpress.conf としてあります。
このファイルに以下を追加します。
# この設定は冒頭のインストールの項の nginx/wordpress.conf にも記述、コメントアウトしてあります。
1 |
client_max_body_size 128M; |
これら2つの設定を変更するうことで、WordPress上で扱えるファイルサイズが、
デフォルトの 2MB から例えば 128MB に拡張されます。
Rootless Docker への特権ポートの開放
今回私は rootlessモードの Docker を使っているので、
そのままでは、1024未満の特権ポートとバインドすることができません。
なので、rootless docker のオフィシャルに記述があるように、
以下のようにしておきます。
1 |
$ sudo setcap cap_net_bind_service=ep somewhere/to/rootlesskit |
rootlesskit は docker などと同じ場所にあります。
デフォルトのインストール path は ~/bin です。
既存データの移設
既にあった WordPress のデータを、新設した WordPress にコピーします。
私は "All-in-One WP Migration" プラグインを使いました。
このプラグインを用いると、記事データだけでなくプラグインやテーマも含めて丸ごと移動できます。
まず、始めに既存(移動元)の WordPress にこのプラグインをインストールし、
既存データ+環境をエクスポートします。
次に新設(移動先) の WordPress にもこのプラグインをインストールします。
そして先程エクスポートしたデータをインポートする訳ですが、いくつか注意点があります。
- なるべく既存環境と WordPress の環境を揃える。
私の場合、既存環境は PHP7.2 で構成されていたのですが、
上記の docker-compose.yml 内で、image を単に fpm を指定すると、PHP7.4版が構成されました。
この状態でインポートしようとすると失敗しました。
そこで wordpress:php7.2-fpm を指定すると、無事にデータのインポートができました。 - WordPress データはそれなりのファイルサイズになります。
上記で説明しましたが、デフォルトの設定では 2MB 以上のファイルをインポートできません。
自分で WordPress を構築した場合は、先に最大ファイルサイズの拡張を行っておきます。 - 最終的にデータをインポートする際は、公開するホスト名でアクセスして行ってください。
インポート時にメニューや別記事へのリンクなどを読み替えてくれる機能があるようで、
この際の読み替え先は、インポート時にアクセスしているURLを参照しているようです。
公開前のテスト環境など、例えばローカルIPでアクセスしている状態でインポートを行うと、
移設完了後にいざアクセスすると、一部のリンク先がおかしなことになっています。
サブディレクトリでの公開
今回一番苦労したのはこの作業でした。
上記の docker-compose.yml の設定では、wordpress はルート直下に公開されます。
これを https://hep.techwp.net/ のような形で、サブディレクトに公開するための設定を行います。
webで相当数ググって、紹介されている設定を数多く試してみましたが、
nginx/wordpress のバージョン, 或いは他の各種設定が異なるのかどれも上手く動きませんでした。
そんな中ようやく コチラ に紹介されていた設定を参考にして、それっぽく動くようになりました。
まず、docker-compose.yml。
wordpress 関連のファイルを ルートディレクトリ下のサブディレクトリ: wordprerss に展開します。
1 2 3 4 |
wordpress: ... volumes: - wordpress/wordpress:/var/www/html |
次は Nginx の設定:nginx/wordpress.conf。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
server { listen 80; server_name _; root /var/www/html; index index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.html; } location /wordpress { index index.php; client_max_body_size 128M; if (!-e $request_filename) { rewrite ^(.*)$ /wordpress/index.php?q=$1 last; } location ~ ^/wordpress/.+\.php$ { fastcgi_split_path_info ^/wordpress(.+\.php)(.*)$; fastcgi_pass wordpress:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } } |
上記の設定でも初回アクセスすると、ルート直下の wp-admin に転送され、
500: 'Internal Server Error' が返ってきますが、
手動で FQDN と wp-admin の間に指定したサブディレクトリを追加してアクセスし直せば大丈夫です。
(例:[HOSTNAME]/wordpress/wp-admin/... など)
このように手動でサブディレクトリを指定してのアクセスはこの初回のみで、
それ以降は発生していないので、日常用途で困ることはないと思います。
ディレクトリ, ファイル構成
ここまで全ての設定を行うと、docker-compose.yml を含むディレクトリ以下の構成は次のようになります。
1 2 3 4 5 6 7 |
db-data/ logs/ nginx/ wordpress.conf wordpress/ uploads.ini docker-compose.yml |