我的 Intranet 中有许多计算机位于同一个子网中,通过集线器连接。子网中的所有计算机都从路由器的内置 DHCP 获取 IP。此外,所有计算机都从同一个路由器获取 Internet 连接。
我在一台计算机( )上安装了 Internet 服务器192.168.0.67
,位于同一子网中。它安装了 Windows XP、Apache、MySQL 和 Perl。网站在 中加载完美localhost
。当我尝试在192.168.0.100
装有 Windows 7 的客户端计算机(IP )上加载该网站时,即使是一个简单的页面也需要 5-10 分钟才能加载。但是,当我从 Internet 加载网站时,加载速度很快。无论我使用哪种浏览器,速度都非常慢。我在两台计算机上都禁用了 Windows 防火墙和防病毒软件。
当我检查taskmgr
网络负载时,它消耗了大约 0.1-0.2%。在性能选项卡中,CPU 使用率约为 10%,两台电脑都有足够的内存
当我ping
使用低负载时,它表现良好。但是当我使用高负载(高于 ping server -l 15000
)ping 服务器时,许多数据包丢失。
答案1
Off
确保在 Apache 中将HostnameLookups 设置为。
您说服务器正在运行 Apache,对吗?如果是这样,请打开httpd.conf
或apache2.conf
(完全取决于它在您的设置中的安装方式;两个文件基本相同)并在HostnameLookups
其中查找配置行。默认情况下HostnameLookups
设置为Off
,如注释中所述,该注释应位于该文件中的设置正上方HostnameLookups
;粗体强调是我的:
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 from
Deny 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 首先需要被允许的部分原因。但由于服务流量变慢,这在公共生产系统上会非常糟糕。
答案2
Windows XP 增加了客户端操作系统的最大活动连接数限制(我认为这个数字是 10,但我不完全确定这个数字)。这意味着如果您在该机器上运行服务器,并且与系统的连接数超过该数量,则您的许多客户端将不得不等待,直到前一个客户端准备就绪。
您可能应该用其他系统替换 Windows XP,这样就可以解决问题 - 即使是在相同的硬件上。