Apache

Apancheが急に接続できなくなったら

同じ問題を抱えておられる方が多数いらっしゃるので、改めて記事にすることもないのですが、備忘録として記載します。

まずは問題の特定が必要なので、[Apacheインストールフォルダ]/logs/errorファイルを確認します。
[mpm_winnt:warn] [pid xxxx:tid xxx] (OS 64)指定されたネットワーク名は利用できません。
このような記載があったら対処が可能かもしれません。
(利用しているApacheは2.4.16です)

[Apacheインストールフォルダ]/conf/httpd.confを開き、最後の方に次の文を追記します。

<IfModule mpm_winnt>
    ThreadsPerChild        150
    MaxConnectionsPerChild   0
    Win32DisableAcceptEx
</IfModule>

[Apacheインストールフォルダ]/extra/httpd-mpm.confにも同じ記述はありますが、こちらは全体に渡った処理が記載されているので、今回の対処では使わない方が無難でしょう。

各ディレクティブの内容(いずれもhttpd.apache.orgより引用)です。

ThreadsPerChild
このディレクティブは、それぞれの子プロセスで生成される スレッド数を設定します。 子プロセスは開始時にこれらのスレッドを生成して、 その後は生成しません。mpm_winnt のような、 子プロセスが一つしかないような MPM を利用しているのであれば、 この値はサーバの負荷全体を十分取り扱える程度に、 大きくなければなりません。worker のような、 子プロセスが複数あるような MPM を利用しているのであれば、 サーバの通常負荷を十分扱える程度に、 スレッド総数が多くなければなりません。

mpm_winntでの ThreadsPerChild のデフォルト値は 64 で、他の場合は 25 です。

デフォルトは64とありましたが、[Apacheインストールフォルダ]/extra/httpd-mpm.confの記載例に倣って150としました。

MaxConnectionsPerChild
The MaxConnectionsPerChild directive sets the limit on the number of connections that an individual child server process will handle. After MaxConnectionsPerChild connections, the child process will die. If MaxConnectionsPerChild is 0, then the process will never expire.

Setting MaxConnectionsPerChild to a non-zero value limits the amount of memory that process can consume by (accidental) memory leakage.

日本語訳がなかったので英語をそのまま転載しておりますが、最大コネクション数の設定ですね。デフォルトが0(無制限)なので、そのまま採用しています。

Win32DisableAcceptEx
AcceptEx() は Microsoft WinSock v2 API で、場合によっては BSD 形式の accept() API よりもよい性能を発揮します。 よく使われている Windows 製品の中で、特にウィルススキャナや VPN パッケージ の中には、バグが原因で AcceptEx() の適切な動作を妨げるものがあります。 以下のようなエラーに遭遇した場合は、このディレクティブを使用して AcceptEx() を使用しないようにしてください。

こちらが問題解決の本丸ですね。直接的な原因は不明ですが、ウィルス対策ソフトを外すことはできないので、AcceptEx() からaccept()に切り替えるよう指示します。

httpd.confを編集してApacheを再起動すれば問題が解決しているかと思います。
念のため、errorの内容もご確認ください。

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!