■default ---■fontsize --70% --80% --100% --120% --140% --- --■scroll_switch

Apacheの接続が不安定になる解決メモ

Windowsで
Server Version: Apache/2.4.10 (Win32) PHP/5.6.2
の状態で、普段さくさくつながっていたのに急に20秒くらい待機させられるようになってしまった。
おまけに一回止まると誰がアクセスしても止まる。とくにIEでアクセスするとよくそうなる。
初めはPHPのプログラムが下手すぎてダメかと思ったけど、あまりCPUとかメモリとか使っている様子は無い。
Apacheの方かと思い、インターねっとっとで調べると、
チューンアップ的なことが書いてあったので、試してみた。
けどダメだった。
Apacheの設定などはlinxでの説明が多いのでWindows版の事はあまり触れられていない。
httpd-mpm.conf の
< IfModule mpm_event_module >
というコンフィグを使うのがデフォルトということらしいのですが、まあさっぱり分からないし
どうもそこは関係ない様子。

httpd.confの
LoadModule status_module modules/mod_status.so
LoadModule info_module modules/mod_info.so
の#をはずして
http://サーバーネーム/server-status
にアクセスするとApacheの状態が見れます。
そうすると
Server Version: Apache/2.4.10 (Win32) PHP/5.6.2
Server MPM: WinNT
Apache Lounge VC10 Server Built: Jul 19 2014 11:02:31
と書いてあって、どうやらMPMというのはWinNTというのを使っているらしい。
MPMとは何なのか。MGMなら近くのパチンコやだけど関係ないと思う。
MMRはRの位置が違う。
なので、<IfModule mpm_event_module >に書いてあることをいくら変えても無意味。
設定の変更の仕方も分からない。

logsというフォルダにerror.logがあるので、それを見てみたら、
というか見ようとしたら4GBもあったので、難じゃこりゃと思って、開けないし、
access.logも50MBもあるし、めんどくせーと思ってどっちも消しました。
消しても、すぐ新しいのが勝手にできるので大丈夫でした。
きっとこのfileの肥大化?肥大症?が原因で遅くなって他に違いない。
と思ったら、全然改善しない。
新しいerror.logをみたら、

[Fri Feb 06 19:01:21.020893 2015] [mpm_winnt:warn] [pid 5220:tid 696] (OS 64)指定されたネットワーク名は利用できません。 : AH00341: winnt_accept: Asynchronous AcceptEx failed.
[Fri Feb 06 19:07:35.415435 2015] [mpm_winnt:warn] [pid 5220:tid 696] (OS 64)指定されたネットワーク名は利用できません。 : AH00341: winnt_accept: Asynchronous AcceptEx failed.

というエラーが出ていました。
他にもいろいろ書いてあるのですが、[mpm_winnt:notice]というのが多くて、どうでもいい情報が書かれている様子。
[mpm_winnt:warn] というのがやばそうな直感なので、急に日本語使ってるし、これをネットで調べてみたら、
ステファンという天才外人が直し方を書いていた。

まず、httpd.confの1行だけ
#Include conf/extra/httpd-mpm.conf
のシャープをはずす。

httpd-mpm.conf の4行。
< IfModule mpm_winnt_module >
ThreadsPerChild 150
MaxConnectionsPerChild 0
< /IfModule >

< IfModule mpm_winnt_module >
ThreadsPerChild 150
MaxConnectionsPerChild 0
AcceptFilter http none
AcceptFilter https none
EnableSendfile off
EnableMMAP off
< /IfModule >
に書き足し

ちなみに、Apache2.2のばあいは
Win32DisableAcceptEx
というのを書くらしいのですが、それだとApacheが立ち上がらないので、
2.4の場合はこうらしいです。
意味はさっぱり分かりません。
ThreadsPerChild 150 #は子プロセスにスレッドをいくつ割り当てるかみたいな意味のようですが、だからなんなんでしょう。ちなみに私は100にしています。
MaxConnectionsPerChild 0 #は処理限界みたいな。0だと無制限らしいです。ただより高いものはなし。ちなみに私は10000にして有ります。根拠は無いです
AcceptFilter http none #恐らくこれが利いているようです。多分Windowsのネットワーク特有のやつを無視するみたいな。
AcceptFilter https none
EnableSendfile off #と書かれている割にはファイルのアップロードやダウンロード処理はできます。
EnableMMAP off #マジで分からん5秒前。

ちなみに私は
ThreadStackSize 8388608
という1行も追加しています。なんかPHPのメモリを確保しておくみたいな感じらしいです。
効果の程は全く分かりません。
------------------
とりあえず、
[Fri Feb 06 19:01:21.020893 2015] [mpm_winnt:warn] [pid 5220:tid 696] (OS 64)指定されたネットワーク名は利用できません。 : AH00341: winnt_accept: Asynchronous AcceptEx failed.
というエラーは無くなって、変なとまり方もする事はなくなった。
どんな弊害が待ち構えているかはノーバデーノーズである。



スポンサーサイト



ブログ内検索ワード
マジック / フラリッシュ / デザイン / ~のコツ / プログラム関連 /