Question Ping est-il un moyen fiable de vérifier si un serveur est disponible?


Dans mon application, je fais un ping sur un serveur et j'attends une réponse. J'utilise ceci pour déterminer si le serveur est disponible et réactif ou non.

Est-ce un moyen fiable de déterminer la disponibilité? Je suppose qu'un pare-feu pourrait filtrer le trafic icmp ... Existe-t-il d'autres inconvénients? Existe-t-il une méthode plus fiable?


89
2017-09-19 10:00


origine




Réponses:


La meilleure façon de savoir si un service distant donné est actif est de lui demander de répondre à la demande de la manière dont il est censé le faire. En fait, c'est le seul moyen de vraiment savoir que quelque chose fonctionne correctement.

Par exemple, je demande toujours à mes équilibreurs de charge de recevoir une réponse «en tête» de nos serveurs Web. Vous pouvez faire de même pour un petit choix sur une boîte de base de données si vous le souhaitez, ou quel que soit le type de serveur utilisé par votre serveur. Comme astuce, vous pouvez créer un 'online.txt' (ou le nom que vous souhaitez lui attribuer) sur vos serveurs Web, demandez à vos LB d'essayer d'obtenir ce fichier et s'il échoue, il supprime le serveur du VIP, c'est-à-dire un moyen agréable de supprimer manuellement des serveurs individuels de vos VIP simplement en renommant un seul fichier.

Ping teste uniquement la capacité à répondre aux pings. Il s’agit donc du système d’exploitation de base, d’une partie de la pile IP et des liens physiques - mais c’est tout, tout le reste pourrait être en panne et vous ne le sauriez pas.

Je sais que cela est mentionné ci-dessous, mais il convient de le répéter encore et encore.

Les demandes d'écho ICMP (ou "Pings") (ou ICMP Type 8) sont construites sur la spécification de pile IP, mais elles ne doivent pas nécessairement être implémentées ou utilisées. En fait, un grand nombre de fournisseurs Internet refusent de les transmettre et abandonnent ces demandes en silence, car il s’agit d’une forme d’attaque de réseau (appelée pingflood).

Comme mentionné ci-dessus, cela est géré par le système d'exploitation (en particulier au niveau de la pile de réseau) et il appartient donc à la configuration du système d'exploitation de répondre à ces questions ou non. Si cette option est désactivée (une mesure de sécurité?), Vous ne pouvez rien faire pour recevoir des réponses au ping de l'autre bout. C'est pourquoi ce n'est pas fiable.


137
2017-09-19 10:10



Qu'est-ce que l'homme a dit! Je préviens toujours les clients que la meilleure façon de savoir si un serveur offre actuellement le service X consiste à: demande de service X. - MadHatter
Nous construisons en fait une API "test" RESTful dans nos applications juste pour ça. Nous savons donc que si une application répond à blah / what_app / pulse, elle répond aux requêtes et répond à tous les outils nécessaires (base de données, dépendances, etc.). - tsykoduk
Pour ajouter à MadHatter, c'est souvent une bonne idée de faire un ping et une requête. De cette façon, vous pouvez savoir tout de suite si vous avez affaire à une connectivité réseau ou à une panne de service ... L'un ou l'autre a tendance à créer des choses complètement différentes les unes des autres. - user606723
Le ping n'est même pas un test fiable indiquant que le serveur lui-même peut répondre au ping - si ce n'est pas le cas, tout ce que vous savez, c'est que quelque chose se sépare entre vous et lui, filtre le trafic ICMP - Rob Moir
En supposant que la machine réponde au ping dans des circonstances normales, vous pouvez utiliser le ping comme une sorte de filtre de bloom: si le ping échoue, le service est définitivement hors service (vous avez un problème de réseau car nous avons établi que le ping fonctionne normalement). Cependant, si le ping réussissait, le service pourrait toujours être indisponible, comme décrit dans cette réponse. - 3Doubloons


La plupart du temps, oui, cependant:

  • certains serveurs bloquent les requêtes ping

  • juste parce que le serveur répond ne signifie pas automatiquement le site (ou quel que soit le service que vous comptez utiliser) travaille, vous devez également vérifier si la réponse correspond au contenu attendu.


10
2017-09-19 10:08





Il est vrai que le trafic ICMP est filtré à de nombreuses reprises, de sorte qu'il pourrait ne pas être fiable ...

Une meilleure solution consisterait peut-être à établir une connexion telnet avec le serveur au port de service qui vous intéresse.

telnet 127.0.0.1 8080


5
2017-09-19 10:07





Si le serveur doit uniquement répondre aux pings, il s'agit d'une méthode efficace pour déterminer sa disponibilité. S'il est nécessaire de fournir, par exemple, un service Web, vous devez effectuer un test pour voir s'il fonctionne de la même manière pour les services de fichiers, etc.


5
2017-09-19 10:10





Le ping a 2 inconvénients:

  • ping envoie icmp, qui peut être filtré par le pare-feu
  • le port TCP ou UDP que votre application utilise peut être occupé ou non ouvert - le ping ne vérifie pas que

une meilleure solution consiste à vérifier directement votre port udp / tcp pour voir si le service est toujours disponible ... :-)


3
2017-09-19 19:20





Il existe des outils spéciaux pour tester et surveiller comme Nagios / Icinga.
Avec ces outils, vous pouvez (bien sûr) effectuer des contrôles avec divers tests de ping mais également des contrôles de vos services.

Toutes les vérifications peuvent utiliser la valeur renvoyée pour classer le résultat comme "bon", "avertissement" et "critique" et peuvent être écrites dans presque tous les langages de programmation.

Bien sûr, pas facile à installer (comme pointer et cliquer), mais personnalisable, fiable et extensible. Fonctionne bien sur diverses distributions Linux et Unix.


3
2017-09-19 18:24





Testez les services que vous recherchez. Un simple ping sur un serveur ne signifie pas que les services fonctionnent.

Par exemple:

Imaginez un serveur Web avec une douzaine de sites Web, alors je dois savoir si les sites Web sont UP, je me suis fait un petit script en php et je l'ai lancé toutes les 10 minutes.

Le script fait ce qui suit ->

<?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