Apache:在代理传递中遵守 DNS ttl

Apache:在代理传递中遵守 DNS ttl

我们正在尝试设置一组 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。

答案2

对于你的情况,最好使用 nginx 或 haproxy。Apache 对于代理查询来说太重了。

Nginx 可以像这样设置解析器:

server {
    ...
    resolver 127.0.0.1;
    set $backend_upstream "http://dynamic.example.com:80";
    proxy_pass $backend_upstream;
    ...
}

您可以阅读有关 haproxy 中的超时这里以及 nginx 中的超时这里. 热到设置 nginx

相关内容