勉強したことのメモ

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

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

  PHP

Podmanで導入したPHPの設定ファイル(php.ini)の内容を変更したい。またOPcacheやAPCu等、キャッシュ設定を行い高速化を図りたい。調べたところコンテナ作成時にホスト側の設定ファイルをマウントする方法とコンテナ側に設定ファイルをコピーする方法があるみたい。以下に2パターンの対応方法をメモ。

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側 AlmaLinux / Apache

詳細なバージョンは以下の通り。

# AlmaLinuxのバージョン確認
cat /etc/redhat-release

# 実行結果
AlmaLinux release 8.10 (Cerulean Leopard)

# Apacheのバージョン確認
httpd -v

# 実行結果
Server version: Apache/2.4.37 (AlmaLinux)

 

事前準備

カスタム用設定ファイルの作成(custom-php.ini)

以下カスタム用設定ファイルをDockerfileと同じディレクトリにアップロードしておく。

尚、設定内容は適宜変更すること。

; タイムゾーン設定
date.timezone = "Asia/Tokyo"

; ファイルアップロード上限
upload_max_filesize = 32M
post_max_size = 64M

; メモリ上限
memory_limit = 128M


; opcache設定
[opcache]

; ophacheを有効化
opcache.enable = 1

; CLIやバックグランド処理時でも有効化
opcache.enable_cli = 1

; キャッシュ保存用のメモリ
opcache.memory_consumption = 32

; 文字列の格納に使用するメモリサイズ
opcache.interned_strings_buffer = 8

; キャッシュ可能なファイル最大数
opcache.max_accelerated_files = 4000

; ファイル更新時に自動でチェック
opcache.validate_timestamps = 1

; ファイル更新チェックの2秒間隔に設定
opcache.revalidate_freq = 2


; apcu設定
[apcu]

; apcuを有効化
apc.enabled = 1

; CLIやバックグランド処理時でも有効化
apc.enable_cli = 1

; メモリ割り当て
apc.shm_size = 32M

Sublime Textでiniファイルを編集する場合

デフォルトだとiniファイルのシンタックスハイライトは無い筈。

「Ctrl + Shift + P」→「Install Package」を入力して選択の上、エンターキー押下→「INI」を入力して検索の上、選択する。

iniファイルを開きなおすとシンタックスハイライトが有効化されている筈。

 

対応方法

対応方法の違い

ホスト側の設定ファイルをマウントする方法とコンテナ側に設定ファイルをコピーする方法があり、以下違いがある。

  • ホスト側の設定ファイルをマウントする方法 -> コンテナ作成時にホスト側の設定ファイルをマウントするように設定する。設定ファイルを変更後、コンテナを再起動すれば変更内容が反映される(コンテナ再生成は不要)。
  • コンテナ側に設定ファイルをコピーする方法 -> Dockerfileに「ビルド時に設定ファイルをコンテナ側にコピー(配置)する」といった内容を追記し、それをビルド→コンテナを作成する形。コンテナ作成時、コンテナ側に設定ファイルをコピー(設置)するため、設定内容を変更するにはコンテナ再生成の必要がある。

ホスト側の設定ファイルをマウントする方法

コンテナ作成時のボリューム設定にて以下も追加で設定する。

  • ホストパス -> /Dockerfileの設置ディレクトリ/custom-php.ini
  • コンテナパス -> /usr/local/etc/php/conf.d/custom-php.ini
  • モード -> 書き込み可能のチェックを外す

その他は過去記事の通りコンテナを作成し、起動後にphpinfoを確認すると設定内容が反映されている筈。

また、Cockpitでのコンテナ作成ではなく、サーバにSSH接続しCLIで作成する場合は以下コマンドになる。

podman run -d \
  --name apache-php8.4-plus-1.3 \
  -m 512m \
  -p 127.0.0.1:8080:80 \
  -v /var/www/html/podman_test_1:/var/www/html:Z \
  -v /Dockerfileの設置ディレクトリ/custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini:ro,Z \
  apache-php8.4-plus-1.3

後からcustom-php.iniを変更したい場合

ホスト側のcustom-php.iniを編集後、Cockpit上からコンテナを再起動するか、SSH接続後以下コマンドで再起動すれば変更内容が反映される。

podman restart apache-php8.4-plus-1.3

コンテナ側に設定ファイルをコピーする方法

Dockerfileに以下を追記する。

COPY custom-php.ini /usr/local/etc/php/conf.d/custom-php.ini

全文は以下の通り。

# 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 \
    exif \
    gd \
    imagick \
    intl \
    memcache \
    memcached \
    mysqli \
    pdo_mysql \
    opcache \
    redis \
    zip \
    sockets \
    sysvsem

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

# php.iniをコピーして配置
COPY custom-php.ini /usr/local/etc/php/conf.d/custom-php.ini

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

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

イメージのビルド

サーバにSSH接続し以下コマンドでイメージをビルドする。

# Dockerfileを設置したディレクトリに移動
cd /path/to

# イメージをビルド
podman build -t apache-php8.4-plus-1.3 .

コンテナの作成

通常通り過去記事の通りコンテナを作成する。ホスト側の設定ファイルをマウントする方法とは異なり、追加のボリューム設定は不要。

また、Cockpitでのコンテナ作成ではなく、サーバにSSH接続しCLIで作成する場合は以下コマンドになる。

podman run -d \
  --name apache-php8.4-plus-1.3 \
  -m 512m \
  -p 127.0.0.1:8080:80 \
  -v /var/www/html/podman_test_1:/var/www/html:Z \
  apache-php8.4-plus-1.3

起動後にphpinfoを確認すると設定内容が反映されている筈。

補足

php.iniの読み込みについて

phpinfoのConfigure Commandに以下一文がある筈。

--with-config-file-scan-dir=/usr/local/etc/php/conf.d

公式リファレンスによるとスキャンディレクトリに関する項目で、通常のphp.iniが読み込まれた後にスキャンディレクトリ内にある設定ファイルが読み込まれるというもの。

そのため今回設置する「/usr/local/etc/php/conf.d/custom-php.ini」が後から読み込まれて各種設定が変更される。尚、custom-php.iniで設定しなかった項目はデフォルトの設定になる。

 - PHP

  関連記事

CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法

Cockpitにはcockpit-podmanというPodman(Dockerの ...

PodmanにComposerを導入し、パッケージをインストールする方法
PodmanにComposerを導入し、パッケージをインストールする方法

先日Podmanで導入したapache-phpに各種PHPモジュールを追加したが ...

Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法

先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...

Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法
Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法

先日Podmanで作成したApache用コンテナに対してドメインを割り当てたが、 ...

Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法

先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...