勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

Podmanのapache-php8.4同梱版コンテナのPHPをアップデートする方法

  PHP サーバー Podman

PHPの現行バージョンにて致命な脆弱性が見つかったとのニュースを聞いた。かなり重大なようで昨日の21時ごろからメンテナンスに入るサイトもいくつか見かけた。当サイトの環境がPodmanのapache-php8.4同梱版を使用しているので、この環境でのアップデート方法をメモ。

 

対応方法

(必要に応じて)スナップショットの生成

スナップショット対応のVPS・サーバの場合は念のため取っておくといいかも。

ちなみに本サイトはKAGOYA VPSでストレージを15GB使用している環境でスナップショットを生成するのに1時間弱かかった。

ビルド用のDockerfile

過去に作成した以下内容のDokerfileをそのまま使用する。

# Docker公式PHP8.4&Apache同梱版イメージを指定
FROM docker.io/library/php:8.4-apache

# PHP拡張機能インストーラーをダウンロードして配置
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# 実行権限を与え、必要なモジュールを一括インストール
RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions \
    apcu \
    bcmath \
    curl \
    dom \
    exif \
    gd \
    gmp \
    imagick \
    intl \
    mbstring \
    memcache \
    memcached \
    mysqli \
    opcache \
    pcntl \
    pdo_mysql \
    redis \
    simplexml \
    sockets \
    sysvsem \
    xml \
    xmlwriter \
    zip \
    zlib

# composerのコピー
COPY --from=docker.io/library/composer:latest /usr/bin/composer /usr/bin/composer

# apache-php8.4はDebian系のためdnfではなくapt-getで必要なコマンドを導入
RUN apt-get update && apt-get install -y git zip unzip

# Apacheのrewriteモジュールとremoteipモジュールを有効化
RUN a2enmod rewrite remoteip

再ビルドとコンテナ再生成

# Dockerfileがあるディレクトリに移動
cd /opt/podman/php

# キャッシュを無視して最新版をビルド
podman build --no-cache -t web-server:latest .

# docker-compose.ymlがあるディレクトリに移動
cd /opt/podman

# コンテナの削除、作成と起動
podman-compose down
podman-compose up -d

# (必要に応じて)古い不要なイメージの削除
podman image prune -f

動作確認

phpinfoを見ると以下の通り脆弱性修正後のバージョンにアップデートされている点が確認できた。

  • 対応前 -> 8.4.25
  • 対応後 -> 8.4.27

(必要に応じて)スナップショットの削除

アップデート後、各種動作確認を行って問題が無いようならスナップショットを削除する。

 

その他

アップデート対応が難しい場合

時間が取れない等でアップデート対応が難しいような場合は、暫定対応としてphp.iniで以下を設定する。

session.upload_progress.enabled = 0

 

所感

VPSの移行やOSバージョンアップ以外でPHPのアップデートを行ったことがなかったため、面倒くさい作業になるかと思いきやコンテナ環境のおかげか簡単に対応できて助かった。

今回はDockerfileは同じものを使用したが、8.4系から8.5系にアップデートする場合でも「docker.io/library/php:8.4-apache」を「docker.io/library/php:8.5-apache」に変えてビルドするだけだろうからすごく楽。この辺りもコンテナ環境の恩恵なのかも。

 - PHP サーバー Podman

  関連記事

docker-compose.ymlでまとめてコンテナ作成・起動・ネットワーク接続する方法
docker-compose.ymlでまとめてコンテナ作成・起動・ネットワーク接続する方法

Podmanでコンテナを作成してネットワーク接続する際、Cockpit上やCUI ...

Podmanコンテナ環境にWordPressを導入の上、パーミッション等の各種設定を行う方法
Podmanコンテナ環境にWordPressを導入の上、パーミッション等の各種設定を行う方法

Podmanコンテナ環境にWordPressを導入したい。何も考えずにWP関連の ...

コンテナ側のApacheのアクセスログにリバースプロキシのIPではなく本来のアクセスIPを出力する方法
コンテナ側のApacheのアクセスログにリバースプロキシのIPではなく本来のアクセスIPを出力する方法

ホスト側Nginxからリバースプロキシ経由でApacheコンテナに接続する環境に ...

PodmanでMailpit用コンテナを作成しPHPからテストメールを送受信する方法
PodmanでMailpit用コンテナを作成しPHPからテストメールを送受信する方法

開発中などでPHPからテストメールを送信したい。以前メモしたmailtrapを使 ...

Podmanで導入したPHPの設定ファイル(php.ini)変更と高速化に関する設定方法
Podmanで導入したPHPの設定ファイル(php.ini)変更と高速化に関する設定方法

Podmanで導入したPHPの設定ファイル(php.ini)の内容を変更したい。 ...