
Bitnami WordPress AMI の PHP を同じ系列の修正版に差し替えてみた
はじめに
かつまたです。
以前、「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. 差し替える
差し替えは次の順で行いました。
- 今の
/opt/bitnami/phpを丸ごと/opt/bitnami/php.bak-<旧版>に退避する - PHP-FPM を止め、プロセスが終わるのを待つ
bin・sbin・lib・includeだけを新しいものに置き換える(設定のetcはそのまま)- 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月 アノテーション㈱から社名変更しました







