Apache 2.4 บน Windows ตอบสนองช้าค้างเมื่อให้บริการบางหน้าแบบไดนามิก


30

(ฉันรู้คำตอบสำหรับคำถามนี้โพสต์สิ่งนี้เพียงเพื่อแบ่งปันคำตอบกับชุมชน)

ท้องถิ่นของฉัน (Windows 7) ตัวอย่างของ Apache 2.4 ประสบการณ์ความล่าช้าหรือแขวนอัพเมื่อให้บริการบาง URL ซึ่งขึ้นอยู่กับเบราว์เซอร์ที่ผมใช้ในการเข้าถึง URL

ด้วย Firefox / Chrome ทำให้ Apache ช้าในการตอบสนองต่อ URL ที่แน่นอน ความเกียจคร้านเกิดขึ้นประมาณ 20% ของเวลาใน URL ที่กำหนด เมื่อเกิดขึ้นจะมีการล่าช้า 5 วินาทีในระหว่างที่ Firefox แสดงสถานะ "กำลังรอ ... "

ด้วย Internet Explorer 9 Apacheจะหยุดและหยุดให้บริการการร้องขอใด ๆ (ด้วยเบราว์เซอร์ใด ๆ ) จนกว่าจะรีสตาร์ท

  • สิ่งนี้ดูเหมือนว่าจะเกิดขึ้นเฉพาะกับคำขอแบบไดนามิก (PHP) แต่ไม่ใช่ทั้งหมด ในความเป็นจริงมันเกิดขึ้นในเว็บไซต์หนึ่งเท่านั้น เว็บไซต์ที่ใช้ PHP อื่น ๆ ในเครื่องเดียวกันทำงานได้ดี
  • อาจมีหรือไม่มีนัยสำคัญว่าเว็บไซต์ที่มีปัญหาประกอบด้วยโดเมนย่อยจำนวนมาก (VirtualHosts)
  • การปิดใช้งานไฟร์วอลล์ Windows และไฟร์วอลล์ Comodo ไม่ได้ช่วย
  • ปัญหาดูเหมือนบ่อยขึ้นกับหน้า "ยุ่ง" (คำขอเพิ่มเติมสำหรับ IFRAMES ฯลฯ )

ฉันได้ลองทำการเปลี่ยนแปลงหลายอย่างhttpd.conf(เช่นปิดใช้งาน KeepAlive, EnableMMAP, HostnameLookups) แต่ดูเหมือนว่าจะไม่ทำงาน


1
เมื่อคุณได้คะแนนมากขึ้นคุณจะมีชื่อเสียงในการย้ายคำตอบไปเป็นคำตอบจริงซึ่งคุณควรทำ (ถ้าไม่มีอะไรอื่น upvotes จะทำให้คุณโด่งดังมากขึ้นแล้ว)
pjmorse

1
สำหรับการค้นหาการโพสต์ที่นี่ผ่านทาง Google: วิธีการแก้ปัญหาด้านล่างใช้งานได้กับข้อผิดพลาดนี้: " (OS 64) ชื่อเครือข่ายที่ระบุไม่สามารถใช้ได้อีกต่อไป: AH00341: winnt_accept: Asynchronous AcceptEx ล้มเหลว " ในภาษาเยอรมัน: " (OS 64) Der angegebene Netzwerkname ist nicht mehr verfügbar.: AH00341: winnt_accept: การยอมรับแบบอะซิงโครนัสล้มเหลว "
Uwe Keim

คำตอบ:


34

ตอบโดย Thomasz


วิธีแก้ไขคือเพิ่มสิ่งต่อไปนี้ในของคุณhttpd.conf:

AcceptFilter http none
AcceptFilter https none

บน Windows สิ่งนี้มีผลในการปิดใช้งาน AcceptEx () API (ส่วนหนึ่งของ WinSock) ซึ่งมีการปรับปรุงประสิทธิภาพบางอย่าง แต่อาจขัดแย้งกับ Comodo Firewall

การวาง Comodo Firewall ในโหมด "ปิดใช้งาน" ไม่ได้ช่วยเพราะคำขอยังคงผ่านรหัสเครือข่ายของ 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 และจะรีไซเคิลซ็อกเก็ตเครือข่ายระหว่างการเชื่อมต่อ ข้อมูลรอจนกว่าข้อมูลจะถูกส่งเป็นเอกสารด้านบนและบัฟเฟอร์ข้อมูลเริ่มต้นและที่อยู่ปลายทางของเครือข่ายจะถูกดึงทั้งหมดจากการเรียกใช้ AcceptEx () เดียว การเชื่อมต่อจะใช้ AcceptEx () API รวมทั้งดึงที่อยู่ปลายทางของเครือข่าย แต่ไม่ชอบตัวเลือกการเชื่อมต่อไม่รอการส่งข้อมูลเริ่มต้น

ใน Windows ไม่มีการใช้ accept () แทน AcceptEx () และจะไม่รีไซเคิลซ็อกเก็ตระหว่างการเชื่อมต่อ สิ่งนี้มีประโยชน์สำหรับอะแดปเตอร์เครือข่ายที่มีการสนับสนุนไดรเวอร์ที่ใช้งานไม่ได้รวมถึงผู้ให้บริการเครือข่ายเสมือนบางรายเช่นไดรเวอร์ VPN หรือตัวกรองสแปมไวรัสหรือสปายแวร์

ดูเพิ่มเติมที่: http://forums.comodo.com/help-for-comodo-antivirus/conflict-with-apache-t260.0.html;msg31636#msg31636


1
ฉันเคยมีปัญหากับ IE10 ทำให้ Apache2.4 (ไม่มีส่วนเกี่ยวข้องกับ comodo) หยุดทำงานจนกว่าจะเริ่มบริการใหม่ - และเปลี่ยน. conf เพื่อรวมสิ่งเหล่านี้ไว้ ขอขอบคุณที่โพสต์สิ่งนี้
matt lohkamp

1
สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน ฉันยังรวบรวมการอ้างอิงเพิ่มเติมในบล็อกของฉันเนื่องจากข้อมูลเกี่ยวกับหัวข้อนี้กระจัดกระจายมากในขณะนี้
Stijn de Witt

3
ทำงานให้ฉันชนะ 7 x64 ฉันสงสัยว่าทำไมnoneการตั้งค่าเริ่มต้นใน Apache ไม่ใช่? คุณสมบัติ 'นวัตกรรม' อื่น ๆ ส่วนใหญ่จะถูกปิดการใช้งานโดยค่าเริ่มต้นใน Apache: P
rustyx

0

ฉันใช้ Apache 2.4.16 ในกล่อง Windows 7 Pro และเว็บไซต์ของฉันหยุดทำงานเมื่อประมาณ 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

ลงคะแนนเนื่องจากคำตอบของคุณเหมือนกับที่อยู่ด้านบนโดย @Eric Fossum
hargobind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.