2007年8月29日水曜日

Apacheのhttpd.confの設定

恐らくサーバ管理に初めて触れる人が最初に悩むであろうApacheの設定ファイル、httpd.confの中にある各項目の意味。正確な意味よりも現場的な意味を重視して書いてみた。

Timeout

■KeepAlive

Sessionを維持するか否か。
mod_perl環境ではoffにするらしいが理由不明。

MaxKeepAliveRequests
KeepAlive設定が無効であればこの設定も無効

KeepAliveTimeout
KeepAlive設定が無効であればこの設定も無効

StartServers
Apache起動時に立ち上がるApache子プロセス数。MinSpareServersと同じ値にするのが一般的。
「公開と同時にユーザがどかっと来るけどその後は落ち着く」的なサイト以外MinSpareServersと違う値を設定する理由が思いつかない。

MaxClients
Apacheプロセスが支える最大接続数(最大同時接続数)。Apache管理の最大のキモ。
この値の算出方法はApache MaxClientsの算出計算式を参照。
なお一般的なWeb(何を基準に一般的かは不明)では下記の比率を以下の様にするのがいいらしい
MaxClients : MinSpareServers : MaxSpareServers
10 : 1-3 : 3-5

MinSpareServers
待機Apache子プロセスの下限設定。
大気Apache子プロセスがこの数より少なくならない様にする。
待機Apache子プロセスがこれを下回るとこの数まで増やす。
基本的にあまり高い値を設定する意味がない項目。
急激なアクセスの増加や、常に高いアクセス数が予想されるのであれば少し多めの値にしておいた方が良い。

MaxSpareServers
待機Apache子プロセスの上限設定。待機Apache子プロセスがこれを上回ると、この数まで減らす。
減らすのは多分最終アクセスが古いモノから落としていくっぽい(未確認)。
想定されるアクセス数が大して多くなく、急激なアクセス数の変化が予想されないのであればここの値は余り大きくしない。無闇に待機プロセスを作成して無駄な負荷をサーバに掛けない方が良い。
なおこの上限は基本的にApacheが動作しているPCのメモリ量により左右される。
メモリからDataが溢れる程の値にするとHDDにスワップが発生し異常に重くなり、ユーザ側に反応が殆ど返らなくなる。
そんな位になるのであれば、多少サーバが重いなとユーザに感じさせてもいいからスワップが発生しない値まで下げた方がいい。


MaxRequestsPerChild
Apache子プロセス一個辺りの処理可能リクエスト数。別の言い方をするとRequestの数で数えたApache子プロセスの寿命。
ここで設定された値になるとそのApache子プロセスが終了する。
Apache、ライブラリ、モジュール等サーバで動作しているプログラムのバグなどによって発生するメモリリークへの対応策として、この値を小さくするという手段が用いられる。
メモリリークとは簡単に言えば時間に比例して使用メモリ量が増えていく事。そのメモリリークの影響を出来るだけ抑える為にある程度仕事をしたApache子プロセスを終了し、新しいApache子プロセスを生成する。色々問題が起きてるWindowsが再起動するとあっさり治ってるのと同じ感覚かもしれない。
動作しているプログラムのメモリリークバグの量にもよるが、バグが多ければ比較的少ない値を。バグが少なければ大きな値を。安定しているサーバであればこの部分を10000とかに設定している所もあるらしいが微妙に信じられん・・・。
なお無闇に小さい値を設定すると子プロセスの再起動が頻発し、その再起動がサーバ負荷になり逆に重くなってしまうので注意。
また値としてゼロを指定出来るが、その場合はそのプロセスが延々と動き続ける事となり、万が一メモリリークが発生した場合肥大化してサーバをダウンさせる事になる。
メモリリークの現象を確認したら適切な値を設定する。出来れば自分の鯖でApach子プロセス群の状態を見て、適正な値を設定すべし。当然メモリリークの原因を突き止めて対処もしましょう。


■■■参考URL■■■
http://www.mylab.jp/diary/20031205.html
http://hori-uchi.com/archives/000209.html
http://www.networkworld.jp/server/-/11189.html
http://www.atmarkit.co.jp/flinux/rensai/apache2_03/apache03a.html

まず最初に重要なのは搭載メモリ量に見合ったClient数を設定する事。
そして次にサイトの特性とユーザのアクセス形式(ユーザからのRequestが沢山短いか、少なく長いか)によってMinSpareとMaxSpareを調整。
コメントを投稿