显然,我的 Apache httpd 实例正在为每个传入客户端连接的 IP 地址进行反向 DNS(RDNS,给我这个 IP 地址的主机名)查找。这是不好的。特别是因为有时在 28 秒后解析会因缺少 PTR 记录而失败。
诊断:我添加%D
到我的“组合”日志样式中,并以这种方式查看响应时间:对于所有使用其主机名记录的那些,显然 <1s,对于那些记录其 IP 的那些,显然是 20+s。
这是我尝试过的:
- 关闭
server-status
扩展程序。 - 检查
HostnameLookups Off
是否在配置中。 - 检查在/规则
mod_access
中没有给出任何主机名。Allow
Deny
- 检查反向代理服务器是否遵循相同的规则。
我错过了什么?
似乎标准的 Ubuntu 8.04 Apache httpd 安装附带了一个以执行客户端 IP 的 RDNS 查找的
LogFormat
开头。%h
为什么哦为什么??将其替换为%a
(远程 IP 地址,请参阅自定义日志格式)可减少此问题。90%。有的还...您是否已验证
HostnameLookups
未在任何其他指令中设置?您是否激活了模块 mod_authz_host?我偶然发现了同样的问题,我发现了反向查找的另一个来源:应用程序本身!PHP具有以下
gethostbyaddr()
功能:http://php.net/manual/en/function.gethostbyaddr.php
有趣的是,我刚刚在我的一台服务器上遇到了类似的问题。问题开始于我运行命令行 PHP 脚本扫描日志文件以查找最高 IP 地址的时间。然后我让 PHP 对每个 IP 地址执行反向 DNS 查找。就在我这样做的时候,我注意到 Apache 突然开始将主机名而不是 IP 地址转储到日志中。从 %h 切换到 %a 并重新启动 Apache 似乎已经解决了这个问题。HostnameLookups 设置为关闭。我的猜测是,如果碰巧在缓存中对 IP 进行反向查找,Apache 只会使用本地缓存的结果。也许?无论是那个还是这个都是服务器中的一个错误。