web-dev-qa-db-ja.com

Apache:孤立したfcgiphpプロセス

Apache 2.2.14、PHP 5.3.2)を備えたWebサーバーがあります。

PHPはmod_fcgidを使用して実行されます(下を参照)。すべてが正常に機能しますが、場合によっては、これをトリガーするものを理解する必要があります。phpプロセスが「ローテーション」されると、アクティブで孤立したままになります。Apacheは新しいphpプロセスを生成し、古いプロセスはシステムに残ります。それらを殺すことは必ずしもそれらを追い払うわけではありません。 「Apache2ctlgraceful」がシステムをこの古いプロセスから解放する可能性があります。これはエラーログで見つかりました:[Tue Jun 18 20:49:54 2013] [warn] mod_fcgid:process 2009 graceful kill fail、sending SIGKILL from I found from this about this about this、but it is all I found in Apache logsこのプロセスの1つでリークが発生します。

このイベントは幸運にもめったに発生しません。通常、Apacheとphpは正常に動作し、fcgidの子の更新中に問題は発生しません。これらの状況で何がうまくいかないのかをどうやって理解できますか?

サイトのmod_fcgid構成:

<IfModule mod_fcgid.c>
SuexecUserGroup domain domain
<Directory /var/www/fomain.it/htdocs/>
AddHandler fcgid-script .php
FCGIWrapper /var/www/fcgi/domain.it/fcgi-starter-php .php
Options +ExecCGI -Indexes
AllowOverride FileInfo Options
Order allow,deny
Allow from all
</Directory>
<Directory /var/www/fcgi/domain.it/>
AllowOverride None
Options +ExecCGI MultiViews -Indexes
Order allow,deny
Allow from all
</Directory>
</IfModule>

/var/www/fcgi/domain.it/fcgi-starter-php:

#!/bin/sh

PHPRC=/var/www/fcgi/domain.it/php/

export PHPRC
PHP_FCGI_CHILDREN=8
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS

exec /usr/lib/cgi-bin/php $1

現在、サーバーが孤立したプロセスでいっぱいになるのを回避するための回避策を見つけました。次の方法で、古いプロセスを取り除くことができます。

Apache2ctl graceful

そして、それらのプロセスを次のように強制終了します。

pkill -f -x /usr/lib/cgi-bin/php -P 1

これらの2つのコマンドを(適切なチェックを使用して)スクリプト化してスケジュールすると、サーバーが多くの役に立たないprocをホストすることを回避できますが、問題は依然として存在します。

3
Maxxer

一定期間のアクティビティの後、fcgidが使用可能なプロセススロットを使い果たしたという同様の問題がありました。

ログメッセージは大まかに次のとおりです。

[fcgid:warn] mod_fcgid: can't apply process slot for /var/www/cgi-bin/xxx/php-cgi, referer: ...

私はこれまで問題を追跡しました:

[fcgid:emerg] (35)Resource deadlock avoided: [client ....] mod_fcgid: can't get pipe mutex, referer: ...

これは不適切なロックが原因で発生します。私の場合、Apacheはfcntl()ロック(デフォルトではdebian)を使用していたので、Apache2.confでそれをflock()に変更しました。

Mutex flock:${Apache_LOCK_DIR} default

私を解決策に導いたリファレンス: https://bz.Apache.org/bugzilla/show_bug.cgi?id=53999

さまざまなロックオプションに関するドキュメント(fcgidには、スレッドを含むものを使用しないように警告するアドバイスがあります): https://httpd.Apache.org/docs/2.4/mod/core.html#mutex

0
exa

本当の答えはありませんが、もっと多くの情報が問題の解決に役立つかもしれません。私は言いたいのですが、私はPHP 5.3.5のWindowsサーバーでも同じ問題を抱えています。

一部のcgiプロセスは、実際に実行された後も、一種のゾンビタスクとして残ります。 max_executiontimeなどの設定も無視します。

現在、これらの古いプロセスを強制終了するスケジュールされたスクリプトがあります。このソリューションの問題は、強制終了された「通常の」cgiプロセスでさえ、プロセスの実行時間を検出し、max_execution時間が経過した場合にのみプロセスを強制終了することが役立つ場合があります。

0
Radon8472

トーマスが提案したように「sem」に変更する https://bz.Apache.org/bugzilla/show_bug.cgi?id=53999 私のために働いた。

したがって、Apache2.confを編集し、Mutex行にコメントして、次のように入力することをお勧めします。

# Mutex file:${Apache_LOCK_DIR} default   # Original debian config
Mutex sem  # Solves orphaned PHP processes.
0
deavidsedice