このページを正しく表示するにはJavascriptを有効にしてください。
定期的に再起動が必要なほど不安定なApacheをチューニングする
HTTPサーバーが不安定だからといってcrontabへ
```
# 毎朝3時にapacheを再起動
0 3 * * * /etc/init.d/httpd graceful
```
のように書き込んでしまう前に、チューニングで何とかしようという話。
長時間動かしているとApacheサーバーが不安定になる場合についてのTipsです。負荷によって不安定になる場合は別の方法を検討してください。
## Apachが不安定になる原因
Apacheの強制終了、CPU・メモリの異常消費、DBとの接続エラー等といった不安定な挙動が生じる理由として一番に考えられるのは、その上で動かしているプログラム(PHP, Perl等)です。Apache自身は歴史も実績もあり非常に安定しています。偶発的なバグは潜んでいるかもしれませんが、再起動しても継続的に発生するような不具合はまず残っていないと考えていいです。なので疑うべきはCGIやmod_XXXで走るスクリプトです。プログラムのどこかでメモリリークを起こしていたり、解放すべきリソースが解放されず残っていたり…。
これらのバグは原因が特定できれば当然直すべきですが、リークした箇所を特定して改修するというのは相応のスキルと時間が要求されます。明示的なバグとは違ってリークしていても正常に動いてしまうので原因特定が難しいのです。またWordpressを使っていてプラグインや本体にバグが潜んでいた、みたいな状況だとさらに辛さは増してきます。
再起動すれば治るし、手っ取り早く定期的に再起動しよう!みたいなソリューションに行き着くのはある意味仕方ないことです。
ただ実際にやってみると、この「定期的に」というのがあまりスマートな解決策ではない事に気づきます。
* 影響が少ない時間帯(深夜等)を選ばないといけない
* 負荷の上昇や再スタート失敗による影響があるのであまり変なタイミングで出来ない
* チューニングに自由が聞かない
* 1日1回でも不安定になる→1日2回, 4回, 12回…
* 果たして適切なやり方なのか不安になってくる
* 影響が少ない時間帯を避けにくくなる
* アクセスの変動を考慮できない
* 人が多く来てても定時実行しか出来ない
* Apacheの再起動のコスト
* Apacheのプロセスを全て起動し直すというのはコストが高いです
といった感じで定時実行は変動するユーザーがいる環境ではあまり望ましくない解決策です。
## MaxRequestsPerChild
じゃあどうすればよいかというと、```MaxRequestsPerChild```を適切に設定するというのが1つの答えです。
この```MaxRequestsPerChild```というパラメータは、1つのプロセスで何個までリクエストを受け取るかという値を示しています。Apacheは複数の子プロセスを立ち上げて、それぞれがリクエストを捌いていくのですが、この値を0以外にすることで特定リクエスト数毎に子プロセスを殺す事ができるようになります。つまり部分的な再起動をかけられる訳ですね。
この値をチューニングすることでApache自体の定期再実行みたいな怪しい事をしなくても不安定性を解消することが出来ます。やってることはあくまで子プロセスの再起動なので、メモリリークを根本から解決するようなものではないですが、アクセス数に応じた柔軟な再起動が可能になります。
値のチューニング方法としては、
* 現在が0であれば10000に(Apacheのデフォルト値)
* 何か値が既に設定してあるなら半分に
設定して様子を見るのが得策じゃないでしょうか。
この値を下げると子プロセスの再起動する回数が増えるのでCPUへの負荷が増えます。メモリやCPU、コネクションなどの状況を見ながら安定した値を探してみてください。