質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

7426閲覧

ApacheのMaxRequestWorkersの初期値が公式ドキュメントと異なる

workshajikoma

総合スコア110

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2021/04/09 03:37

質問

Dockerイメージ「php:7.4-apache」を基にビルドした環境で、ApacheのMaxRequestWorkersの初期値が公式ドキュメントと異なる理由が知りたい。

事象

MaxRequestWorkersの初期値は、公式ドキュメントでは256と書かれています。
しかしphp:7.4-apacheのDockerイメージをベースにビルドすると、MaxRequestWorkers が150になります。

調査したこと

ビルドした環境のconfに MaxRequestWorkers 150 が設定されていることを確認。

cat /etc/apache2/mods-enabled/mpm_prefork.conf # prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # MaxRequestWorkers: maximum number of server processes allowed to start # MaxConnectionsPerChild: maximum number of requests a server process serves <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule>

しかしDockerfileは以下で、特に設定をいじったり環境変数を設定したりはしていません。

FROM php:7.4-apache COPY --chown=www-data:www-data . /var/www/html/ RUN a2enmod headers rewrite negotiation deflate setenvif info \ && docker-php-ext-install opcache

php:7.4-apache イメージにそのような設定が入っているのかと思い
調べていますが、いまのところそれらしき記述は見つけられておりません。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

公式ドキュメントの初期値は、MaxRequestWorkers を何も指定をしなかった場合の値となります

なぜ /etc/apache2/mods-enabled/ 配下に mpm_prefork.conf が存在し
MaxRequestWorkers が指定されているのか、
その理由は、php:7.4-apache の Dockerfile が
a2enmod コマンドで mpm_prefork モジュールを有効にしているためです:

php:7.4-apache のDockerfile では、次の箇所で mpm_prefork モジュールを有効にしています:

php/Dockerfile at 64811791f0682262478d73514819908fcfe73d7f · docker-library/php

Dockerfile

1# Apache + PHP requires preforking Apache for best results 2RUN a2dismod mpm_event && a2enmod mpm_prefork

モジュールを有効にすると、/etc/apache2/mods-enabled/ 配下に
有効にしたモジュールの設定ファイルが作成されます

参考: mods-enabled directory | Apache

(ただし、mpm_prefork を有効化しなくても、mpm_event が最初から有効化されているため、やはり mpm_event.conf の初期値 150 が適用されます)

mpm_prefork モジュールが、なぜ MaxRequestWorkers を 150 としているのかの根拠は
軽く調べただけではわかりませんでした

Apache のコードの変更履歴を追っていけばわかるかもしれません (わからないかもしれません):
apache/httpd: Mirror of Apache HTTP Server. Issues: http://issues.apache.org

MaxRequestWorkers が MPM 設定ファイルで 150 に設定されている経緯

MaxRequestWorkers の旧名である MaxClient は最初 (1999 年)から 150 として指定されていたようです:
Apache 1.3.9 baseline for the Apache 2.0 repository. · apache/httpd@77c2776

その後、MaxClient の設定は MPM の設定ごとに分割され、値は 150 が引き継がれました:
Merged the simple-conf branch changes r159781:160695 into the trunk. · apache/httpd@fa4e866

更に、次のタイミングで MaxClientsMaxRequestWorkers に更新されます:
Rename MaxClients to MaxRequestWorkers which describes more accuratel… · apache/httpd@6d8de2f

ちなみに、最新の Apache では「ドキュメントの初期値に合わせる」(?) ということで 250 に更新されているようです:
Updated event mpm configuration to match the defaults in documentatio… · apache/httpd@28a9c0d

一方、ドキュメントの方は、ドキュメントが分割されたタイミングで、
「prefork MPMを使って 256 を超えるクライアントを構成するには、ServerLimit ディレクティブを使ってください。」
とだけ表記されていたところに次の初期値表記が追加されています:

xml

1<default>>MaxClients 2 8 (with threads) MaxClients 256</default>

Start converting the mpm documentation. · apache/httpd@5fe0caf

しかし、このタイミングでも MaxClients は初期値 150 です:
httpd/httpd-std.conf at 5fe0caf22ae8c6201cf06ff414b1bdd35d1af07e · apache/httpd

注: 設定しなかった場合に本当に 256 になるのかまでは確認していません

投稿2021/04/09 04:41

編集2021/04/10 01:08
y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workshajikoma

2021/04/09 05:38

ご回答ありがとうございます。Apacheの公式ドキュメントが古いだけかもしれませんね。変更履歴を追ってみます。
y_shinoda

2021/04/09 12:10

これは Apache のドキュメントが古いのではないものと思われます 回答に説明を少し足しました php:7.4-apache のDockerfile が mpm_prefork モジュールを有効にしたために Apache の初期値が上書き設定されています 質問文の言葉を借りれば、 「php:7.4-apache イメージにそのような設定が入っている」 ということになります
workshajikoma

2021/04/09 14:47

ご回答補足ありがとうございます。まだ少しわからないので教えてください。 この150と書かれたmpm_prefork.confは誰が用意したものでしょうか? Apacheが用意したものだとすれば、それは"preformモジュールを使用する際の初期値は256"という公式ドキュメントと矛盾すると思います。 php:7.4-apacheイメージの作成者が(よかれと思って?)用意したものならば、納得がいくのですが…。
y_shinoda

2021/04/10 01:14

> この150と書かれたmpm_prefork.confは誰が用意したものでしょうか? Dockerfile の側は mpm_prefork モジュールを有効化しているだけで、 このファイルは Apache httpd 自体が元から用意しています 経緯を調べたので、回答に更に追記しました 最初否定していましたが、「Apacheの公式ドキュメントが古い」、というか、誤っている可能性もあるかもしれません
workshajikoma

2021/04/10 05:13

1999年まで遡って調べていただき恐縮です。ドキュメントだけでなくコミット履歴なども地道に追えるようにいたします。ありがとうございました!
guest

0

着眼点の良い、面白い疑問ですね。

まず前提として、Docker の公式イメージ(official image) の理解が必要です。Docker Hub で配布されている、Docker 公式イメージとは、 Docker のコミュニティによって、作成過程が GitHub 上で共有 されており、Docker 社がレビューや開発を支援しているものです。イメージに含まれるソフトウェア等は、実際の開発者が直接開発している場合もあれば、そうでない場合もあります。

(参考:Official Images on Docker Hub | Docker Documentation

つまり、Docker 公式イメージの中には、元々のソフトウェア開発者が直接作っている場合もあれば、ない場合(開発者ではない、第三者が作成している)もあります。

ここまでが前提です。

次に、「php:7.4-apache」の Docker イメージは、やはりコミュニティによって開発されています。 Docker Hub の php イメージの詳細 を辿ると詳細が分かります。ただし、ここでの「コミュニティ」とは Docker イメージとしての PHP を作成する方々であり、元々の「Apache httpd」を開発された方達とは異なるでしょう(もしかしたら、一部重複されている方もいらっしゃるしれませんが、作っている人々のグループという意味では別です)。

そのため、

  • (元々のソースコードを開発された方々による)Apache httpd 公式ドキュメントに書かれている MaxRequestWorkers の値とは、値の指定が無かった場合の仕様上の数値、ソフトウェアのデフォルト(初期値)として、 256 が指定されています。

一方、

  • Docker 公式イメージの「php」に含まれる MaxRequestWorkers は、何らかの理由によって値が 150 に指定されています。これは Docker イメージを作られた方々が、そのようにしているからだ、というのが答えになるでしょう。

正確な答えは、 php イメージの開発者の方へ伺わないと分かりませんが、推測するとおおよそ「歴史的に妥当な値だから」でしょうか。

Docker イメージの php の Dockerfile を辿ると、元々が Debian の Linux ディストリビューションを元にしていると分かります。Debian 上では apt install apache2 と実行すると、 etc/apache2/mods-enabled/mpm_event.conf

MaxRequestWorkers 150

このような指定があります。

つまり、PHP の Docker イメージを作成するにあたり、参照している Debian ディストリビューションの Apache httpd 初期設定が 150 だから、というのが答えの1つでしょう。

そして、なぜ「150」かについては、おそらくこれも、妥当な値だからと考えられます。

Apache httpd の ドキュメント にも、 MPM worker というモジュールのページですが、典型的な例として「MaxClients 150」の記述があります(MaxRequestWorkers に相当するものは、もともとは MaxClients でした)。

Debian に限らず、国内でよく見られる Linux ディストリビューションでも、 150 がデフォルトに指定されているでしょう。

なぜ 150 が妥当なのか、についてはシステム上のメモリリソースを消費するので、このあたりが妥当だという風に昔ながらの共通認識になっている気がします。この値を増やせば増やすほど、システム上で多くのメモリを使用します。

言い換えますと、Apache httpd の仕様上は 256 まで設定できます。ですが、アクセスが増えるとシステムで使用するメモリの容量や、それに伴う他のシステムリソースの使用、ディスクの読み書きが増えることなどが予想され、システム全体の動作に支障が出る場合があります。実際私も、システムのリソースが足りないのに、この値を増やすことで性能が劣化したり、逆にサーバ障害になったというケースは体験しました。

例えると、自動車は性能上 200 km/h で走れるかもしれませんが、現実的な安全を鑑みて路上では 60km/h に制限されているようなもの、でしょう。 Apache httpd ソフトウェアとしては、256 まで設定できる設定ですが、サーバの現実的な値として 150 が設定されており、それが Debian の開発者、PHP イメージの開発者も妥当と判断したから、この値になっていると考えられます。

投稿2021/04/09 19:51

編集2021/04/09 19:58
zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workshajikoma

2021/04/10 05:18

歴史的な妥当な値が設定されているのはありがたい場合の方が多そうですが、運用においては適用されている設定をしっかり確認する癖とセットでないといけませんね。 勉強になりました。詳細にご説明くださりありがとうございました!
zembutsu

2021/04/10 05:34

いえいえ、面白い質問ありがとうございます!勉強になりました!
zembutsu

2021/04/10 05:35

ちなみに、開発環境だとしても MaxRequestWorkers の値は何か知っておくと便利だと思います。たぶん、このあたりをご存じないと、良く分からないけれどメモリをいっぱい使ってしまうですとか、本番運用時に思いがけぬ挙動につながることがありますので、非常に素晴らしい質問と感じました。
guest

0

MaxRequestWorkersの初期値は、公式ドキュメントでは256と書かれています。

ここで「初期値」とお書きなのは、ドキュメントのデフォルト値のことでしょうね。
デフォルト値というのは、他の方の回答の通り、指定を全く書かない場合にどの値になるかと言うことです。

その設定ファイルでは、150と書いてある訳なので、デフォルト値の256は使われず、指定した150が採用されます。

設定ファイルの記述はデフォルト値と異なる値にしたい場合に書くわけで、デフォルト値でない値を書くのはごく普通のことで、何の不思議もありません。
もちろん、デフォルト値と同じ値を書くのも間違いではないです。書いても書かなくても同じ効果なだけです。

投稿2021/04/09 14:23

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workshajikoma

2021/04/09 15:13

ご回答ありがとうございます。つまり言い換えると”デフォルト値は256だが、初期設定は150”ということでしょうか? それとも、この設定ファイルはApache公式とは無関係でphp:7.4-apacheイメージの作者が入れたもので、”php:7.4-apacheにおける初期設定は150”ということでしょうか?
otn

2021/04/09 15:38

>つまり言い換えると”デフォルト値は256だが、初期設定は150”ということでしょうか? そうです。初期設定というか設定値ですね。 > この設定ファイルはApache公式とは無関係でphp:7.4-apacheイメージの作者が入れたもので、”php:7.4-apacheにおける初期設定は150”ということでしょうか? これも、多分そうです。無関係では無くて公式のサンプルに手を加えた物でしょうけど(確認したければ見比べてみましょう)。
workshajikoma

2021/04/10 05:09

イメージの中身や変更履歴も追えるよう勉強いたします。ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問