web-dev-qa-db-ja.com

MaxClientsが到達したため、apacheがシャットダウンします

深刻な問題があります。 Apacheを実行する仮想サーバーと、多くの訪問者(1秒あたり約5ヒット)の2つのWebプロジェクトがあります。サーバーが自動的にシャットダウンし始めます。エラーログでこの問題を見つけました

[error] server reached MaxClients setting, consider raising the MaxClients setting
[notice] caught SIGTERM, shutting down

だから私はこれらの数を増やすための解決策を探しています。この数は、Apache構成の2つのセクションにあることがわかりました。と

/usr/sbin/httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

サーバーがpreforkを使用していることがわかりました。だから私は再び適切な値を検索し、これらを試しました

<IfModule prefork.c>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit     1024
    MaxClients      1024
    MaxRequestsPerChild  4000
</IfModule>

ただし、これらの値を使用してもサーバーはシャットダウンします。サーバーを適切に安定して実行するために、どこを探すか、何を読むか、何を設定するかを誰かに教えてもらえますか?皆さん、助けていただければ幸いです。

サーバーはLinuxCentOS5.4を実行します

Thxベニー

3
beny

サーバーはプリフォークモードを実行しているため、これは各接続が独自のプロセスを取得することを意味します。まず、システムで1024程度のhttpdプロセスが実行されているかどうかを確認します。

サーバーが実行していることをより適切に処理するには、サーバーステータスページを有効にすることをお勧めします。

LoadModule status_module modules/mod_status.so 
 
 ExtendedStatus On 
 
 <Location/server-status> 
 SetHandler server-status 
 Order deny、allow 
 Deny from all 
 Allow from .example.com 
 </ Location>

これにより、サーバーへの接続の状態を表示し、すべての接続が消費される原因を突き止めることができます。

私の疑いは、サーバーがすべての接続を消費するまで、サーバーが接続を自身の中で継続的にループさせる、ある種の不正なプロキシまたは書き換えステートメントの可能性です。

1
DaveG

サーバーでKeepAlive機能がオンになっていて、KeepAliveTimeOutの値がめちゃくちゃ高いのではないでしょうか。

これにより、シャットダウンするのに時間がかかりすぎる非アクティブな接続が大量に生成され、サーバーがクランチになる可能性があります。

Apache構成や仮想ホスト定義を確認してください。

M

0
MariusPontmercy

数を再び増やす前に、Apacheが生成するプロセスの量を減らすためにいくつかのことを行うことができます。

キープアライブを有効にし、積極的に低いタイムアウトを設定します。

KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

同じクライアントからのすべてのリクエストは、サーバーへの単一のTCP接続を介して処理されます。KeepAliveTimeout値が低いということは、クライアントが離れない限り、ApacheがKeepAlive接続をすばやく切断することを意味します。 5秒を超える通信の一時停止では、クライアントはページの読み込み全体で1つの接続のみを使用できます。

また、子あたりの最大リクエスト数を1000程度に減らします。Apacheプロセスはリクエストごとにメモリ使用量が増えることが多いため、最大リクエスト数を減らすと、最終的には特定の量のhttpdプロセスの全体的なメモリ使用量が減少します。

最後に、前に述べたように、TOPまたはpsコマンドを使用して、最も忙しい時間帯にサーバーを監視する必要があります。生成されているApacheプロセスの数と、それぞれが消費しているメモリの量を確認します。次に、サーバーの使用可能なRAMとプロセスごとのメモリ使用量に基づいて適切な最大クライアントを計算できます。

これらの調整後も引き続き問題が発生する場合は、Apacheのデフォルトのプリフォークモジュールから離れて、代わりにワーカーmpmモジュールを使用することを検討してください。これには、phpリクエストの処理にfastcgiなどを使用する必要があります。最終的には、それ自体は良い考えです。

nginx ;)

0
CarpeNoctem