👻

PHP-FPM 設定ファイル `www.conf` の解説(Docker + Nginx連携用)

に公開

このファイルは、PHP-FPM(FastCGI Process Manager)の設定ファイルです。
backend-php/etc/www.conf に配置されており、Docker Compose で PHP-FPM コンテナ内の /etc/php/8.1/fpm/pool.d/www.conf にマウントされています。

主に Nginx と PHP-FPM の連携と、PHPプロセスの制御(パフォーマンス) に関わる重要な設定を含みます。

設定内容

[www]
listen = 9000

user = www-data
group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

理解に必要な前提知識

下の内容を押さえておくと、www.conf の設定がより理解しやすくなります。

  • PHP-FPMとは何か
    → FastCGI方式でPHPを実行するサーバプロセスで、Webサーバ(Nginxなど)と連携して動作します。
    → PHP-FPMはFastCGIプロトコルに従って、外部からのリクエストを常駐プロセスで処理します。

    補足:FastCGI方式とは?
    従来のCGI方式では、リクエストのたびにPHPプロセスを起動・終了するため非常に遅くなります。
    一方でFastCGI方式では、PHP-FPMのような常駐プロセスがあらかじめ待機しており、リクエストを受け取るたびに高速に処理できます。
    Webサーバ(例:Nginx)は、FastCGIという通信プロトコルを使って、PHP-FPMに処理を依頼します(例:ポート9000で通信)。

  • NginxとPHP-FPMの連携方法
    → NginxからのPHPリクエストをFastCGIプロトコルでPHP-FPMへ中継する構成です(fastcgi_pass を使用)。
  • Dockerのボリュームマウントの基本
    backend-php/etc/www.conf をコンテナ内の /etc/php/8.1/fpm/pool.d/www.conf にマウントすることで、PHP-FPMの設定をDocker上で反映させています。

各項目の意味と役割

下は、PHP-FPM の設定ファイルに記述されている各項目の意味です。

[www]

  • PHP-FPM のプール名(プロセスグループのようなもの)
  • 通常は www で問題ない

    補足:プール名とは?
    プール名とは、PHP-FPMにおける「設定グループ」の名前のことです。
    PHP-FPMでは設定グループを「プール」という単位でまとめ、名前をつけて管理できます。
    [www] のように設定ファイルの先頭に書かれたラベルがそのプール名にあたります。

    たとえば、通常のWebページ用には [www]、管理画面用には [admin] というように、異なる設定で複数のプールを使い分けることができます。
    各プールは、使用するポート番号やユーザー、プロセス数などを別々に設定できます。

    単一のWebアプリケーションを動かす場合には、デフォルトの [www] をそのまま使えば十分です。
    このプール名は、PHP-FPM内部でプロセス設定を識別するために使われ、NginxやDocker側でこの名前を直接参照することは基本的にありません。

listen = 9000

  • PHP-FPM がリクエストを受け付けるポート
  • Nginx の fastcgi_pass backend-php:9000; とペアで使われる
  • Dockerコンテナ間でPHPリクエストを受け取るために必須

user = www-data

  • PHP-FPM プロセスを実行するユーザー
  • セキュリティやファイル権限の管理で使用される
  • 通常は www-data(Nginx と同じユーザー)でOK

    補足:Nginxと同じユーザーとは?
    多くのLinux環境では、Nginxも www-data というユーザーで動作するため、PHP-FPMも同じユーザーにしておくことでファイルアクセスの整合性が取れます。
    ただし、docker-compose.yml で下のような構成にしている場合:

    services:
      nginx:
        image: nginx:alpine
    

    このように image にnginx:alpineとしている場合、Nginxはデフォルトで nginx というユーザーで動作するため、PHP-FPMとユーザーが異なります。
    ただし、NginxもPHPもファイルの作成や書き込みをしない構成であれば、ユーザーが異なっていても動作に支障が出ることはあまりありません。

group = www-data

上記ユーザーに対応するグループ設定

プロセスマネージャ関連(pm)

  • PHP-FPMは複数の子プロセスを起動してリクエストに応じます。
  • その挙動を制御するのが pm 下の設定です。

pm = dynamic

  • プロセス数をリクエストに応じて増減させる(動的)
  • 軽量な開発環境〜中規模運用まで幅広く対応
    pm = dynamic のときにのみ、start_servers / min_spare_servers / max_spare_servers が適用されます。

pm.max_children = 5

  • 同時に起動できるPHPの子プロセス(=同時リクエスト処理数)の上限
  • たとえば GETPOST のAPIリクエストが同時に5件まで処理可能で、6件目以降は待機状態になります

    補足:同時処理数の制限
    PHP-FPMは、事前に起動しておいた子プロセス(PHP実行担当)がリクエストを処理します。
    この設定では、最大5つのリクエストを同時に処理できることになります。
    6つ以上のリクエストが同時に来ると、空いているプロセスができるまでリクエストは待たされることになります。

pm.start_servers = 2

  • PHP-FPM 起動時に、最初に立ち上げる子プロセスの数

    補足:start_serversとは?
    PHP-FPMを起動したときに、まずいくつの子プロセスを事前に立ち上げておくかを決める設定です。
    ここでは2つの子プロセスが最初からリクエスト待ちの状態で待機します。
    初回のリクエストにもすぐ対応できるようにするための設定です。

pm.min_spare_servers = 1

  • 待機中(=今リクエストを処理していない)子プロセスの最小数
  • 少なすぎる場合は自動で増やされる

    補足:min_spare_serversとは?
    PHP-FPM は、常に一定数の「待機中の子プロセス」がいるように保とうとします。
    ここでは、最低でも1つは空きプロセスがいるようにします。
    リクエスト急増時にも遅延なく対応できるようにするための設定です。

pm.max_spare_servers = 3

  • 待機中の子プロセスの最大数
  • 多すぎる場合は自動で減らされ、サーバーリソースを節約

    補足:max_spare_serversとは?
    リクエストが落ち着いているときに、待機中のプロセスが多すぎるとメモリが無駄になります。
    この設定では、待機中プロセスが3つを超えると、自動的に減らして効率化します。
    サーバーのリソース使用を抑えるための調整項目です。

なぜこのファイルが必要か?

  • Dockerfileでは php-fpm8.1 を明示的に起動しているため、この設定ファイルが読み込まれる
  • listen = 9000 の設定がないと、Nginx との連携ができない
  • Docker Composeでこのファイルをマウントしているため、削除すると起動しなくなる可能性が高い

まとめ

この www.conf ファイルは、PHP-FPMとNginxの接続設定であり、Docker環境での開発において必須の構成ファイルです。
特に次の2点が重要:

  • listen = 9000 によりNginxとポートで接続
  • pm.* によりPHPのプロセス数やスケーリングを制御
    必要最小限の設定ながら、柔軟で拡張しやすい構成になっています。

Discussion