私も約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 のブログに送られます。