web-dev-qa-db-ja.com

PHP-FPMmax_requestsパラメーターにより502が発生します

nginxPHP-FPM v5.3.3を使用したセットアップで、nginxのエラーログに次のエラーが頻繁に発生していることに気付きました。

Feb 16 15:00:22 mymachine www.example.com 2015/02/16 15:00:20 [error] 20254#0:
*1448249 readv() failed (104: Connection reset by peer) while reading upstream
[...]

php-fpm.logファイルを見ると、次のことに気づきました。

[16-Feb-2015 15:00:20] NOTICE: [pool www] child 22279 exited with code 0 after
47983.681002 seconds from start
[16-Feb-2015 15:00:20] NOTICE: [pool www] child 10625 started

これは、pm.max_requests構成ディレクティブが設定するワーカーのリサイクルです。

私は(合理的に)PHP-FPMがワーカーをリサイクルする前に、受け入れられた接続/要求を正しく処理すると想定しました。このタスクはいかなる種類の緊急事態も意味しないためです。

  1. 設定ミスですか?
  2. PHP-FPM 5.3.3の欠陥ですか?
  3. PHP-FPMのすべてのバージョンの欠陥ですか?
1
Bernard Rosset
  1. いいえ、有効です。
  2. 多分。少なくとも最後の5.3.xでのアップグレードを検討する必要がありますが、5.3.xはサポートされなくなったため、最近の5.xにアップグレードすることをお勧めします。
  3. いいえ。私はそのような構成をすべてのバージョンで機能させました。さらに、pm.max_requestssetは一般的な方法です。

たぶんあなたはただ数人の労働者を走らせなければならないでしょう。ビジーで実行中のワーカーの数を実際に調査する必要があります。php-fpmにはこのための内部リソースがあります。pm.status_path-wgetまたはその他のhttpクライアントで何が含まれているかを確認できます。

[root@sol etc]# wget -O - -q http://localhost/status
pool:                 www
process manager:      dynamic
start time:           29/Jan/2015:11:36:20 +0300
start since:          1633615
accepted conn:        996160
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       34
active processes:     1
total processes:      35
max active processes: 18
max children reached: 0
slow requests:        0

1つのアクティブなプロセスと1つのアイドル状態があると表示されているので、問題ありません。ビジーなプロセスの数は最大で18でしたので、最初からずっと大丈夫でした。

1
drookie