環境
- 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)に達し、リクエストが滞留していることがパフォーマンス低下の直接的な原因だと特定しました。
これが分かれば、後は実際の対処です。
事象改善:さっくりとした手順
- PHP-FPMのプール設定ファイルのバックアップを取ります。
- 設定ファイルを編集してワーカープロセスの上限数や他の関連する値を引き上げます。
- 設定ファイルを反映させるため、各種サービスを再起動します。
- 事象の解決を確認します。
設定ファイルのバックアップ
- ファイルバックアップ
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の処理能力が追いつかなかったのでしょう。
利用状況に合わせて、ボトルネックを特定し、修正を加えて改善を施していくというのもまた、サーバ運用の苦しくも楽しいところです。
コメントを残す