【EC2+Apache】PHP-FPMの変更が反映されない時

EC2(t2.micro)のPHPが度々「Out of Memory」と言ってくるので困っていました。

臭いものに蓋をするかの如く、毎度EC2を再起動してメモリ使用率を下げ見て見ぬフリを続けていました。

が、アクセスもないし自分が編集するだけでこんなにサーバがおちるのはおかしすぎる…。
いい加減限界…まぢムリ……となったので根本から解決することにしました。

ちなみにこのブログで使用しているEC2の話です。
EC2(t2.micro)+Apache+WordPress構成の方は同じ思いをしてるかもしれませんね。

ど素人なりに調べた結果、php-fpmの設定がまずそう。
ということでチューニングしたのに改善されない…なぜ…?
となってちょっと困ったので備忘です。

ついでにすぐ忘れてしまうphp-fpm関連もメモ

PHP-FPMとは

FPMとは?

FastCGI Process Manager の略。

PHPのページ(https://www.php.net/)を見てみると、

PHP の FastCGI 実装のひとつで、 主に高負荷のサイトで有用な追加機能を用意しています。

とのこと。

FastCGIとは…?

外部アプリケーションをWebサーバに接続するためのプロトコル(CGI)の改良版

PHP-FPMの機能

  • 緩やかな (graceful) 停止/起動 機能を含む高度なプロセス管理
  • 異なる uid/gid/chroot/environment でのワーカーの開始、 異なるポートでのリスン、異なる php.ini の使用 (safe_mode の代替)
  • 標準出力および標準エラー出力へのログ出力
  • opcode キャッシュが壊れた場合の緊急再起動
  • 高速なアップロードのサポート
  • “slowlog" – 実行時間が非常に長いスクリプトの記録 (スクリプト名だけでなく、PHP バックトレースも記録します。バックトレースを取得するために、 ptrace やそれと同等の仕組みを使ってリモートプロセスの execute_data を読みます)
  • fastcgi_finish_request() – 何か時間のかかる処理 (動画の変換や統計情報の処理など) を継続しながら リクエストを終了させてすべてのデータを出力させるための特殊な関数
  • 動的/静的 な子プロセスの起動
  • 基本的な SAPI の動作状況 (Apache の mod_status と同等)
  • php.ini ベースの設定ファイル

https://www.php.net/ から引用)

php-fpmの場所

すぐ忘れる。

設定ファイル www.conf は当環境では以下にある。(環境によって変わるが)

/etc/php-fpm.d/www.conf

各設定値

www.confの中の設定値の意味

pm

static:常に子プロセスが一定(ps.max_childrenの値)

dynamic:動的に子プロセスの数が変わる

;Choose how the process manager will control the number of child processes.
; Possible Values:
;  static – a fixed number (pm.max_children) of child processes;
;  dynamic – the number of child processes are set dynamically based on the
;   following directives. With this process management, there will be
;   always at least 1 children.

pm.max_children

php-fpmが作成する子プロセスの最大値。
ここが大きかったので減らした。デフォルトは50だった。

; The number of child processes to be created when pm is set to 'static’ and the
; maximum number of child processes when pm is set to 'dynamic’ or 'ondemand’.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don’t
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static’, 'dynamic’ or 'ondemand’
; Note: This value is mandatory.

pm.start_servers

php-fpm起動時に作成される子プロセスの数。デフォルト5だった。

; 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 – min_spare_servers) / 2

pm.min_spare_servers

アイドル中に立ち上げておくプロセスの最小値。デフォルト5

; 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.max_spare_servers

アイドル中に立ち上げておくプロセスの最大値。デフォルト35

; 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’

php-fpmの変更が反映されない

php-fpm.confの値を変更して、チューニングをしてみた。
チューニングの流れと具体的な数値は別記事(リンク:coming soon …)を参照。

いろいろ考えてphp-fpm.confを変更したのに、全然よくならない原因

php-fpmを再起動していない

再起動しましょう

sudo systemctl restart php-fpm

同じディレクトリに.conf拡張子でバックアップを作ってしまっている

私の場合はこれでした。

www.confの設定を変更する前に、オリジナルを残しておこ〜という軽い気持ちで「www-org.conf」という名前でバックアップをとっていた。

sudo cp php-fpm.conf php-fpm-org.conf

これが良くなかった。

/etc/php-fpm.conf ファイルの中を見てみると…

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
include=/etc/php-fpm.d/*.conf

と書かれてあった。/etc/php-fpm.d/ の中に初期値のままのwww-org.confを作ってしまっていたせいっぽかった。

sudo mv www-org.conf www-org

としてファイル名を「www-org.conf」→「www-org」に変更したら無事設定が反映されるようになった。

こんなろころに罠が…素人でした…

では!
\楽しい人生/

ブログランキング・にほんブログ村へ

AWS,IT,LinuxEC2

Posted by AKIRA