我有一个运行 Centos7 的网络服务器,它向其他资源发出 curl 请求。以每秒 5-10 个请求的速率,一切正常,除了我每 2-10 分钟收到不同的 curl 错误。我认为,随着请求数量的增加,它开始随着时间的推移而发生,这让我认为它与网络有关,但我在这方面完全是个新手。如何找出导致这些错误的原因以及我该怎么做?
Network: CURL error 56: TCP connection reset by peer
Network: CURL error 7: Failed to connect to ip: Network is unreachable
Network: CURL error 18: transfer closed with 1473 bytes remaining to read
更有可能的是,导致这些错误的原因通常可以归类为“SNAFU”……情况正常,一切正常。
互联网是由相互连接的计算机和网络设备组成的庞大网络。那些你无法控制的其他机器并不总是做它们应该做的事情。他们遭受电力故障。他们有硬件故障。他们受到宇宙辐射的打击。事情发生了。
支撑互联网的网络技术在设计时就考虑到了这一点。互联网之所以能正常工作,是因为存在巨大的冗余度。如果通过一条路由连接到目的地的尝试失败了……该链中最后一个有效的“跃点”将记住失败并尝试不同的“下一跃点”以进行未来的通信。它实际上比这复杂得多......但你明白了要点。
大多数 Web 应用程序会重试失败的连接,专门利用这种冗余。然而,并非全部。应用程序越简单,失败的可能性就越大。对于应用小型单一作业工具的 *nix 原则的终端应用程序尤其如此。重试是另一个工具的工作。
curl
就是这样一个应用程序。根据联机帮助页:curl
我不确定您用于
curl
检索资源的具体用例是什么,但是如果您使用 curl 以自动方式提供资源,您肯定需要--retry
使用值为 3-5 的标志配置它。因为像您显示的错误是完全正常的……并且需要考虑在内。2. 为什么生产服务器的可靠性比本地计算机差?
在一个完美的世界中,生产服务器将始终比任何家庭或办公室互联网连接更可靠地连接到基于互联网的资源。既然这里不是这种情况,那么您对原因感兴趣是正确的。但是,这并不一定意味着您应该担心,因为这也不一定是由您的服务器引起的问题。
了解您的本地计算机和您的服务器几乎肯定不会共享到相关资源的相同路径。例如。如果我
traceroute
从我的本地家庭服务器执行一个说...superuser.com
我得到这个:但是,如果我从我的其中一台生产服务器执行相同的命令,我会得到:
这两条路由唯一的共同点是目的地。他们通过的每一台其他机器都是不同的。因此,比方说,如果
dls-b22-link.telia.net
行为不当,它会影响我的服务器与 superuser.com 通信的尝试……但不会影响我家用计算机的尝试。不幸的是,如果出现问题,
dls-b22-link.telia.net
我也无能为力。dls-b22-link.telia.net
考虑到问题的间歇性,确定问题的根源并不是特别容易。所以...
2b. 这真的是个问题吗?
您应该做的第一件事是确认这是否导致了仅重试失败的连接无法解决的实际问题。这意味着您的生产服务器在某种程度上无法正常工作。我假设你在设置它时心中有一个目标。该目标是否仍在以您无需采取行动的方式实现?这是关键问题。
回到我之前所说的,像这样的间歇性问题只是互联网的一部分。在一个完美的世界中,它们不会发生,但我们并不生活在一个完美的世界中……这就是为什么冗余是互联网所基于的所有技术的基本原则。这就是为什么在这些类型的连接失败后重试是标准操作程序。以及为什么您不必过分担心此类故障,除非它们会主动损害您的服务器。
2c. 它在你的控制之下吗?
您需要缩小问题的潜在根源。为此,只需执行您已经完成的相同测试(计算给定时间范围内的失败次数),但这次让服务器从完全不同的地方请求资源。我建议在您的家用计算机上设置一个简单的网络服务器,其中包含一些与您一直在使用的文件类似的文件,并
curl
在您的服务器上使用这些文件。如果服务器在执行此操作时没有遇到任何故障,那么问题不太可能出在您的服务器或服务器的托管提供商上。并且您现有的测试已经消除了您的本地网络和 isp 以及资源本身作为问题潜在来源的托管位置。这使您的托管服务提供商和资源托管服务提供商之间的节点完全属于“您无法控制的事情”。
如果服务器在上述测试期间确实遇到问题,那么因为您已经排除了本地网络/isp 的问题,您几乎可以肯定问题出在您的服务器或服务器的托管提供商上。这意味着它在您的控制之下进行修复。这也意味着您有更多的故障排除工作要做。
2d。接下来是什么?
如果问题不在于您的服务器、服务器的托管提供商或您正在查询的资源……那么原因本身就不在您的控制之下。在这种情况下,您最好的选择是重新定位服务器(联系您的托管服务提供商并查看他们可以为您提供哪些选项)。希望通过这样做,您将不再需要使用上面有故障节点的路由。不过,这确实是一种折磨,而且不能保证一定会奏效。它甚至可能导致新的问题。因此,为什么在采取这样的步骤之前,这绝对需要成为一个严重的问题。
另一方面,如果您已将问题缩小到您的服务器或服务器的托管服务提供商,那么您可能可以解决它。如果您有托管协议,请致电您的托管服务提供商并让他们修复它。如果您没有托管协议,那么您需要消除作为潜在罪魁祸首的服务器配置。不幸的是,那是我下火车的地方。我们正在达到我的专业知识的极限。
通常,对于由您的服务器引起的间歇性问题,它可能与网络缓冲有关或者是某种自动化的结果。一些有根据的猜测:
/etc/sysctl.conf
或中的文件/etc/sysctl.d/
?无论如何,如果您正在对服务器本身进行故障排除,我的建议是利用您收集的信息并在ServerFault上提出一个新问题。那里的人比 SuperUser 上的人对服务器问题有更多的经验,并且更有可能知道下一步该尝试什么。
3.关于错误的明显一致性
现在,至于为什么您一遍又一遍地收到相同的特定错误?很难说。假设它真的像发条一样每 5 分钟发生一次……仍然可以是任何事情。这些设备中有时钟和定时器,用途广泛。这可能是其中一个设置为每五分钟执行一次的操作导致了这种微小的故障。
有可能是你的服务器有问题。或者这是您的托管服务提供商的问题。或者这是您的托管服务提供商的 ISP 的问题。或者这是您的家庭/办公室 ISP 的问题。或者介于两者之间的任何地方。如果它不是您的服务器,并且它可能不是基于您告诉我的内容,那么最重要的是您不能对此做太多...除非确保您已设置为重试失败的连接。例如,所有现代网络浏览器都会在放弃从网络服务器检索资源之前重试几次。
编辑