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


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

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


89
2017-09-19 10:00






答案:


判断任何给定的远程服务是否存活的最佳方法是让它以其意图的方式为请求提供服务 - 实际上它是真正了解某些工作正常的唯一方法。

作为一个例子,我总是让我的负载平衡器从我们的Web服务器获得实际的“头部”响应,如果您愿意,或者您实际服务器所服务的任何内容,您可以对数据库盒上的小选项执行相同操作。作为提示,您可以在Web服务器上创建“online.txt”(或任何您要提供的名称),让您的LB尝试获取该文件,如果失败则将其从VIP中删除,这是通过重命名单个文件,手动将单个服务器从VIP中取出的好方法。

Ping仅测试响应ping的能力,因此这是基本操作系统,IP堆栈的一部分和物理链接 - 但这就是全部,其他一切都可能已关闭,你不知道。

我知道这在下面提到,但它一再重复。

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

如上所述,这由OS处理(特别是在网络堆栈级别),因此由OS配置决定是否响应。如果关闭此选项(安全预防措施?),则无法从另一端接收ping回复。这就是为什么它不可靠。


137
2017-09-19 10:10



那个男人说什么!我总是告诉客户,告诉服务器当前是否提供服务X的最佳方法是 请求服务X.。 - MadHatter
我们实际上在我们的应用程序中构建了一个“测试”RESTful API 只是 为了这。所以我们知道,如果一个应用程序响应blah / whatever_app / pulse它就会响应,处理请求,并拥有它需要的所有工具(DB,dependancies等) - tsykoduk
要添加到MadHatter,执行ping和请求通常是个好主意。通过这种方式,您可以立即知道您是在处理网络连接还是服务中断......任何一个都倾向于创建与另一个完全不同的东西。 - user606723
Ping甚至不是一个可靠的测试,服务器本身可以响应ping - 如果它没有那么你所知道的是你和它之间的东西正在过滤ICMP流量 - Rob Moir
假设机器在正常情况下响应ping,你可以使用ping作为某种布隆过滤器:如果ping失败,服务肯定是关闭的(你有网络问题,因为我们通常建立了ping工作)。但是,如果ping成功,则服务仍然可以按照此答案中的描述关闭 - 3Doubloons


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

  • 一些服务器阻止ping请求

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


10
2017-09-19 10:08





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

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

即telnet 127.0.0.1 8080


5
2017-09-19 10:07





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


5
2017-09-19 10:10





ping有两个缺点:

  • ping发送icmp,可以被防火墙过滤掉
  • 您的应用程序使用的tcp或udp端口可能正忙或未打开 - ping不检查

一个更好的解决方案是直接检查您的udp / tcp端口,看看该服务是否仍然可用... :-)


3
2017-09-19 19:20





有一些特殊的测试和监控工具 Nagios的 / Icinga
使用这些工具,您(当然)可以使用各种ping测试进行检查,但也可以检查您的服务。

所有检查都可以使用返回的值将结果分类为“good”,“warning”和“critical”,并且可以用几乎所有编程语言编写。

当然不容易设置(如点击),但可定制,可靠和可扩展。 在各种Linux和Unix发行版上运行良好。


3
2017-09-19 18:24





测试您正在寻找的服务,只需ping服务器并不意味着服务正在运行。

例如:

想象一下有十几个网站的网络服务器,然后我需要知道网站是否是UP,我自己做了一个小小的PHP脚本并且每10分钟运行一次。

脚本执行以下操作 - >

<?php
    $website1 = "http://www.mywebsite.com/";
    $myWebsite = file_get_contents($website1);
    $message = 'My website' . $website1 . ' is DOWN at the moment.';
    if (empty($myWebsite)) mail('mail@server.com', 'Website is DOWN', $message);
?>

2
2017-11-28 15:42





使用ping来确定服务器是否可用就像ER医生检查患者是否正在呼吸一样。是的,这是一个很好的起点,但可能还有其他问题。


2
2017-09-19 18:39





只是我的两分钱: 我们有一个使用此方法的遗留应用程序,因为ping是必须的  足以确定服务可用性。

Ping仅显示服务器能够监听,但在我们的情况下,服务无法在没有人为干预的情况下启动。

结果,天真地认为服务器可用的单元正在尝试连接和超时。而不是显示我们的“服务器不可用”消息。

-

我们当前的应用程序通过XMLHTTPRequests与Web服务器通信,发送一条已形成的消息,服务器将使用状态代码响应该消息。状态代码由服务器进行多次检查以确保各种子系统在线(DB,必要的目录是可写的等)来计算。


0
2017-08-24 23:59





如果在正常情况下您的服务器响应ping,则每隔一分钟对其进行ping操作以检查它是否响应是很有用的。这当然只告诉您该IP地址有一台服务器,并且存在从ping源到目的地的网络路径。设置响应时间的阈值可以让您还监视网络状态。如果您在Internet上ping服务器,可能无法修复网络,但如果客户打电话投诉,您就已经意识到了这个问题。另外ping google.com也很有用。如果你和谷歌都失败了,就会发生一些事情。

正如其他人所提到的,监控您提供的服务是否正在响应以及其性能是否正常非常重要。即您可能想要检查为什么通常在一秒钟内响应的网络时代现在正在响应我10秒钟。

因此,知道服务没有响应并且ping失败会为您提供比一种方法更多的信息。此外,如果您监视进程,知道ping响应,则服务不响应,并且Web服务器没有正确数量的进程告诉您首先查找位置。

你可以疯狂监控,所以只需要监控,告诉你什么时候发生了什么不好或者变得危险。即太多的交换,> 90%的磁盘使用率,高磁盘io,长时间100%的CPU,并记住监控只是一种非常缓慢的拒绝服务攻击。


0
2017-10-18 02:57





我们用 ping 在启动尝试与其进行ssh连接的systemd服务之前,执行预检,主机已启动且可访问。这节省了一些时间调试,如 systemctl start 命令将立即失败,而不是默默地失败并迷失在日志丛林中。

请注意,ping与TCP相同并不“可靠”。如果你有一个糟糕的连接(或糟糕的网络堆栈,谢谢你 英特尔mpss)并且数据包被丢弃,单个数据包ping可能会失败。另一方面,TCP连接对于丢弃的数据包是可靠的。具有讽刺意味的是,ssh连接可能会 工作 一个人后立即 ping  失败。因此,如果您使用ping进行健全性检查,请确保允许一些失败。


0
2017-09-19 11:55