Apache 在局域网上其他计算机上的速度比在本地主机上慢

Apache 在局域网上其他计算机上的速度比在本地主机上慢

我有几台计算机连接到网络。网络内有一台服务器,托管 WAMP(Windows + Apache + PHP + MySQL)。上面安装了 Windows 7 x32 Pro。我可以从无线连接的服务器 ping 该服务器,所有 ping 都是 1ms。有趣的是,当我在服务器上浏览我的 Web 应用程序时,它会在眨眼间加载。我可以浏览子页面,就像浏览我刚刚切换的图像一样。

然而在其他电脑上,它运行得更慢。这不是悲剧,但明显变慢了。在某些情况下,浏览器显示“正在等待…”,这需要一两秒钟,这是最痛苦的。

我发现当我通过远程桌面连接时,在服务器上使用应用程序比在任何其他计算机上使用应用程序要快得多。如果我能在它们上获得同样的效果,那就太棒了。

当我查看 chrome 中的开发者控制台时,我可以看到:服务器上的 DOMContentLoaded 时间为 400-600ms,而其他每台计算机上的 DOMContentLoaded 时间为 1400ms。

在这种情况下我能做什么?

答案1

Off确保在 Apache 中将HostnameLookups 设置为。

您说服务器通过 WAMP(Windows 版 LAMP)设置运行 Apache,对吗?如果是这样,请打开httpd.conf或(完全取决于它在您的设置上的安装方式;两个文件基本相同)并在其中apache2.conf查找配置行。默认情况下设置为,如注释中所述,该注释应位于该文件中的设置正上方;粗体强调是我的:HostnameLookupsHostnameLookupsOffHostnameLookups

HostnameLookups:记录客户端的名称或仅仅是他们的 IP 地址,例如 www.apache.org(开启)或 204.62.129.132(关闭)。默认设置为关闭,因为如果人们有意识地打开此功能,对网络来说总体上会更好,因为启用它意味着每个客户端请求将导致至少一次向名称服务器的查找请求。

还有Apache 官方文档也进行了更深入的细节介绍;再次强调这是我的粗体:

默认设置为关闭,以便节省那些不需要进行反向查找的站点的网络流量。对于最终用户来说,这也更好,因为他们不必忍受查找所带来的额外延迟。负载较重的站点应该关闭此指令,因为 DNS 查找可能需要相当长的时间。

不要使用主机名作为Allow from/Deny from指令。

另外,您是否有任何使用 Apache Basic Auth 的目录或指令?Apache 中可以设置的简单密码保护是什么?我记得在某些情况下,与Allow from诸如 之类的字段相关的主机名查找速度会减慢Allow from localhost。注释掉Allow from localhost或将其设置为Allow from 127.0.0.1 ::1然后重新启动 Apache 可以解决该问题。

正如解释的那样Apache 官方文档即使HostnameLookups设置为在/指令Off中使用完整主机名也会触发一整条 DNS 查找链,从而可能减慢访问速度;粗体强调是我的:Allow fromDeny from

名称匹配或以此字符串结尾的主机允许访问。仅匹配完整组件,因此上述示例将匹配 foo.apache.org,但不会匹配 fooapache.org。此配置将导致 Apache 对客户端 IP 地址执行双重反向 DNS 查找,无论 HostnameLookups 指令的设置如何。它将对 IP 地址执行反向 DNS 查找以查找关联的主机名,然后对主机名执行正向查找以确保它与原始 IP 地址匹配。只有正向和反向 DNS 一致且主机名匹配时,才会允许访问。

博客文章也很好地解释了这一点如果您想了解更多有关Allow from/Deny from条目中包含主机名(而不是原始 IP 地址)的详细信息,则会因为多次 DNS 查找而减慢 Apache 访问速度:

但是,我最近遇到了一种情况,我们无意中做了同样的事情,而没有明确启用 HostnameLookups。怎么做到的?通过基于远程主机名限制访问!阅读“A(部分)域名”部分下有关 Allow 指令的文档:

此配置将导致 Apache 对客户端 IP 地址执行双重反向 DNS 查找,无论 HostnameLookups 指令的设置如何。它将对 IP 地址执行反向 DNS 查找以查找关联的主机名,然后对主机名执行正向查找以确保它与原始 IP 地址匹配。只有正向和反向 DNS 一致且主机名匹配时才允许访问。这完全合理,但使用类似以下方法可能会产生很大的意外副作用:

Allow from .example.com

在我们的案例中,这是一个更不明显的情况,我们根本没有想到主机名:

Allow from localhost

这里写成 localhost 可能是为了节省一些精力,或者可能是为了比写出 127.0.0.1 (IPv4) 和 ::1 (IPv6) 更清晰。在心理上,我们很容易将“localhost”视为 127.0.0.1 和 ::1 的直接别名,以至于我们忘记了“localhost”这个名称只是一种约定,需要像任何其他名称一样进行查找。熟悉 MySQL 数据库的人可能知道,它实际上为“localhost”一词赋予了特殊的混淆含义,以建立 UNIX 套接字连接,而不是与 127.0.0.1 或系统上定义的“localhost”建立 TCP 连接!

您可能还认为查找 127.0.0.1 很快,因为它通常映射到 /etc/hosts 中的“localhost”。没错,但其他不在 /etc/hosts 中的访问者都会获得缓慢的 DNS PTR 查找!并且根据操作系统的不同,您可能会在 /etc/hosts 中看到“ip6-localhost”或“ip6-loopback”(Debian 7、Ubuntu 12.04)、“localhost6”(RHEL 5/6、Fedora 19)或其他内容。因此,拼写地址很重要:

Allow from 127.0.0.1
Allow from ::1

这样做会立即停止隐式 HostnameLookups 行为并加快网站速度。在这种情况下,这不是问题,因为它是一个私人的内部网站,任何未经防火墙允许的人都无法访问,所以流量水平相对较低。这种访问控制是 localhost 首先需要被允许的部分原因。但由于服务流量变慢,这在公共生产系统上会非常糟糕。

相关内容