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

这是确定可用性的可靠方法吗?我认为防火墙可能正在过滤icmp流量...还有其他缺点吗?有更可靠的方法吗?

#1 楼

判断给定远程服务是否存在的最佳方法是要求它按其应有的方式为请求提供服务-实际上,这是真正了解某项工作正常的唯一方法。

例如,我总是让我的负载均衡器从我们的Web服务器上获得实际的“正面”响应,如果需要,您可以对数据库框中的一小部分进行选择,也可以执行任何操作,也可以使用任何实际的服务器。作为提示,您可以在Web服务器上创建“ online.txt”(或任何您想给它的名称),让LB尝试获取该文件,如果失败,则将服务器从VIP中删除,这是只需通过重命名单个文件即可手动将单个服务器从VIP中移出的一种好方法。物理链接-就是这样,其他所有内容可能都掉了,您不知道。

我知道下面会提到这一点,但它需要一再重复。

ICMP回显请求(也称为“ Pings”)(也称为ICMP类型8)是建立在IP堆栈规范上的,是的,但不需要实现或使用。实际上,有很多互联网提供商拒绝转发这些请求并以静默方式丢弃这些请求,因为它们是一种网络攻击形式(称为pingflood)。

如上所述,这是由操作系统处理的(特别是在网络堆栈级别),因此由操作系统配置来响应或不响应。如果将其关闭(是否出于安全预防措施?),那么您将无法从另一端收到ping答复。这就是为什么它不可靠的原因。

评论


那人怎么说!我总是建议客户,判断服务器当前是否提供服务X的最佳方法是请求服务X。

– MadHatter
2011年9月19日上午10:28

为此,我们实际上在我们的应用程序中构建了一个“测试” RESTful API。因此,我们知道,如果某个应用程序对blah / whatever_app / pulse做出响应,它就会启动,处理请求并具有所需的所有工具(数据库,依赖关系等)

–tsykoduk
2011年9月19日在16:26



要添加到MadHatter中,执行ping和请求通常是一个好主意。这样一来,您就可以立即知道您是要处理网络连接还是服务中断...任一方都倾向于创建与另一方完全不同的事物。

–user606723
2011年9月19日19:48在

Ping甚至不是服务器本身可以响应ping的可靠测试-如果不是,那么您只知道您和它之间的某些内容正在过滤ICMP流量

–罗布·莫尔
2011年9月19日在21:13

假设机器在正常情况下对ping作出响应,则可以将ping用作某种布隆过滤器:如果ping失败,则服务肯定已关闭(由于我们通常已建立ping正常工作,所以您遇到了网络问题)。但是,如果ping成功,则该服务仍可能会关闭,如此答案中所述

– 3Doubloons
2011-09-20 15:28

#2 楼

大多数情况下,是的,但是:



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


#3 楼

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

更好的方法可能是在您感兴趣的服务端口上远程登录服务器。 >
ie telnet 127.0.0.1 8080

#4 楼

如果仅要求服务器响应ping,则这是确定其可用性的好方法。如果需要提供例如Web服务,那么您应该进行某种形式的测试,以查看文件服务等是否同样起作用。

#5 楼

ping有2个缺点:


ping发送icmp,可被防火墙过滤
您的应用程序使用的tcp或udp端口可能很忙或无法打开-ping不t检查

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

#6 楼

有专门的测试和监视工具,例如Nagios / Icinga。
使用这些工具,您可以(当然)可以通过各种ping测试进行检查,还可以对您的服务进行检查。

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

当然不容易设置(例如指向和单击),但可定制,可靠和可扩展。
在各种Linux和Unix发行版上都能很好地运行。

#7 楼

测试您要寻找的服务,仅对服务器执行ping操作并不意味着这些服务正在运行。

例如:

想象一个有十几个网站的网络服务器,那么我需要知道这些网站是否已启动,我自己在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);
?>


#8 楼

使用ping来确定服务器是否可用就像急诊医生检查病人是否在呼吸。是的,这是一个不错的起点,但是可能还有其他问题。

#9 楼

在启动尝试通过ssh连接的systemd服务之前,我们使用ping进行预检查,以确保主机已开机且可访问。这节省了一些调试时间,因为systemctl start命令将立即失败,而不是无提示地失败并在journalctl丛林中迷路。

请注意,ping与TCP的意义不同。如果连接不良(或糟糕的网络堆栈,谢谢Intel mpss)并且数据包被丢弃,则单个数据包ping可能会失败。另一方面,TCP连接对于丢失的数据包是可靠的。因此,具有讽刺意味的是,单个ping发生故障后,ssh连接可能会立即工作。因此,如果使用ping进行完整性检查,请确保允许出现一些故障。

#10 楼

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

Ping只是表明服务器是能够侦听,但在我们的情况下,如果没有人工干预,服务将无法启动。

天真地认为服务器可用的单元正在尝试建立连接并超时。而不是显示“服务器不可用”消息。

-

我们当前的应用程序通过XMLHTTPRequests与Web服务器进行通信,它发送一条形成的消息,服务器将用状态码响应。服务器通过进行大量检查来计算状态码,以确保各种子系统在线(数据库,必要的目录可写等)。

#11 楼

如果在正常情况下,您的服务器对ping作出响应,则每隔一分钟对ping一次以检查其是否响应很有用。当然,这只会告诉您在该IP地址上有一台服务器,并且存在从ping的源到目标的网络路径。设置响应时间阈值可以使您还监视网络状态。如果您要ping Internet上的服务器,则可能无法修复网络,但是如果客户打电话投诉,您将已经意识到问题所在。另外ping google.com也很有用。如果您和Google都倒闭,则说明正在发生某些事情。

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

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

您可能会因监视而发疯,因此只要监视足以告诉您什么时候发生了坏事或正在变得危险就可以了。即交换过多,磁盘使用率> 90%,磁盘io较高,长时间使用100%CPU,请记住,监视只是对执行速度非常慢的拒绝服务攻击。

#12 楼

Ping(数据包Internet Groper)使您知道系统是否正在与要与之建立网络连接的系统通信。它甚至可以Ping,并不意味着该服务(例如RemoteRegistry服务正在运行)。

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

#13 楼

我在脚本中使用的最好方法是

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


可以代替rmsh之类的rsh替代品。
这可以确保您的远程系统完全启动,并且可以在其上运行命令。
简单的ping操作不足,因为在启动网络服务时引导过程中,系统开始响应ping操作。

评论


rsh?真?为什么不使用ssh代替呢?

– Joachim Sauer
2011年9月19日上午11:57

除了rsh和ssh之外,能够执行日期(假设您是从头开始)如何说明Web服务器,SMTP服务器,DNS服务器,本地数据库服务器或其他未运行且能够处理请求的东西?最好实际询问您要验证其可用性的特定服务(它可能是远程外壳,但不一定一定要提供)。

–用户
2011-09-19 12:23

#14 楼

当我重新启动Windows Server时,我打开一个命令提示符框,然后输入

ping <box> -t


首先,它将提示它可用-就是该框关闭了。然后,您将获得很多“请求超时”。当您开始收到答复时,该框就会出现。

评论


这并不意味着它可以用于实际工作,而只是在响应ping。

–user9517
2011年9月19日下午16:53

也许。我总是可以登录到服务器,这就是我所需要的。

–戴夫
2011年9月19日在20:28

服务器完全有可能响应ping但尚未(甚至,甚至根本没有)启动任何更高级别的网络功能。 ping测试唯一的是ping。如果您按名称而不是IP进行ping操作,则可能是名称解析

–罗布·莫尔
2011-09-19 21:15



我曾有很多次服务器响应ping但无法处理任何其他类型的请求(包括登录)的情况。 ping是告诉服务器何时开始恢复的非常粗略的手段,仅此而已。当然,这是假设服务器甚至对ping做出响应。

–约翰·加迪尼尔(John Gardeniers)
2011-09-20 3:02