環境

  • Nextcloud 31系
  • PHP 8.3
    • PHP-FPM 8.3
  • Redis / APCUなどによる
  • Apache 2.4
  • Ubuntu 24.04
  • MySQL 8
  • メモリ6GB
  • 4 core CPU

事象

Nextcloud Talkを含めたレスポンスが非常に悪いという状況。具体的には

  • トップページがなかなかロードされない。
  • 各画面の遷移状態が悪い。
  • 画像をクリックしても表示に時間がかかる。(分単位であることも)

free -hでもメモリ圧迫という様子を見せず、topをたたいても異常なし。

何よりも、同一サーバに同居する

  • Growi
  • Redmine
  • BookStack

などが正常に動いていて、これらはレスポンスも良好。サーバの性能ではなく、サーバ以外のところに原因があると考え、調査開始です。

原因究明

答えは/var/log配下のphp8.3-fpm.logに現れていました。

[04-Oct-2025 17:32:36] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[04-Oct-2025 18:45:55] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[04-Oct-2025 21:28:57] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

これにより、PHPのリクエストを処理するワーカープロセスの数が上限(5)に達し、リクエストが滞留していることがパフォーマンス低下の直接的な原因だと特定しました。

これが分かれば、後は実際の対処です。

事象改善:さっくりとした手順

  1. PHP-FPMのプール設定ファイルのバックアップを取ります。
  2. 設定ファイルを編集してワーカープロセスの上限数や他の関連する値を引き上げます。
  3. 設定ファイルを反映させるため、各種サービスを再起動します。
  4. 事象の解決を確認します。

設定ファイルのバックアップ

  • ファイルバックアップ
sudo cp -pi /etc/php/8.3/fpm/pool.d/www.conf /path/to/backup/directory/www.conf.$(date +%Y%m%d)

※php-fpmの設定値は、入れているPHPのバージョンによって異なります。自分の環境に合わせたものに修正してください。

 → /home/hoge/backupなど、任意のバックアップディレクトリを指定します。

  • ファイルバックアップ確認
diff -u /path/to/backup/directory/www.conf.$(date +%Y%m%d) /etc/php/8.3/fpm/pool.d/www.conf

 → エラーがなければバックアップが取れています。

備考:なぜdiffを用いてバックアップの確認をするのか?

  • ls -lよりも確実に、元ファイルとバックアップファイルがあるか「両方のファイル」で確認を取るため。
  • 編集後、「どのような編集を行ったのか?」を同じコマンドで確認を取る。
    • 「バックアップ」-「設定ファイル」の順番とすることで、後のdiffの編集を行った、追記を行った箇所が+で表示されます。(同様に削った箇所が-で表示)

特に、設定ファイルの修正は非常にデリケートな問題であり、下手な設定がサーバ全体のシステムダウンを引き起こします。このため、変更管理や後のトラブルの追跡を兼ねてのバックアップはサーバメンテナンスの黄金律として体に覚え込ませましょう。

ファイルの修正

  • ファイルの修正

上記、バックアップを取った後の 元ファイル /etc/php/8.3/fpm/pool.d/www.conf を、管理者権限で、自身の教義・信仰に基づいたエディタで修正します。

こちらの設定値は、aptなどでのパッケージ管理システムでのインストールであれば、

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

となっていることが多いです。これを、以下のように修正しましょう。

pm.max_children = 15
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6

※ サーバ環境などにより、随時、修正を行ってください。

修正後、保存を行います。

  • diffによる差分確認
diff -u /path/to/backup/directory/www.conf.$(date +%Y%m%d) /etc/php/8.3/fpm/pool.d/www.conf

以下のような差分を確認します。

; Note: This value is mandatory.
-pm.max_children = 5
+pm.max_children = 15

 ; The number of child processes created on startup.
 ; Note: Used only when pm is set to 'dynamic'
 ; Default Value: (min_spare_servers + max_spare_servers) / 2
-pm.start_servers = 2
+pm.start_servers = 4
 ; The desired minimum number of idle server processes.
 ; Note: Used only when pm is set to 'dynamic'
 ; Note: Mandatory when pm is set to 'dynamic'
-pm.min_spare_servers = 1
+pm.min_spare_servers = 2
 ; The desired maximum number of idle server processes.
 ; Note: Used only when pm is set to 'dynamic'
 ; Note: Mandatory when pm is set to 'dynamic'
-pm.max_spare_servers = 3
+pm.max_spare_servers = 6 
 ; The number of rate to spawn child processes at once.
 ; Note: Used only when pm is set to 'dynamic' 

このように、修正前が-の行、修正後が+の行で修正されていることが分かります。この数値や設定以上に重要なのは「変なスペースや意図した設定以外の情報が含まれていないか?」を、自分の修正した記憶を頼りにすることではなく、コマンドという絶対的な第三者の目で確認することです。

設定反映

PHP-FPMだけでなく、前段のApacheもサービス再起動を行います。

  • Apacheサービス再起動
sudo systemctl restart apache2.service
  • Apacheサービス再起動後確認
systemctl status apache2.service

active(running)を確認します。

  • PHP-FPMサービス再起動
sudo systemctl restart php8.3-fpm.service
  • PHP-FPMサービス再起動後確認
systemctl status php8.3-fpm.service

active(running)を確認します。

事象改善確認

再びNextcloudにアクセスし、事象が改善したことを確認できれば設定完了です。

余談:なぜこの事象が起きたか?

Nextcloudの利用頻度が高まったからに尽きます。Talkをスマートフォンアプリでも利用したり、データが増えたことで、PHP-FPMの処理能力が追いつかなかったのでしょう。

利用状況に合わせて、ボトルネックを特定し、修正を加えて改善を施していくというのもまた、サーバ運用の苦しくも楽しいところです。