
私は、apache2+fastcgi+suexec+php5 を使用して、1 つのサーバーで複数 (約 30) の異なるサイトをホストしています。サイトによって負荷が異なり、スクリプトの実行時間も異なります (リクエストの処理に 5 ~ 7 秒かかるものもあれば、1 秒未満のものもあります)。
場合によっては、単一のサイトが非常に高い負荷を受けると (このサイトのすべての PHP インスタンスが作成および使用される)、Apache サーバー全体がハングします。Apache (ワーカー mpm) は上限まで新しいプロセスを作成します。負荷が高く、すぐにプロセス制限に達するサイトだけでなく、すべてのサイトに対してすべての新しいリクエストをキューに入れ始めているようです... Apache を再起動すると、問題は解決します...
設定: FastCgiConfig -singleThreshold 1 -multiThreshold 10 -listen-queue-depth 30 -maxProcesses 80 -maxClassProcesses 12 -idle-timeout 30 -pass-header HTTP_AUTHORIZATION -pass-header If-Modified-Since -pass-header If-None-Match
(以前はデフォルトの -listen-queue-depth = 100 でしたが、何も変わりませんでした...)
助言がありますか?
もう 1 つの質問 - この listen キューはどのように実装されていますか? これは Apache 全体に対して 1 つのキューですか、それとも定義されたすべての PHP アプリケーション (suexec サイト) に対して固有のキューですか?
次のようなことを実現したいと考えています。1 つのサイトに高い負荷がかかり、キューがいっぱいになった場合、サーバーは次のリクエストをバウンスしますが、これはこの 1 つのサイトに対してのみです。他のサイトは正常に動作するはずです...
答え1
Apache 2.4 では、php-fpm へのリクエストをプロキシできる新しい fastcgi プロキシ モジュール (mod_proxy_fcgi) が提供されています。mod_proxy を仲介として使用すると、メイン サーバーとは別にキューイングや枯渇パラメータを含むすべての mod_proxy オプションにアクセスできるようになります。
Apache 2.4 イベント MPM と php-fpm を使用してテスト サーバーにセットアップすることをお勧めします。さまざまなアプリケーションに合わせて各 PHP プールを調整することもできます。
答え2
代わりに mod_fcgid を試しましたか? サーバーでの高負荷の処理には、こちらの方がはるかに優れています。
答え3
fastcgi が PHP スクリプトをユーザー プロセスとして起動している場合は、/etc/security/limits.conf 定義 (具体的には nproc) が OS によって強制される必要があります。
つまり、Apache はそのユーザーとしてプロセスを起動しようとしますが、プロセス制限を超えたため OS はプロセスを強制終了します。
ただし、これは一種の場当たり的な方法であり、マシンがアイドル状態の場合は、依然として接続が切断されます。
大きなクライアントを専用のマシンにフォークしてはどうでしょうか。または、フットプリント/ランタイムの許容量を設定し、高ポートでリッスンするセカンダリ Apache を起動してはいかがでしょうか。mod_proxy を使用して、リクエストを透過的に渡すことができます。
とはいえ、私は fastcgi にあまり詳しくないので、すでに何らかのクォータ システムが利用可能になっている可能性があります。ただし、ドキュメントをざっと読んでも何もわかりませんでした。
答え4
一連の Web チュートリアルは、こちらでご覧いただけます: http://blog.stuartherbert.com/php/category/the-web-platform/
個人的には、これらは非常に参考になると思います。このチュートリアルも同様に役立つかもしれません: http://blog.stuartherbert.com/php/2008/10/07/can-you-secure-a-shared-server-with-php-fastcgi/
正直に言うと、トラフィックの多いサイトがそれほど多くのリソースを使用している場合は、そのサイトを独自のマシンに移動することをお勧めします。