web-dev-qa-db-ja.com

Windows上のApache 2.4の応答が遅く、一部の動的ページを提供するとハングする

(この質問への回答はわかっています。回答をコミュニティと共有するためだけに投稿します)

Apache 2.4のローカル(Windows 7)インスタンスでdelaysまたは一部のURLを処理するときにハングアップします(これらのURLへのアクセスに使用するブラウザーに応じて

Firefox/Chromeでは、Apacheは特定のURLでは応答が遅いです。任意のURLで約20%の確率で速度が低下します。発生した場合、Firefoxが「待機中...」ステータスを表示するまで5秒の遅延があります。

Internet Explorer 9では、Apacheは単にハングしますであり、再起動するまで(任意のブラウザーで)要求の処理を停止します。

  • これは動的(PHP)リクエストでのみ発生するようですが、すべてではありません。実際には、1つの特定のサイトでのみ発生します。同じマシン上の他のPHPベースのサイトは正常に動作します。
  • 問題のあるサイトが多数のサブドメイン(VirtualHosts)で構成されていることが重要な場合とそうでない場合があります。
  • WindowsファイアウォールとComodoファイアウォールを無効にしても効果はありません。
  • この問題は、「ビジー」ページ(IFRAMESなどの追加リクエスト)でより頻繁に発生するようです。

httpd.confに多くの変更(KeepAlive、EnableMMAP、HostnameLookupsを無効にするなど)を試みましたが、何も機能しないようです。

30

Thomaszによって回答


解決策は以下をhttpd.confに追加することです:

AcceptFilter http none
AcceptFilter https none

Windowsでは、これはAcceptEx()API(WinSockの一部)を無効にする効果があり、パフォーマンスは向上しますが、Comodo Firewallと競合する可能性があります。

Comodoファイアウォールを「無効」モードにしても、要求はおそらくComodoのネットワークコードを通過するため、役に立ちません。問題を解消するには、Comodoを完全にアンインストールする必要があると思います(私は試していません)。

Apache 2.2で同様の問題がある場合は、代わりにWin32DisableAcceptExディレクティブを使用する必要があります。

参考文献

http://httpd.Apache.org/docs/2.4/mod/core.html からの引用:

Windowsのデフォルト値は次のとおりです。

AcceptFilter http data

AcceptFilter https data

ウィンドウのmpm_winntはAcceptFilterを解釈してAcceptEx()APIを切り替え、httpプロトコルのバッファリングをサポートしません。 Windows AcceptEx()APIを利用する2つの値があり、接続間でネットワークソケットをリサイクルします。データは、上記のようにデータが送信されるまで待機し、初期データバッファーとネットワークエンドポイントアドレスはすべて、単一のAcceptEx()呼び出しから取得されます。 connectはAcceptEx()APIを使用し、ネットワークエンドポイントアドレスも取得しますが、他とは異なり、接続オプションは最初のデータ送信を待機しません。

Windowsでは、どれもAcceptEx()ではなくaccept()を使用せず、接続間でソケットをリサイクルしません。これは、ドライバーがサポートされていないネットワークアダプターや、VPNドライバーなどの仮想ネットワークプロバイダー、スパム、ウイルス、スパイウェアのフィルターに役立ちます。

参照: http://forums.comodo.com/help-for-comodo-antivirus/conflict-with-Apache-t260.0.html;msg31636#msg31636

35
Eric Fossum

私はWindows 7 ProボックスでApache 2.4.16を実行していますが、私のWebサイトは約2週間前に機能しなくなりました。これを追加することで問題が修正されました。

ServerRoot "C:/Program Files (x86)/Apache Software Foundation/Apache2.4"

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen XX.XX.XX.XX:80
Listen 80
AcceptFilter http none
AcceptFilter https none
0
pluckyduck