Apacheのhttpd.confのGlobal Environmentの設定内容について
主要項目の設定
ここはhttpdの動作環境に関する設定を行います。
ServerTokens OS ・・・・・・ (1) ServerRoot "/etc/httpd" ・・・・・・ (2) PidFile run/httpd.pid ・・・・・・ (3) Timeout 60 ・・・・・・ (4) KeepAlive Off ・・・・・・ (5) MaxKeepAliveRequests 100 ・・・・・・ (6) KeepAliveTimeout 15 ・・・・・・ (7)
(1) はサーバーからのレスポンスヘッダの形式について記入します。デフォルトは「OS」で「Apache 2.4.9 (CentOS)」のように、メジャーバージョン、マイナーバージョン、ビルド番号と使用しているOSまで返してしまう設定になっています。
他に設定できるのは以下の通りです。
パラメータ | 内容 |
Full | プロダクト名 + メジャーバージョン + マイナーバージョン + ビルド番号 + OS名 + アプリ名 |
OS | プロダクト名 + メジャーバージョン + マイナーバージョン + ビルド番号 + OS名 |
Min | プロダクト名 + メジャーバージョン + マイナーバージョン +ビルド番号 |
Minimum | |
Minor | プロダクト名 + メジャーバージョン + マイナーバージョン |
Major | プロダクト名 + メジャーバージョン |
Prod | プロダクト名のみ |
ProductOnly |
(2) はApacheの設定ファイルやモジュール、ログファイルなどを配置するパスを指定します。特に理由が無ければ変更しない方が無難です。
(3) はプロセスIDを記録するためのファイルの指定です。ここも特に理由が無ければ変更しない方が無難です。
(4) はタイムアウトの指定を行います。単位は秒です。
(5)~(7) はKeepAliveの設定です。KeepAliveとはクライアントとサーバーの接続を維持するためのオプションです。「On」か「Off」が指定可能で、デフォルトでは「Off」になっています。Onにした場合、1回の接続での最大のリクエスト数を決めるMaxKeepAliveRequests と1回の接続の持続時間を決める KeepAliveTimeoutのオプションの設定を行います。Timeoutは秒で設定します。
ただ、これらの設定はどのように設定するのが良いのかよく分からなかったので、わかる範囲で調べたことを後で書いておきます。
MPMの設定
Apache2.0以降ではMPM(Multi-Processing Module)を選択する事が出来るようになっています。MPMを変更することでクライアントのリクエストをサーバーがどのように処理するのか設定することができます。CentOSのMPMには「prefork」と「worker」といったモジュールが用意されており、preforkはクライアントからの要求を先に準備していた子プロセスに割り当てて、子プロセスがクライアントの要求に応えていく方式です。workerはクライアントからの要求を先に用意していたスレッドに割り当てて、スレッドがクライアントの要求に応えていく方式になります。
※ちなみにwindowsの場合は「mpm_winnt」となります。
CentOSのApacheはデフォルトでpreforkで動作するようになっており、特に変更する理由もないためpreforkの設定を行います。
<IfModule prefork.c> StartServers 8 ・・・・・・ (8) MinSpareServers 5 ・・・・・・ (9) MaxSpareServers 20 ・・・・・・ (10) ServerLimit 256 ・・・・・・ (11) MaxClients 256 ・・・・・・ (12) MaxRequestsPerChild 4000 ・・・・・・ (13) </IfModule>
(8) StartServers はhttpdを起動したときにアイドル状態として待機させるプロセスの数を指定します。
(9)~(10) MinSpareServers、MaxSpareServers は、それぞれアイドル状態で待機させるプロセスの最小数と最大数を指定します。
※なお、この設定で変更するのは動作中のプロセスは含んでいないことに注意してください。
(11)~(12) ServerLimitとMaxClients は、接続を許可するクライアントの最大数を指定します。preforkの場合、ServerLimitとMaxClientsは同一の内容を示すために、同じ値を設定する必要があります。
(13) MaxRequestsPerChild は1つのプロセスが処理するリクエスト数の上限を指定します。
これらの値は、基本的には調整する必要がほとんどありません。公式にも「Apacheは非常に自律的なので、大抵のサイトではこれらのディレクティブをデフォルト値から調整する必要はないでしょう。」とあります。
その他の設定
Global Environmentに存在するその他の設定項目です。(この部分の項目は特に理由がない限り変更すべきではありません)
Listen 80 ・・・・・・ (14) LoadModule auth_basic_module modules/mod_auth_basic.so ・・・・・・ (15) LoadModule ... (省略) Include conf.d/*.conf ・・・・・・ (16) #ExtendedStatus On ・・・・・・ (17) User apache ・・・・・・ (18) Group apache ・・・・・・ (18)
(14) HTTPリクエストを待ち受けるアドレスとポート番号を指定します。デフォルトではポート番号の80だけが指定されています。アドレスも指定する場合は「Listen 192.168.0.10:80」のように記述します。
また、待ち受けは複数設定することが可能で、複数設定する場合は、必要な分だけ「Listen~」を追加していきます。
(15) 使用するモジュールの記述を行います。新たにモジュールを追加する場合は、ここに新たな行を追加してモジュールを増やしていきます。
(16) 他の設定ファイルの読み込みを行うための記述です。パスは(2)で指定したServerRootからの相対パスになります。(2)もデフォルトのままであった場合「/etc/httpd/conf.d/*.conf」と一致するファイルを読み出すことになります。
(17) server-statusハンドラが呼び出されたときに出力するステータス情報の仕様を指定するものです。デフォルトはコメントアウトされており、このままで標準的な情報を返す設定になっています。コメントを外し「ExtendedStatus On」にするとFullの情報を返すことになります。
(18) プロセスの所有者を指定します。
【番外編】KeepAliveについて
クライアントとサーバーはTCPという接続方式で通信を行っています。TCPというのは大雑把に言うと接続までに色々な接続準備を行って、その後、目的のデータをサーバーからクライアントに流すということをやっています。
webページというのは、本来ただの1テキストファイルですが、それに付随する形でCSSファイルやJSファイル、画像ファイルなどページを装飾するための色々なファイルが存在します。それらのファイル1つ1つに対してクライアントからサーバーにTCPの接続を毎回繰り返すことになるため、TCP接続のための準備が毎回必要になってきます。この時、サーバーがKeepAliveを有効にしていた場合、TCPの接続を維持したままクライアントからの要求を捌くことができるようになります。
と、ここまで読むと、だったらOnにしておけば良いんじゃない・・・と思いがちですがサーバーは同時に複数のクライアントの相手をします。KeepAliveが有効だった場合、クライアントからの要求が完了した後も しばらくは接続情報をメモリに保存し続けます。同時にアクセスしてくるクライアントが数10件程度の状態であれば特に気にする必要もないのですが、これが100、1000と増えてくるとメモリを無駄に保持し続ける時間がひたすら長くなります。そうなると、そもそもサーバにアクセスする事も叶わず、サーバも快適に処理できなくなるというデメリットを抱えています。
結局どうしたら良いのか
サイトの想定アクセス数が多いのであればOffにしておくのが良いと思います。ただ、Offにしたからと言って安心できるものでもないような気がしています。(とは言え、どうしたら良いのか?というノウハウは私は持ち合わせておりませんm(_ _)m)
アクセスしてくるクライアントが社内のみとか、うちのような小規模なブログサイトなどであればKeepAlive Onにして、Timeoutを数秒に設定するのが良いと思います。運用しながら調整する余裕があるのなら、Timeoutを徐々に小さくしていき、それでもダメならOffにしてしまう。というのが良いのだろうと思います。
トラックバック & ピンバック