apacheの設定そのままにしていませんか?
こんにちは、中村です。
社内では(個人でも)もっぱら、フロントをnginx・バックエンドをapacheという構成が多いです。
でapacheの設定ですが、デフォルトでまずいのがあります。
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
Apacheは伝統的に親プロセスを1つ持ち、 クライアントからリクエストが来ると自分自身をコピーして子プロセスを起動します(これがfork)。
実際の通信は子プロセスが受け持つので通信数分プロセスが起動しています。
この時、クライアントからリクエストを受けたあとでforkするとfork完了までに待ち時間が出来て通信のパフォーマンスが遅くなります。
そのため事前にforkを起動しておきforkの待ち時間をなくす方式をとっています。(これがprefork)
preforkのメリットは、forkされた子プロセス1つ1つが対応する通信を受け持つため、ある子プロセスが何らかの原因でフリーズしたとしても、他の子プロセスには影響を及ぼすことが無く通信を継続できますが、 先述の通り使用メモリ量やCPU負荷が比例的に増大していきます。
preforkで多数のクライアントをさばくには、それに応じた大量のメモリと高速なCPUが必要です。
なので、同時多発的にアクセスが来ると捌けなくなります。
もちろんサーバーのスペックやアクセス状況によって変わります。
子プロセスが使用するメモリ量をモニタリングして決定する必要があります。
下記が、パラメーターの意味。
===
StartServers 起動時に生成される子サーバプロセスの数。数は動的に変更されるので、常に動かしておく数値を指定しておきましょう
MinSpareServers アイドル状態にいる子サーバプロセスの最小(希望)個数
MaxSpareServers アイドル状態の子サーバプロセスの数(この値をこえた時は小サーバプロセスをキル)
ServerLimit MaxClientsに指定可能な値の上限
MaxClients 応答できる同時リクエスト数(子サーバープロセスの最大数)
MaxRequestsPerChild 子サーバーが扱えるリクエストの総数
===
一概にこの設定にすべきだ!というものはありませんが、
そのサイトの状況(突発的なアクセスがあるかetc)に応じて、チューニングが必要になります。