GNU/Linux >> Linux の 問題 >  >> Linux

PHP と mod_fcgid:ap_pass_brigade が handle_request_ipc 関数で失敗しました

私も約1年前に同じ問題を抱えており、多くのことを試しましたが、最後にドキュメントを読んだ後にいくつかのヒットアンドランを実行したところ、問題はなくなりました。まず、次のように設定する必要がある重要事項:

FcgidBusyTimeout     300 [default]
FcgidBusyScanInterval    120 [default]

このディレクティブの目的は、ハングしたアプリケーションを終了することです .リクエストの処理に時間がかかる可能性があるアプリケーションでは、デフォルトのタイムアウトを増やす必要がある場合があります。 FcgidBusyScanInterval で定義された間隔でチェックが実行されるため 、リクエスト処理はより長い期間続行することが許可される場合があります

FcgidProcessLifeTime     3600 [default]

クラスのプロセス数が FcgidMinProcessesPerClass を超えると、この時間より長く存在するアイドル状態のアプリケーション プロセスが終了します。 .

このプロセス ライフタイム チェックは、構成された FcgidIdleScanInterval の頻度で実行されます。 .

FcgidZombieScanInterval   3 [seconds default]

モジュールは、この間隔で終了した FastCGI アプリケーションをチェックします。この期間中、アプリケーションはゾンビとしてプロセス テーブルに存在する可能性があります (Unix の場合)。

注 :上記のすべてのオプションは、アプリケーションの処理時間またはニーズに応じて増減するか、特定の vhost に適用します。

しかし、私の問題はこのオプションで解決します:

上記のオプションでサーバーを微調整しましたが、しばらくするとエラーが再び発生するように見えますが、エラーはこれで実際に解決されます:

 FcgidOutputBufferSize   65536 [default]

に変更しました

 FcgidOutputBufferSize   0

これは、データをクライアントにフラッシュする前に、モジュールが FastCGI アプリケーションから読み取る応答データの最大量です。これにより、64KB のバイトを待たずに即座にデータがフラッシュされます。これにより、プロセスをより高速にフラッシュすることができます。

その他の問題

Nginx のタイムアウトによる 500 エラーの場合。修正:

/etc/nginx/nginx.conf

keepalive_timeout  125;
proxy_read_timeout 125;
proxy_connect_timeout 125;
fastcgi_read_timeout 125;

断続的に、MySQL の「MySQL server has gone away」というエラーが表示され、もう 1 つ調整が必要でした:/etc/my.conf

wait_timeout = 120

次に、念のため、念のため PHP のメモリ制限を増やしました:/etc/php.ini

memory_limit = 256M

SuExec の使用

mod_fastcgi SuExec 以下ではまったく動作しません Apache 2.x で .私はそれによる問題しかありませんでした(テストでは他にも多くの問題がありました).あなたの問題の本当の原因は SuExec です

私の場合、それはスタートアップでした。Apache を起動すると、mod_fcgid は仮想ホストごとに正確に 5 つのプロセスを生成します。現在、単純なアップロード スクリプトを使用して 4 ~ 8KB を超えるファイルを送信すると、スクリプトが実行された特定の仮想ホストに対して、これらのすべての子プロセスが一度に強制終了されます。

デバッグ ビルドを作成するか、mod_fcgid でロギングを開始すると、手がかりが得られる可能性があります。

その間、私は mod_fastcgi を 1 年間試しましたが、他の多くの人と同じように、SuExec は面倒であり、すべての場合においてまったくスムーズに動作しないと言えます。


この警告は Fcgidxxx のいずれとも関係ありません オプションであり、サーバーが応答する機会を得る前に、クライアントが接続の側を閉じることによって単純に発生します。

実際のソースから:

/* Now pass any remaining response body data to output filters */
if ((rv = ap_pass_brigade(r->output_filters, brigade_stdout)) != APR_SUCCESS) {
    if (!APR_STATUS_IS_ECONNABORTED(rv)) {
        ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r,
                      "mod_fcgid: ap_pass_brigade failed in "
                      "handle_request_ipc function");
    }

    return HTTP_INTERNAL_SERVER_ERROR;
}

クレジットは、それを発見した Avian のブログに送られます。


Linux
  1. プロセス置換とパイプ?

  2. Ubuntu/Debianでmod_fcgidを使用してApacheとPhpをセットアップします

  3. Linuxのrebootおよびshutdownコマンド

  1. PHP でリアルタイム出力を使用してプロセスを実行する

  2. Linux プロセスの状態

  3. CLOCK_REALTIME と CLOCK_MONOTONIC の違いは?

  1. 実行中のプロセスのユーザーとカーネルの時間を取得しますか?

  2. execv() と fork() の時間の無駄

  3. ファイルのタイムスタンプ、変更時刻、作成時刻