2026年7月19日
2026年7月19日
FrankenPHPでWordPressを動かす手順(Docker Composeで構築・HTTPS化)
FrankenPHP は、Web サーバーの Caddy に PHP を組み込んだアプリケーションサーバーです。Apache + mod_php や Nginx + PHP-FPM のように Web サーバーと PHP を別々に用意する必要がなく、1つのプログラムで PHP のサイトを配信できます。Caddy の機能をそのまま使えるため、独自ドメインを設定すると Let's Encrypt などの証明書を自動で取得し、HTTPS で配信します。
この記事では、FrankenPHP の公式 Docker イメージで WordPress を動かす手順を説明します。2026年11月時点の FrankenPHP 1.13.5(PHP 8.3)と WordPress 7.1.4 の組み合わせで、インストール・パーマリンク・REST API・php.ini の反映を確認しています。
FrankenPHPを使う前に知っておくこと
- WordPress は通常のモードで動かす: FrankenPHP にはアプリを常駐させる「ワーカーモード」がありますが、公式ドキュメントの WordPress の手順は、通常の
php_serverで動かす構成です。WordPress 用のワーカーモードの設定は公式には用意されていません。 - .htaccess は読まれない: FrankenPHP(Caddy)は Apache ではないため、
.htaccessの内容は反映されません。パーマリンクはphp_serverがindex.phpに振り分けるので追加の設定は不要ですが、キャッシュ系やセキュリティ系のプラグインが.htaccessに書き込むルールは効きません。同じ制限が必要なら Caddyfile 側で設定します。 - 速くなるかは環境次第: PHP の処理そのものが速くなるわけではありません。OPcache やページキャッシュの有無の影響が大きいので、切り替える前後で自分のサイトの応答時間を測って比べてください。
FrankenPHPの入手方法
公式に用意されている入手方法は次のとおりです。古い記事にある PPA(apt-add-repository)での導入や、frankenphp check・frankenphp optimize といったコマンドは公式には存在しません。
| 方法 | 内容 |
|---|---|
| Docker イメージ | dunglas/frankenphp。PHP 8.2〜8.5、Debian(trixie・bookworm)と Alpine の版がある |
| インストールスクリプト | https://frankenphp.dev/install.sh を実行して、単体の実行ファイルを入手 |
| deb / rpm / apk パッケージ | 公式ドキュメントで案内されている pkg.henderkes.com のリポジトリから frankenphp を入れる。PHP 拡張は php-zts-<拡張名> で追加 |
| Homebrew | brew install dunglas/frankenphp/frankenphp |
この記事では、PHP 拡張の追加と WordPress の配置を Dockerfile にまとめられる Docker イメージを使います。
手順1: Dockerfileを作る
作業用のディレクトリを作り、その中に Dockerfile を置きます。
mkdir ~/wp-frankenphp
cd ~/wp-frankenphp
FROM dunglas/frankenphp:php8.3
# WordPress が使う主な PHP 拡張を追加する
RUN install-php-extensions \
mysqli \
gd \
intl \
zip \
exif \
opcache
# WordPress 本体を /app/public に展開する
RUN rm -rf /app/public/* \
&& curl -fsSL https://wordpress.org/latest.tar.gz \
| tar -xz --strip-components=1 -C /app/public
COPY wordpress.ini /usr/local/etc/php/conf.d/wordpress.ini
install-php-extensionsは公式イメージに入っているコマンドで、PHP 拡張をまとめて追加できます。WordPress の DB 接続にはmysqliが必要です。- 公式イメージの公開ディレクトリは
/app/publicです。 - Docker 版の FrankenPHP は、追加の設定を
/usr/local/etc/php/conf.d/*.iniから読み込みます。
同じディレクトリに wordpress.ini を作ります。
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
手順2: compose.yamlを作る
WordPress(FrankenPHP)と MariaDB の2つのコンテナを定義します。
services:
php:
build: .
restart: unless-stopped
environment:
SERVER_NAME: ":80"
ports:
- "80:80"
volumes:
- wordpress:/app/public
- caddy_data:/data
- caddy_config:/config
depends_on:
- db
db:
image: mariadb:11.4
restart: unless-stopped
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_RANDOM_ROOT_PASSWORD: "1"
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress:
caddy_data:
caddy_config:
db_data:
SERVER_NAMEは Caddy が受け付けるアドレスです。:80にすると、ドメイン名を問わず HTTP の 80 番で受け付けます(まず動作を確かめるための設定です)。/app/publicを名前付きボリュームにしているので、管理画面からの WordPress 本体・テーマ・プラグインの更新や、アップロードした画像はコンテナを作り直しても残ります。/dataと/configは Caddy が証明書や設定を保存する場所です。HTTPS で運用するときに証明書を取り直さずに済むよう、ボリュームにしておきます。
DB のパスワードは .env に書き、compose.yaml には直接書きません。
printf 'DB_PASSWORD=%s\n' "$(openssl rand -hex 16)" > .env
chmod 600 .env
手順3: 起動してWordPressをインストールする
docker compose up -d --build
docker compose ps
ブラウザーで http://サーバーのIPアドレス/ を開くと、WordPress のインストール画面に進みます。データベースの設定には次の値を入れます。
| 項目 | 入力する値 |
|---|---|
| データベース名 | wordpress |
| ユーザー名 | wordpress |
| パスワード | .env の DB_PASSWORD の値 |
| データベースのホスト名 | db(compose.yaml のサービス名) |
| テーブル接頭辞 | wp_(変更してもよい) |
インストール後、管理画面の「設定」→「パーマリンク」で「投稿名」などを選び、記事の URL が開けることを確認します。FrankenPHP の php_server は、存在しないパスへのアクセスを index.php に渡すため、.htaccess が無くてもパーマリンクが動きます。
手順4: 設定が反映されているか確認する
FrankenPHP と PHP のバージョン、読み込まれている拡張は次のコマンドで確認できます。
docker compose exec php frankenphp version
docker compose exec php php -m
php.ini の値が Web からのアクセスにも反映されているかは、管理画面の「ツール」→「サイトヘルス」→「情報」タブの「サーバー」の項目(PHP のメモリ上限、最大アップロードサイズなど)で確認できます。wordpress.ini を変えたときは、イメージを作り直して起動し直します。
docker compose up -d --build
手順5: 独自ドメインでHTTPS化する
サーバーの 80 番と 443 番をインターネットから開け、ドメインの A レコード(または AAAA レコード)をサーバーに向けてから、compose.yaml の php サービスを次のように変えます。
php:
build: .
restart: unless-stopped
environment:
SERVER_NAME: example.com
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- wordpress:/app/public
- caddy_data:/data
- caddy_config:/config
depends_on:
- db
SERVER_NAME にドメイン名を入れると、Caddy が証明書を自動で取得し、HTTP から HTTPS へのリダイレクトも行います。443/udp は HTTP/3 用です。
変更して docker compose up -d を実行したら、WordPress の「設定」→「一般」で「WordPress アドレス(URL)」と「サイトアドレス(URL)」を https://example.com に変えます。最初に IP アドレスでインストールした場合、記事内の画像などの URL は古いままなので、WP-CLI の search-replace などで置き換えます。
運用の注意
- バックアップ: WordPress のファイルは
wordpressボリュームに、DB はdb_dataボリュームにあります。ボリュームごとのバックアップか、mariadb-dumpでの DB の書き出しを定期的に行ってください。 - PHP のバージョンを上げるとき:
FROM dunglas/frankenphp:php8.3の部分を変えてイメージを作り直します。先に検証用の環境でプラグインやテーマが動くか確かめます。 - .htaccess に頼る設定の置き換え:
wp-content/uploadsでの PHP 実行の禁止や、IP アドレスによる管理画面の制限などを.htaccessで行っていた場合は、FrankenPHP では効かないため、Caddyfile で同じ制限を設定するか、前段のファイアウォールや WAF で行います。 - リソース: PHP のスレッド数は Caddyfile の
frankenphpブロックのnum_threads・max_threadsで調整できます。メモリに余裕が無いサーバーでは、memory_limit× 同時に動くスレッド数が搭載メモリを超えないようにします。
まとめ
- FrankenPHP は Caddy に PHP を組み込んだサーバーで、Web サーバーと PHP-FPM を別々に用意せずに WordPress を動かせる
- 公式 Docker イメージに
install-php-extensionsでmysqliなどを追加し、WordPress を/app/publicに置く - php.ini の追加設定は Docker 版では
/usr/local/etc/php/conf.d/に置く SERVER_NAMEにドメイン名を入れると HTTPS 証明書が自動で取得される.htaccessは読まれないため、プラグインやサーバー設定で.htaccessに頼っている部分は別の方法に置き換える
関連記事: