0

我的 php 应用程序发出的 curl 请求存在一些 DNS 问题。

nginx+php5-fpm 日志显示缓慢的脚本,故障点是 curl。

很困惑,因为我的 curl 脚本将超时和连接超时选项都设置为 3 秒(生产服务器)。

所以偶尔我会在我的脚本失败的地方得到一些错误。我模拟了 DNS 故障,我可以重新创建这些 php 脚本超时故障。

因此,我的 curl 随机进行 DNS 查找并失败。DNS 服务器没有响应,或者它正在限制我们(我们在峰值每秒发送数百个请求)。

我想我需要努力实现本地 DNS 缓存,但现在我可以做些什么来限制错误的 DNS 响应或使用 curl 的 DNS 超时?

我在想,是否CURLOPT_DNS_CACHE_TIMEOUT也会缓存不良响应?如果是,我需要关闭它,如果它没有缓存任何响应/超时,那么我可以将它从 2 增加到 15 分钟以帮助解决问题?

关于如何阻止 curl & bad DNS 使我的网站崩溃的任何想法?

4

2 回答 2

1

也许手册页中的这些信息对其他找到这个问题的人有用:

CURLOPT_DNS_CACHE_TIMEOUT

传递一个长,这以秒为单位设置超时。名称解析将在内存中保留此秒数。设置为零以完全禁用缓存,或设置为 -1 以使缓存的条目永久保留。默认情况下,libcurl 将此信息缓存 60 秒。

注意:各种 libc 实现的名称解析函数不会重新读取名称服务器信息,除非明确告知(例如,通过调用 res_init(3))。这可能会导致 libcurl 继续使用旧服务器,即使 DHCP 已经更新了服务器信息,这对于普通的 libcurl-app 用户来说可能看起来像是 DNS 缓存问题。

来自http://linux.die.net/man/3/curl_easy_setopt

于 2013-08-22T23:46:18.013 回答
0

我通常在我的服务器上运行 bind9,以便缓存我的域名。这通常比希望别人为你做这件事要好得多。

您不太清楚如何使用curl,但缓存选项仅在您继续运行时才有效。如果您运行存在的脚本并稍后重新启动,那么缓存每次都会丢失。的确。

如果尝试访问您自己的服务,也许您应该使用/etc/hosts文件中的条目(如下所示)而不是依赖完整的 DNS。如果您只访问您控制的域,那么您也将控制它们的 IP 地址。

1.2.3.4    foo.example.com

那总是有效的。

相反,如果您要处理许多您无法控制的域名,恐怕拥有一个正常工作的 DNS 是唯一好的解决方案。在这种情况下,您可能需要考虑使用 bind9 并将其设置为长时间缓存您的域名(通常认为 1h 到 2h 是安全的,如果名称更改可能会出现故障,则 1 天或更长时间可能会很多到 24 小时。

于 2020-02-21T02:33:49.670 回答