作成開始 : 平成24年07月07日(土) 最終更新 : 平成24年07月08日(日)

Windows版 Apache2 を調整してみた。


1.背景

SEとしてかかわっているあるお客様のWebサーバーがある時からたまに挙動がおかしくなる時がある。導入から2〜3年は特に目立った異常もなく動いていた。
プロセスとしては動いているのだが、レスポンスを返してこなくなってしまうのだ。

クライアントから見るとだんだんと応答が遅くなり、Internal server error 500、そして完全に利用できませんになるようだ。

その都度、Apacheをコンソールから手動で停止・起動したりOSごと再起動したりしている。

OSは、Windows Server 2003 R2 で Apache2、PHP、ActivePerl、OracleDatabase、Oracle Client などで構成されている。
導入から今年8月でまる5年になる。
サーバー専用機なのでスペックは申し分ない。

Apacheのエラーログを見ると次のようなのが何度か出ていて、応答が無くなる前は多発していたようだ。
ただ、OS自体はCPU使用率も低いし、メモリリークもなく非常に元気なのだ。
[Tue Feb 14 17:40:46 2012] [notice] Parent: child process exited with status 3221225477 -- Restarting.
[Tue Feb 14 17:40:47 2012] [notice] Apache/2.0.61 (Win32) PHP/4.4.7 configured -- resuming normal operations
[Tue Feb 14 17:40:47 2012] [notice] Server built: Sep 5 2007 09:55:35
[Tue Feb 14 17:40:47 2012] [notice] Parent: Created child process 2444
[Tue Feb 14 17:40:47 2012] [notice] Child 2444: Child process is running
[Tue Feb 14 17:40:47 2012] [notice] Child 2444: Acquired the start mutex.
[Tue Feb 14 17:40:47 2012] [notice] Child 2444: Starting 250 worker threads.
[Tue Feb 14 17:40:49 2012] [notice] Parent: child process exited with status 3221225477 -- Restarting.
[Tue Feb 14 17:40:49 2012] [notice] Apache/2.0.61 (Win32) PHP/4.4.7 configured -- resuming normal operations
[Tue Feb 14 17:40:49 2012] [notice] Server built: Sep 5 2007 09:55:35
[Tue Feb 14 17:40:49 2012] [notice] Parent: Created child process 2700
[Tue Feb 14 17:40:49 2012] [notice] Child 2700: Child process is running
[Tue Feb 14 17:40:49 2012] [notice] Child 2700: Acquired the start mutex.
[Tue Feb 14 17:40:49 2012] [notice] Child 2700: Starting 250 worker threads.
あぁ、Apache、PHPのバージョンが古いのは稼働しているWebアプリケーションが最新に対応していないためだ。
これに対応するには、アプリケーションの全数テストとソースコードの改修を要するためそれ相当の費用がかかるので・・・。
調べると・・・WindowsではMaxRequestsPerChildをゼロにしていても、なぜか勝手に子プロセスが再起動することがある。
(Parent: child process exited with status 3221225477 -- Restarting.)
その時に子プロセスの終了に失敗すると子プロセスを起動できずに親プロセスごと停止してしまうことがある。・・・などという記事があった。
また、httpd.confでのログ記載方法によってメモリリークを引き起こすとか、アプリのソースコード階層が深すぎて異常起こすとか、その他諸々の記事が見つかったがどれも決定的な対策がとられているものは見つけることができなかった。

2.対応策

(1)ログ・ローテートの周期を短くしてみた。
タスクによるログのローテートを月一回 -> 週一回にしてApache リフレッシュの機会を増やしてみた。
ログのローテートはずっと前に作りっぱなしだとログファイルが肥大化してApacheが動かなくることを避けるためにやってみたものだ。
Windows版 Apache のログ・ローテートは色々考えられると思うが、vbsにより対処してみた。

 ↑
これは、月に一度1日の0:01の設定である。
これを、週に一度、土曜日の0:01にしてみた。
※残念ながら2ヶ月後に現象再発してしまった。よって当初設定に戻した。
(2)タスクでOS再起動してみた。
OS再起動後、しばらくは安定動作していたのでタスクにより第2、第4 土曜日の 00:01にOS再起動を設定した。
shutdow.exe
使用法: c:\WINDOWS\system32\shutdown.exe [-i | -l | -s | -r | -a] [-f] [-m \\コンピュータ名] [-t xx] [-c "コメント"] [-d up:xx:yy]

引数なし このメッセージを表示します (-? と同じです)
-i GUI インターフェイスを表示します。このオプションは最初に指定する必要があります
-l ログオフ (-m オプションとは併用できません)
-s コンピュータをシャットダウンします
-r コンピュータをシャットダウンして再起動します
-a システム シャットダウンを中止します
-m \\コンピュータ名 シャットダウン/再起動/中止するリモート コンピュータの名前です
-t xx シャットダウンのタイムアウトを xx 秒に設定します
-c "コメント" シャットダウンのコメントです (127 文字まで)
-f 実行中のアプリケーションを警告なしに閉じます

-d [u][p]:xx:yy シャットダウンの理由コードです
u = ユーザー コード
p = 計画されたシャットダウンのコード
xx = 重大な理由コード (255 以下の正の整数)
yy = 重大ではない理由コード (65535 以下の正の整数)
コメントや理由コードの指定もできる。
※しばらくもっていたが残念ながら、タスクによるOS再起動から5日目で現象発生したことがあった。OS再起動も不十分であることがわかった。
 このタスク設定は無効にした。こうなると、Apacheのレスポンスが無応答の時にApacheを停止・起動するとかしかないなぁー
(3)Apacheが応答しない時に停止・起動する。
これを設定するにあたっては次の記事を参考にした・・・・っていうか、まんまです。すいません。
http://www.mc6800.org/PHP-BIN/F_STYLE/READ.PHP?key=1304943298&st=3&to=53
http://fdays.blogspot.jp/2009/02/windows.html
Perlで書こうか、PHPで書こうか検討した結果、PHPとバッチファイルの組み合わせで書くことにした。
構成は次のとおりだ。
a.httpd_responce_check.bat
単にパラメータ付で httpd_responce_check.bat を呼び出している。
c:\php\php.exe -n -f c:\tmp\httpd_responce_check.php
b.httpd_responce_check.php
c.restart.bat
上記の組み合わせで検証環境でテストしてみたが動作良好だったので、実機にセットした。
そして、以下のように 10分ごとに httpd_responce_check.bat を呼び出すようにした。

 ↑
スケジュールの詳細設定だ。

3.経過観測

Apcaheの監視・停止・起動を平成24年07月06日(金)に設定した。
効果のほどを経過観測していくことにする。・・・・だけど、次期案件でもしかしたらサーバー機がWindows Server 2008 R2、WebサーバーはIISかApacheの最新、PHPの最新になってしまうかもしれない。
しかし、費用の関係で現環境を仮想化することになるのかも・・・・仮想化だとこの設定がうまくいけば使えるなぁーーー

戻る

サイトトップへ