(我知道这个问题的答案。发布此帖只是为了与社区分享答案)
我的本地(Windows 7)Apache 2.4 实例体验延误或者提供某些 URL 时会挂断,具体取决于我使用哪种浏览器访问这些 URL。
借助 Firefox/Chrome,Apache反应迟钝在某些 URL 上。任何给定 URL 上大约有 20% 的时间会出现缓慢现象。当这种情况发生时,会有 5 秒的延迟,在此期间 Firefox 会显示“正在等待...”状态。
使用 Internet Explorer 9,Apache 直接挂起并停止处理任何请求(使用任何浏览器),直到重新启动。
- 这似乎只发生在动态 (PHP) 请求中,但并非所有请求都会发生。事实上,它只发生在一个特定的网站上。同一台机器上的其他基于 PHP 的网站运行正常。
- 有问题的站点由大量子域名(VirtualHosts)组成,这一点可能很重要,也可能不重要。
- 禁用 Windows 防火墙和 Comodo 防火墙没有帮助。
- 该问题似乎在“较繁忙”的页面上更频繁出现(对 IFRAMES 的额外请求等)。
我尝试了许多更改httpd.conf
(例如禁用 KeepAlive、EnableMMAP、HostnameLookups),但似乎没有任何效果。
答案1
Thomasz 回答
解决方案是将以下内容添加到您的httpd.conf
:
AcceptFilter http none
AcceptFilter https none
在 Windows 上,这会禁用 AcceptEx() API(WinSock 的一部分),从而提供一些性能改进,但可能与 Comodo 防火墙冲突。
将 Comodo 防火墙设置为“禁用”模式没有用,因为请求可能仍会经过 Comodo 的网络代码。我认为必须完全卸载 Comodo 才能消除此问题(尽管我还没有尝试过)。
如果您在使用 Apache 2.2 时遇到类似问题,则应使用 Win32DisableAcceptEx 指令。
参考
引自http://httpd.apache.org/docs/2.4/mod/core.html:
Windows 上的默认值为:
AcceptFilter http data
AcceptFilter https data
Window 的 mpm_winnt 解释 AcceptFilter 以切换 AcceptEx() API,并且不支持 http 协议缓冲。有两个值使用 Windows AcceptEx() API 并将在连接之间循环使用网络套接字。data 等待直到数据已按上述方式传输,并且初始数据缓冲区和网络端点地址均从单个 AcceptEx() 调用中检索。connect 将使用 AcceptEx() API,还会检索网络端点地址,但与 none 不同,connect 选项不会等待初始数据传输。
在 Windows 上,none 使用 accept() 而不是 AcceptEx(),并且不会在连接之间回收套接字。这对于驱动程序支持损坏的网络适配器以及某些虚拟网络提供商(如 vpn 驱动程序或垃圾邮件、病毒或间谍软件过滤器)非常有用。
答案2
我在 Windows 7 Pro 机器上运行 Apache 2.4.16,我的网站大约 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