Ping是一种可靠的方法来检查服务器是否可用?

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

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

判断任何给定的远程服务是否有效的最好方法是要求它以所要求的方式服务请求 – 事实上,这是唯一能真正知道某些东西正常工作的方法。

作为一个例子,我总是让我的负载平衡器从我们的Web服务器得到一个真正的“头”响应,如果你愿意的话,或者你的实际服务器提供的服务,你可以在数据库盒子上做一个小的select。 作为一个提示,你可以在你的Web服务器上创build一个'online.txt'(或者你想给它的任何名字),让你的LB试图获得这个文件,如果失败了,那么它会从VIP中删除服务器,这是通过重命名单个文件来手动从VIP中手动取出单个服务器的方法。

Ping只testingping响应的能力,所以这是基本的操作系统,IP堆栈的一部分和物理链接 – 但是就这些而言,其他的东西都可能被closures,而且你不知道。

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

ICMP回声请求(又名“Pings”)(又称ICMP Type 8)是build立在IP协议栈规范上的,是的,但并不要求被执行或使用。 事实上,有大量的互联网服务提供商拒绝转发这些服务,并悄悄地放弃了这些请求,因为这是一种networking攻击(称为Pingflood)。

如上所述,这是由操作系统(特别是在networking堆栈级别)处理的,所以由操作系统configuration来响应这些操作。 如果这是closures的(安全防范?),你不能做任何事情从另一端接收ping答复。 这就是为什么它不可靠。

但是大部分时间,是的,

  • 一些服务器阻止ping请求

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

确实,在很多情况下,ICMPstream量被过滤掉,因此可能不可靠。

更好的办法可能是在你感兴趣的服务端口上远程login服务器。

即telnet 127.0.0.1 8080

如果服务器只需要响应ping,那么这是确定其可用性的好方法。 如果需要提供一个Web服务的例子,那么你应该进行某种forms的testing,看看这个文件服务的工作是否类似

ping有两个缺点:

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

一个更好的解决scheme是直接检查你的udp / tcp端口,看看服务是否仍然可用… 🙂

Nagios / Icinga有专门的testing和监控工具。
有了这些工具,您可以(当然)使用各种pingtesting进行检查,但也会对您的服务进行检查。

所有检查都可以使用返回值将结果分类为“好”,“警告”和“关键”,并且几乎可以用每种编程语言编写。

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

testing你正在寻找的服务,只是ping服务器并不意味着服务正在工作。

例如:

想象一下有十几个网站的networking服务器,然后我需要知道这些网站是否在运行,我在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('[email protected]', 'Website is DOWN', $message); ?> 

使用ping来确定服务器是否可用就像ER医生检查病人是否在呼吸。 是的,这是一个开始的好地方,但可能还有其他的问题。

只是我的两分钱:我们有一个传统的应用程序,使用这种方法,并不得不服务它,因为ping不足以确定服务的可用性。

平仅仅表明服务器能够听,但在我们的情况下,服务是无法启动,没有人为干预。

因此,天真地认为服务器可用的单元试图连接并超时。 而不是显示我们的“服务器不可用”消息。

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

如果在正常情况下你的服务器响应ping,那么每隔一分钟ping一次就可以检查是否响应。 这当然只是告诉你,在这个IP地址有一个服务器,并且有一个从ping源到目的地的networkingpath。 设置响应时间的阈值可以让您监视networking的状态。 如果您在互联网上ping服务器,则可能无法修复networking,但是如果客户打电话抱怨,则已经知道该问题。 Pinging google.com也是有用的。 如果你和谷歌都失败了,就会发生一些事情。

正如其他人所提到的那样,监视您所提供的服务是否有响应并确保其性能是非常重要的。 也就是说,您可能想要检查为什么通常在一秒钟内响应的networking时代现在正在响应我10秒钟。

所以知道一个服务没有响应,而ping失败给你更多的信息,而不仅仅是一个方法。 此外,如果您也监视进程,知道ping响应,服务不响应,Web服务器没有正确的进程数告诉你在哪里先看看。

你可以疯狂地进行监控,所以只要有足够的监控来告诉你什么时候发生了不好的事情或危险的事情。 即太多的交换,超过90%的磁盘使用率,高磁盘IO,100%的CPU长时间记住,监控只是一个拒绝服务攻击进行非常缓慢。

我们使用ping做一个预先检查,主机是开机并且可以访问的,然后启动我们的systemd服务,尝试一个ssh连接。 这可以节省一些时间debugging,因为systemctl start命令将立即失败,而不是在journalctl丛林中静静地失败并丢失。

请注意,ping与TCP相同,不是“可靠的”。 如果你有一个不好的连接(或蹩脚的networking堆栈,谢谢英特尔mpss )和数据包被丢弃,单个数据包ping可能会失败。 另一方面,TCP连接对于丢弃的分组是可靠的。 所以,具有讽刺意味的是,一次ping 失败后,ssh连接可能立即生效。 所以如果你使用ping来做一个完整的检查,一定要允许一些失败。

Ping(Packet Internet Groper)让您知道您的系统是否正在与您希望通过networkingbuild立连接的系统进行通信。 它甚至ping,并不意味着服务,例如RemoteRegistry服务正在运行。

但是,要解决任何问题ping是必要的。 您可以远程解决任何问题。 因此,平有其重要性。

我在脚本中使用的最佳方式是

 #rsh servername.com "date" Mon Sep 19 04:42:20 PDT 2011 

可以使用像remsh这样的替代rsh的替代方法。 这可确保您的远程系统完全启动,并且可以在其上运行命令。 当启动networking服务时,简单的ping是不够的,系统开始响应ping。

当我重新启动一个Windows服务器,我打开一个命令提示框并input

 ping <box> -t 

首先它会提示它是可用的 – 这是盒子下降。 那么你会得到很多“请求超时”。 当你开始得到答复的时候,这个盒子已经打开了。