apache本身不缓存dns解析结果,每次连接均调用系统resolver实时解析;排查重点在于系统级缓存服务(如systemd-resolved、dnsmasq、nscd)及代理连接复用机制,而非apache自身。

Apache 本身不缓存 DNS 解析结果,但代理请求(如使用 mod_proxy)时的域名解析行为受底层系统 resolver 和中间层服务影响。排查 DNS 解析缓存问题,关键不是查 Apache 自身,而是定位它在发起反向代理连接前,实际使用的 DNS 解析路径及其中可能驻留缓存的环节。
确认 Apache 是否启用 DNS 缓存机制
Apache 默认每次建立后端连接时都调用系统 getaddrinfo() 或 gethostbyname() 进行实时解析,不内置 DNS 缓存。除非你显式启用了 ProxyPreserveHost Off 且配合了第三方模块(如 mod_proxy_balancer 的某些扩展),否则不存在 Apache 层面的 DNS 缓存。
- 检查配置中是否含
ProxySet disablereuse=off或ProxySet keepalive=On:这类设置可能复用已有连接,从而“绕过”重复解析,造成“看似缓存”的假象 - 查看是否加载了非标准模块(如自定义 DNS resolver 模块),主流发行版默认 Apache 不含此类功能
- 若使用
ProxyPass指向域名(如ProxyPass /app http://backend.example.com/),解析发生在 Apache worker 进程首次连接时,后续复用连接则不再解析
检查系统级 DNS 解析链路中的缓存服务
Apache 发起的解析最终由 glibc resolver 调用,其行为受 /etc/nsswitch.conf 和本地缓存服务控制。真正可能缓存 DNS 结果的是以下服务:
-
systemd-resolved:若启用,
/etc/resolv.conf通常指向127.0.0.53。运行resolvectl statistics查看缓存命中数;执行sudo systemd-resolve --flush-caches清除 -
dnsmasq:常用于本地 DNS 缓存或 DHCP 服务。检查是否运行:
sudo systemctl is-active dnsmasq;重启即可清空:sudo systemctl restart dnsmasq -
nscd:专为名称服务(hosts、DNS)提供缓存。运行
sudo nscd -g | grep hosts查看状态;清除 hosts 缓存:sudo nscd -i hosts
验证 Apache 实际解析行为与结果
不能只依赖 curl 或浏览器测试,需模拟 Apache 的解析上下文:
- 用
getent hosts backend.example.com测试完整解析链(触发 nsswitch + resolver),比nslookup更贴近 Apache 行为 - 临时修改
/etc/hosts添加测试条目(如192.168.1.100 backend.example.com),重启 Apache 后观察代理是否生效——若生效,说明未走 DNS,而是被files优先匹配 - 开启 Apache debug 日志:
LogLevel proxy:trace8,查看 error_log 中是否出现connecting to backend.example.com及对应 IP,确认解析结果和时机
规避解析缓存影响的配置建议
若业务对 DNS 变更敏感(如蓝绿发布、服务发现),应主动避免依赖系统缓存:
- 在
ProxyPass中直接使用 IP 地址而非域名,彻底绕过解析(需配合健康检查或外部服务发现) - 禁用
systemd-resolved,改用静态/etc/resolv.conf指向稳定 DNS(如nameserver 8.8.8.8),并确保nsswitch.conf中hosts: files dns顺序合理 - 对动态后端,结合
mod_proxy_balancer+ DNS SRV 记录或 Consul 等服务发现,让 Apache 定期重新解析(需配合 TTL 控制与 reload 机制)











