Bitnami WordPress AMI の PHP を同じ系列の修正版に差し替えてみた

Bitnami WordPress AMI の PHP を同じ系列の修正版に差し替えてみた

Bitnami WordPress AMIのPHPを修正版へアップグレードする方法をご紹介します。パッケージ管理外で動作しているPHPの脆弱性対応に、ソースからのビルドと差し替えで対応した手順をまとめました。
2026.10.23

はじめに

かつまたです。

以前、「Bitnami WordPress AMI は PHP などの同梱コンポーネントをアップグレードできない」という記事を書きました。PHP 7.4 から 8.x のようなメジャー版の切り替えは、サーバーを作り直すしかないという内容です。

その後、PHP 本体に重大な脆弱性が見つかり、修正版(8.2.35 / 8.4.27)が公開されました。Bitnami の AMI で動いている WordPress サーバーに、この修正版を当てる必要がありました。メジャー版は変えず、同じ系列の中で修正版に上げるだけであれば、PHP を自分でビルドして差し替えられたので、その手順をまとめます。

事象

Bitnami の WordPress AMI で作った EC2 では、PHP が /opt/bitnami/php に同梱されています。

$ which php
/opt/bitnami/php/bin/php

$ php -v
PHP 8.2.x (cli)

$ dpkg -l | grep -c php
0

この PHP は apt でインストールされたものではないため、apt upgrade の対象になりません。また、Bitnami は AWS Marketplace での提供を終了しているため、修正版を同梱した新しい AMI も公開されません。

原因

Bitnami の AMI は、PHP などを OS のパッケージ管理の外(/opt/bitnami 配下)に配置しています。

一方、PHP の修正版(同じ系列のパッチリリース)は、拡張機能のインターフェース(PHP API バージョン)や設定の書式を変えません。そのため、今の PHP と同じ設定でビルドした修正版であれば、php.ini や PHP-FPM の設定、WordPress 側には手を入れずに、実行ファイルだけを差し替えられます。

対応内容

1. 今の PHP の configure オプションを取り出す

PHP はビルド時に ./configure へ渡したオプション(組み込む拡張機能・配置先・設定ファイルの場所など)を覚えていて、php -i の Configure Command で確認できます。

$ /opt/bitnami/php/bin/php -i | grep -m1 'Configure Command'
Configure Command =>  './configure'  '--prefix=/opt/bitnami/php' '--with-zlib-dir' '--with-zlib' '--with-libxml-dir=/usr' '--enable-soap' '--disable-rpath' '--enable-inline-optimization' '--with-bz2' '--enable-sockets' '--enable-pcntl' '--enable-exif' '--enable-bcmath' '--with-pdo-mysql=mysqlnd' ...

この行から先頭の ./configure を除いた部分を、修正版のソースの ./configure にそのまま渡します。

2. 修正版をビルドする

ビルドは本番以外のサーバーで、OS の版と PHP の系列の組み合わせ(Debian 11 / 12 × 8.2 / 8.4)ごとに行いました。

V=8.4.27
W=/root/phpbuild; mkdir -p $W && cd $W

# ビルドに必要な開発用パッケージ(Bitnami の configure に合わせて追加)
apt-get install -y --no-install-recommends build-essential pkg-config \
  libxml2-dev libssl-dev libcurl4-openssl-dev libonig-dev libsqlite3-dev \
  libzip-dev libicu-dev libsodium-dev libpng-dev libjpeg62-turbo-dev \
  libwebp-dev libfreetype-dev libxslt1-dev libbz2-dev libgmp-dev \
  libldap2-dev libtidy-dev libreadline-dev libpq-dev freetds-dev zlib1g-dev

# ソースを取得し、php.net が公開している SHA-256 と照合する
curl -fsSLO https://www.php.net/distributions/php-$V.tar.gz
WANT=$(curl -fsSL "https://www.php.net/releases/index.php?json&version=$V" \
  | /opt/bitnami/php/bin/php -r '$j=json_decode(stream_get_contents(STDIN),true); foreach($j["source"] as $s){ if(str_ends_with($s["filename"],".tar.gz")) echo $s["sha256"]; }')
echo "$WANT  php-$V.tar.gz" | sha256sum -c -   # 「OK」でなければ中止する

tar xzf php-$V.tar.gz && cd php-$V

# 今の PHP と同じ configure オプションでビルドする
CONF=$(/opt/bitnami/php/bin/php -i | grep -m1 'Configure Command' | sed "s/^[^=]*=> *//; s#'[^']*/configure'##")
echo "$CONF"
eval ./configure $CONF
make -j2

# 稼働中の /opt/bitnami/php には触れず、作業用の場所へインストールする
make install INSTALL_ROOT=/root/phpstage

ビルドしたものは /root/phpstage/opt/bitnami/php の下に出力されます。

3. ほかのサーバーへ配る

ビルドしたもの(bin・sbin・lib・include)を tar にまとめ、同じ組み合わせのサーバーへ配って /root/phpstage に展開しました。受け取った側では、足りないライブラリがないかを ldd で確認しています。

ldd /root/phpstage/opt/bitnami/php/sbin/php-fpm | grep 'not found'

4. 差し替える

差し替えは次の順で行いました。

  1. 今の /opt/bitnami/php を丸ごと /opt/bitnami/php.bak-<旧版> に退避する
  2. PHP-FPM を止め、プロセスが終わるのを待つ
  3. bin・sbin・lib・include だけを新しいものに置き換える(設定の etc はそのまま)
  4. PHP-FPM を起動する
OLD_V=$(/opt/bitnami/php/bin/php -r 'echo PHP_VERSION;')
# 差し替え後に比べるため、今の拡張機能の一覧を保存しておく
/opt/bitnami/php/sbin/php-fpm -m | sort > /root/phpbuild/fpm_mods_before.txt
cp -a /opt/bitnami/php /opt/bitnami/php.bak-$OLD_V

/opt/bitnami/ctlscript.sh stop php-fpm
# プロセスが残っていると "Text file busy" で置き換えに失敗するため、終了を待つ
for i in $(seq 1 30); do pgrep -f 'php-fpm: (master|pool)' >/dev/null || break; sleep 1; done

for d in bin sbin lib include; do
  cp -a --remove-destination /root/phpstage/opt/bitnami/php/$d/. /opt/bitnami/php/$d/
done

/opt/bitnami/php/sbin/php-fpm -t
/opt/bitnami/ctlscript.sh start php-fpm

PHP-FPM を止めてから起動するまでの十数秒〜30 秒ほど、サイトは応答しません。

5. 差し替え後の確認

起動後に次を確認し、どれかに問題があれば退避した旧版に書き戻すようにしました。

# 版が上がっていること
/opt/bitnami/php/bin/php -v

# 拡張機能の一覧が差し替え前と同じこと
/opt/bitnami/php/sbin/php-fpm -m | sort | diff /root/phpbuild/fpm_mods_before.txt -

# NGINX 経由で WordPress が応答すること
curl -sk -o /dev/null -w '%{http_code}\n' https://127.0.0.1/

版は 8.2.35 / 8.4.27 に上がり、拡張機能の一覧は差し替え前後で差がありませんでした。WordPress 本体・プラグイン・テーマには手を入れずに、差し替え後も WordPress は応答しました。

なお、Configure Command に含まれない拡張機能(Bitnami が phpize で別に追加したもの)は再ビルドしていません。cp は既存のファイルを消さないため、これらは差し替え前の .so がそのまま読み込まれています。

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事