Ping 是检查服务器是否可用的可靠方法吗?

Pet*_*lly 102 ping availability

在我的应用程序中,我正在 ping 服务器并等待响应。我正在使用它来确定服务器是否可用且是否响应。

这是确定可用性的可靠方法吗?我假设防火墙可能会过滤 icmp 流量......还有其他缺点吗?有没有更靠谱的方法?

Cho*_*er3 144

判断任何给定的远程服务是否处于活动状态的最佳方法是要求它以预期的方式为请求提供服务 - 事实上,这是真正知道某些东西是否正常工作的唯一方法。

作为一个例子,我总是让我的负载平衡器从我们的网络服务器获得一个实际的“头部”响应,如果你愿意,你可以对数据库框上的一个小选择或者你的实际服务器提供的任何东西做同样的事情。作为提示,您可以在您的 Web 服务器上创建一个“online.txt”(或您想给它的任何名称),让您的 LB 尝试获取该文件,如果失败,则它会从 VIP 中删除服务器,这是一种通过重命名单个文件手动从 VIP 中删除单个服务器的好方法。

Ping 仅测试响应 ping 的能力,因此这是基本操作系统、IP 堆栈的一部分和物理链接 - 但仅此而已,其他一切都可能会出现故障,而您不知道。

我知道下面提到了这一点,但它值得一再重复。

ICMP 回声请求(又名“Pings”)(又名 ICMP 类型 8)构建在 IP 堆栈规范中,是的,但不需要实现或使用。事实上,有大量的互联网提供商拒绝转发这些请求并默默地丢弃这些请求,因为它们是一种网络攻击(称为 pingflood)。

如上所述,这由操作系统处理(特别是在网络堆栈级别),因此是否响应这些取决于操作系统配置。如果关闭此功能(安全预防措施?),您将无法从另一端接收 ping 回复。这就是它不可靠的原因。

  • 男人说什么!我总是建议客户判断服务器当前是否提供服务 X 的最佳方法是**请求服务 X**。 (34认同)
  • 我们实际上为此在我们的应用程序中构建了一个“测试”RESTful API。所以我们知道,如果一个应用程序响应 blah/whatever_app/pulse 它就会启动,为请求提供服务,并且拥有它需要的所有工具(数据库、依赖等) (5认同)
  • 要添加到 MadHatter,执行 ping 和请求通常是个好主意。通过这种方式,您可以立即知道您是在处理网络连接还是服务中断……其中任何一个都倾向于创建与另一个完全不同的东西。 (5认同)
  • 假设机器在正常情况下响应 ping,您可以将 ping 用作某种布隆过滤器:如果 ping 失败,则服务肯定会关闭(您有网络问题,因为我们已经建立了 ping 正常工作)。但是,如果 ping 成功,该服务仍可能会按照此答案中的描述关闭 (4认同)

小智 10

大多数时候,是的,但是:

  • 一些服务器阻止 ping 请求

  • 仅仅因为服务器正在响应并不自动意味着网站(或您希望使用的任何服务)正在工作,您还应该检查响应是否与预期内容匹配。


小智 6

确实,在很多情况下,ICMP 流量会被过滤掉,因此它可能不可靠……

更好的方法可能是在您感兴趣的服务端口 telnet 服务器。

即远程登录 127.0.0.1 8080


use*_*517 5

如果服务器只需要响应 ping,那么这是确定其可用性的好方法。如果需要提供例如 Web 服务,那么您应该进行某种形式的测试,看看它是否与文件服务等类似。