93997


mpm preforkの設定値についてApacheの公式ドキュメントや有識者のブログを読んだのですがいまいち理解できません。  
各設定値の考え方や、設定しなかった場合などの挙動について質問させてください。

## 環境

環境 | バージョン  
---|---  
Server | Ubuntu20.04  
Web Server | Apache 2.4.41  
PHP | PHP 7.4.3  
  
## 大まかなサイトのアクセス状況

サイト1ページの総リクエスト数： 80 requests程度  
1分間あたりのユーザー数：平時は5～10人、集中時は15～30人程度

## 注意点

1ページの表示は80 requests程度で構成されており、ほとんどが画像とjs,cssのリクエストになります。  
ただメインのdocumentの処理が非常に重たく、PHPの`memory_limit`では`256MB`を設定する必要があるほどで、1～20秒程度の応答速度になることもあります。

### mpm_prefork.conf(初期値)

設定項目 | 初期値 | 意味  
---|---|---  
StartServers | 5 | Apache起動時の起動プロセス数  
MinSpareServers | 5 | 待機プロセス数の最小値  
MaxSpareServers | 20 | 待機プロセス数の最大値  
MaxRequestWorkers | 150 | 同時に処理できる最大数  
MaxConnectionsPerChild | 0 | 子プロセスが稼働中に扱うリクエスト数の上限  
  
### mpm_prefork.conf(私の環境)

設定項目 | 設定値  
---|---  
StartServers | 200  
MinSpareServers | 80  
MaxSpareServers | 80  
ServerLimit | 700  
MaxRequestWorkers | 700  
MaxConnectionsPerChild | 10000  
  
## 質問したいこと

  1. 私の環境では`ServerLimit`が設定されていますが、`ServerLimit`と`MaxRequestWorkers`の違いがいまいちわかりません。例えばメモリのキャパシティ的に`ServerLimit:700`としていても、実際の処理性能的には`MaxRequestWorkers:100`とするみたいなことがあるのでしょうか？
  2. そもそもかもしれませんが、`ServerLimit`が設定されていない場合はどのような挙動になるのでしょうか？
  3. `Min/MaxSpareServers`は1ページ当たりの総リクエスト数を捌ける値にするべきでしょうか？それとも、Apacheの初期値の様に5～20でも、1ページで80リクエストのアクセスを捌くことは可能なのでしょうか？
  4. `MaxConnectionsPerChild`は初期値では`0(無制限)`となっていますが、多くのブログでは`10000`や`100000`に設定しているケースが多い様に思えます。実際の運用ではどちらが良いのでしょうか？

上記の疑問点に知見のある方がいらっしゃいましたら、ご教示いただけると幸いです。  
宜しくお願い申し上げます。


CC BY-SA 4.0
2023-02-25T04:43:45.063
93993
2023-02-25T06:41:02.873
56419
question
ubuntu apache
mpm preforkの設定値の意味について


ApacheのDocumentに説明があります。引用しながら回答します。

> Apache MPM Common Directives
>
> <https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html>

  1. `prefork`設定の場合、`ServerLimit`=`MaxRequestWorker`です。

> MaxRequestWorkers Directive より:  
>  `For non-threaded servers (i.e., prefork), MaxRequestWorkers translates
> into the maximum number of child processes that will be launched to serve
> requests.`

  2. `prefork`設定の場合、`ServerLimit`のデフォルトは「256」です。

> ServerLimit Directive より:  
>  `With the prefork MPM, use this directive only if you need to set
> MaxRequestWorkers higher than 256 (default).`

  3. `MinSpareServers`, `MaxSpareServers`は待機サーバ数に関する設定ですので、リクエストを処理できるか、という観点では意味を持ちません。  
プロセスが不足しているなら、`ServerLimit`の数までサーバを新たに起動します。  
待機プロセスを用意しておくと、新規リクエストが来た際にサーバ起動せずに即応できるので、応答性能面で設定するとよいと思います。

  4. `MaxConnectionPerChild`の説明は以下の通りで、forkしたサーバについて、接続回数が設定数に到達すると、そのサーバを終了させる設定です。「0」だと何回接続しても終了しません。  
メモリリーク対策として設定することが多いようです。(つまり、万が一リークしている場合に備え、設定していることが多いのでしょう)

> MaxConnectionsPerChild Directive より:  
>  `The MaxConnectionsPerChild directive sets the limit on the number of
> connections that an individual child server process will handle. After
> MaxConnectionsPerChild connections, the child process will die.`  
>  `If MaxConnectionsPerChild is 0, then the process will never expire.`


CC BY-SA 4.0
2023-02-25T06:41:02.873
93997
2023-02-25T06:41:02.873
20098
93993
answer