我们正在尝试设置一组 Apache 2.4.18,以代理将其收到的请求传递到我们合作伙伴的上游服务器。我们的合作伙伴使用 Amazon 的 Elastic Load Balancing,因此我们唯一知道的有关其服务器的信息就是其 DNS 名称。
DNS 记录的 TTL 为 60 秒,我想知道 Apache 是否可以遵守该 TTL,只要 DNS 记录有效就保持连接处于活动状态,然后在 TTL 过期时请求翻译。
使用 mod_proxy DisableReuse = on 强制在每次上游需要资源时打开新连接。只要底层操作系统执行 DNS TTL 缓存,这就可以解决问题。如果没有,每次需要新资源时,Apache 都会强制发出新的 DNS 请求,从而增加响应时间。
我曾考虑过使用 mod_proxy ttl 和 timeout 参数,但我认为我没有正确解决问题。根据文档,mod_proxy 的 timeout 参数控制套接字等待上游数据的时间,但我不确定 Apache 实例是否会关闭连接并打开新连接。此外,使用超时很容易出错,因为较低的值可能会向客户端发送错误的答案。
我花了一些时间尝试解决此设置,但没有成功。是否有任何特殊设置可以解决这种情况?或者我可能跳过了某些内容?任何帮助都将不胜感激。
最好的,
古斯陶
答案1
唯一对您的用例有帮助的选项是disablereuse=On
。
DNS 查询由 glibc 的解析器部分执行。结果不由该库或操作系统缓存。在 Apache 情况下,DNS 结果由 Apache 工作进程缓存。您可以拥有执行 DNS 缓存的DNS 服务,如nscd
或。dnsmasq
以下是 apache 文档的摘录。
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#workers
原始域的 DNS 解析
DNS 解析发生在首次创建到源域的套接字时。启用连接重用后,每个后端域在每个子进程中仅解析一次,并缓存以供所有后续连接使用,直到子进程被回收。在规划涉及后端域的 DNS 维护任务时,应考虑此信息。另请查看 ProxyPass 参数以获取有关连接重用的更多详细信息。
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
disablereuse(默认为“Off”)当您想要强制 mod_proxy 在使用后立即关闭与后端的连接,从而禁用该后端的持久连接和池时,应使用此参数。这有助于解决 Apache httpd 和后端服务器(无论使用哪种协议)之间的防火墙倾向于悄悄断开连接或后端本身可能处于循环 DNS 下的各种情况。启用连接重用后,每个后端域在每个子进程中仅解析一次(使用 DNS 查询),并缓存所有后续连接,直到子进程被回收。要禁用连接重用,请将此属性值设置为 On。