勉強したことのメモ

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

Podmanで導入したApacheのチューニング(mpm_prefork)に関する設定方法

  Apache サーバー

Podmanで導入したApacheのチューニング(mpm_prefork)を行いたい。特にApache / PHPのコンテナに対してメモリを512MBしか割り当てておらず、デフォルト設定だと少しのアクセスでもメモリが枯渇しコンテナが強制終了しそうなため、その辺りのチューニング方法をメモ。

 

環境について

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)

 

事前準備

設定ファイルの作成(mpm_prefork.conf)

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

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

<IfModule mpm_prefork_module>
    # 起動時に生成される子プロセス数
    StartServers             2
    # アイドル状態の子プロセスの最小数
    MinSpareServers          2
    # アイドル状態の子プロセスの最大数
    MaxSpareServers          4
    # 最大同時リクエスト数
    MaxRequestWorkers        4
    #子プロセスが稼働中に扱うリクエスト数の上限
    MaxConnectionsPerChild 300
</IfModule>

 

対応方法

先日メモしたPHPの設定方法と同じくホスト側の設定ファイルをマウントする方法とコンテナ側に設定ファイルをコピーする方法があり、以下違いがある。

対応方法の違い

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

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

コンテナ作成時のボリューム設定にて以下も追加で設定する。もちろん、custom-php.iniも追加で設定して良い。

  • ホストパス -> /Dockerfileの設置ディレクトリ/mpm_prefork.conf
  • コンテナパス -> /etc/apache2/mods-available/mpm_prefork.conf
  • モード -> 書き込み可能のチェックを外す

コンテナを起動すると設定が反映される。

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

podman run -d \
  --name apache-php8.4-plus-1.4 \
  -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 \
  -v /Dockerfileの設置ディレクトリ/mpm_prefork.conf:/etc/apache2/mods-available/mpm_prefork.conf:ro,Z \
  apache-php8.4-plus-1.4

後からmpm_prefork.confを変更したい場合

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

podman restart apache-php8.4-plus-1.4

以上で設定完了。尚、設定が正常に反映されているかは後述の補足にメモする。

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

Dockerfileに以下を追記する。

COPY mpm_prefork.conf /etc/apache2/mods-available/mpm_prefork.conf

全文は以下の通り。

# 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

# mpm_prefork.confをコピーして配置
COPY mpm_prefork.conf /etc/apache2/mods-available/mpm_prefork.conf

# 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.4 .

コンテナの作成

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

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

podman run -d \
  --name apache-php8.4-plus-1.4 \
  -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.4

以上で設定完了。

補足

設定確認

以下コマンドで確認できる。

# mpm_prefork.confファイル内容の確認
podman exec apache-php8.4-plus-1.4 cat /etc/apache2/mods-available/mpm_prefork.conf

# mpm_preforkモジュールの設定が正しく反映されているか確認
podman exec apache-php8.4-plus-1.4 apache2ctl -M | grep mpm

# 以下が表示されていればOK
mpm_prefork_module (shared)

# 実行中プロセス数の確認(rootプロセスが1個、子プロセスが4個以下ならOK)
podman exec apache-php8.4-plus-1.4 ps aux | grep apache2

 - Apache サーバー

  関連記事

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

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

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

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

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

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

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

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

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

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