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 に頼っている部分は別の方法に置き換える

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲