Apache 2.4 w systemie Windows reaguje powoli, zawiesza się podczas wyświetlania niektórych stron dynamicznych

30

(Znam odpowiedź na to pytanie. Opublikowanie tego tylko w celu udostępnienia odpowiedzi społeczności)

Moje lokalne wystąpienie Apache 2.4 (Windows 7) opóźnia się lub zawiesza się podczas udostępniania niektórych adresów URL, w zależności od przeglądarki, której używam do uzyskania dostępu do tych adresów URL .

W przypadku przeglądarki Firefox / Chrome Apache powoli reaguje na niektóre adresy URL. Powolność pojawia się około 20% czasu na danym adresie URL. Kiedy tak się dzieje, występuje 5-sekundowe opóźnienie, podczas którego Firefox wyświetla stan „Oczekiwanie na ...”.

W przeglądarce Internet Explorer 9 Apache po prostu zawiesza się i przestaje obsługiwać dowolne żądania (w dowolnej przeglądarce), dopóki nie zostanie ponownie uruchomiony.

  • Wydaje się, że dzieje się tak tylko w przypadku żądań dynamicznych (PHP), ale nie wszystkich. W rzeczywistości występuje tylko w jednej określonej witrynie. Inne strony oparte na PHP na tej samej maszynie działają dobrze.
  • Może być znaczące, że problematyczny serwis składa się z dużej liczby subdomen (VirtualHosts).
  • Wyłączenie Zapory systemu Windows i Zapory Comodo nie pomaga.
  • Problem wydaje się występować częściej w przypadku stron „bardziej zajętych” (dodatkowe żądania dotyczące ramek IFRAMES itp.)

Próbowałem wielu zmian httpd.conf(takich jak wyłączenie KeepAlive, EnableMMAP, HostnameLookups), ale nic nie działa.

Tomasz P. Szynalski
źródło
1
Gdy zdobędziesz więcej głosów, zyskasz reputację, aby przenieść odpowiedź na prawdziwą odpowiedź, co powinieneś zrobić. (Jeśli nic więcej, głosowanie zyska wtedy lepszą reputację.)
pjmorse
1
Aby znaleźć ten wpis tutaj przez Google: Poniższe rozwiązanie działa również w przypadku tego błędu: „ (OS 64) Określona nazwa sieci nie jest już dostępna.: AH00341: winnt_accept: Asynchroniczny AcceptEx nie powiódł się. ”. W języku niemieckim: „ (OS 64) Der angegebene Netzwerkname ist nicht mehr verfügbar.: AH00341: winnt_accept: Asynchronous AcceptEx failed. ”.
Uwe Keim,

Odpowiedzi:

35

Odpowiedzi udzielił Thomasz


Rozwiązaniem jest dodanie następujących elementów do httpd.conf:

AcceptFilter http none
AcceptFilter https none

W systemie Windows powoduje to wyłączenie interfejsu API AcceptEx () (część programu WinSock), który oferuje pewne ulepszenia wydajności, ale prawdopodobnie powoduje konflikt z Zaporą Comodo.

Przełączenie Zapory sieciowej Comodo w tryb „Wyłączony” nie pomaga, ponieważ żądania prawdopodobnie nadal przechodzą przez kod sieciowy Comodo. Myślę, że Comodo musiałoby zostać całkowicie odinstalowane, aby wyeliminować problem (chociaż nie próbowałem tego).

Jeśli masz podobny problem z Apache 2.2, powinieneś użyć dyrektywy Win32DisableAcceptEx.

Referencje

Cytowanie z http://httpd.apache.org/docs/2.4/mod/core.html :

Domyślne wartości w systemie Windows to:

AcceptFilter http data

AcceptFilter https data

Window mpm_winnt interpretuje AcceptFilter do przełączania API AcceptEx () i nie obsługuje buforowania protokołu HTTP. Istnieją dwie wartości, które wykorzystują interfejs API Windows AcceptEx () i będą przetwarzać gniazda sieciowe między połączeniami. dane czekają, aż dane zostaną przesłane, jak udokumentowano powyżej, a początkowy bufor danych i adresy punktów końcowych sieci zostaną pobrane z pojedynczego wywołania AcceptEx (). connect użyje API AcceptEx (), pobierze również adresy punktów końcowych sieci, ale jak żadne, opcja connect nie czeka na początkową transmisję danych.

W systemie Windows nikt nie używa accept () zamiast AcceptEx () i nie przetwarza gniazd między połączeniami. Jest to przydatne w przypadku kart sieciowych z uszkodzoną obsługą sterowników, a także niektórych wirtualnych dostawców sieci, takich jak sterowniki VPN, filtry spamu, wirusów lub programów szpiegujących.

Zobacz także: http://forums.comodo.com/help-for-comodo-antivirus/conflict-with-apache-t260.0.html;msg31636#msg31636

Eric Fossum
źródło
1
Mam problemy z IE10 powodujące zawieszanie się Apache2.4 (bez udziału comodo), dopóki usługa nie zostanie ponownie uruchomiona - i zmiana .conf w celu włączenia tych naprawiła to. Dzięki za opublikowanie tego.
matt lohkamp
1
To również działało dla mnie. Zebrałem też więcej referencji na moim blogu, ponieważ informacje na ten temat są obecnie bardzo rozproszone.
Stijn de Witt
3
Pracował dla mnie, Win 7 x64. Zastanawiam się, dlaczego nonenie jest ustawieniem domyślnym w Apache? Większość innych „innowacyjnych” funkcji jest domyślnie wyłączona w Apache: P
rustyx
-1

Używam Apache 2.4.16 na komputerze z systemem Windows 7 Pro, a moja witryna właśnie przestała działać około 2 tygodnie temu. Dodanie tego rozwiązało problem.

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
pluckyduck
źródło
Głosowałem w dół, ponieważ twoja odpowiedź jest dokładnie taka sama jak powyższa autorstwa @Eric Fossum.
hargobind