Forum Linux.debian/ubuntu Apache : exécuter un script après qu'une erreur ait été enregistrée dans error.log

Posté par  . Licence CC By‑SA.
Étiquettes :
1
30
oct.
2013

Bonjour,

J'ai un vieux serveur sous Debian Lenny qui fait tourner Apache en reverse proxy pour accéder à un démon Anyterm qui tourne sur le localhost:8888.
Depuis quelques jours Anyterm se votre comme une merde pour une raison encore obscure.
Le error.log d'Apache contient ceci :

[Wed Oct 16 17:39:13 2013] [error] [client 192.168.1.3] (20014)Internal error: proxy: error reading status line from remote server localhost, referer: https://xxxx
[Wed Oct 16 17:39:13 2013] [error] (111)Connection refused: proxy: HTTP: attempt to connect to [::1]:8888 (localhost) failed
[Wed Oct 16 17:39:13 2013] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Wed Oct 16 17:39:13 2013] [error] proxy: HTTP: disabled connection for (localhost)

Le contournement actuel est le redémarrage de Anyterm suivi du redémarrage d'Apache.

Outre le fait que j'aimerais comprendre l'erreur, je souhaiterais quand cette erreur survient : soit recevoir un mail soit exécuter un script shell (en root).
J'avoue que j'ai regardé dans la doc de rsyslog, mais j'ai rien compris et la doc d'Apache ne semble traiter que des erreurs rencontrées côté utilisateur.

Tout aide est la bienvenue.

a+

  • # Erreur Apache "banale"

    Posté par  . Évalué à 2.

    ton anyterm se vautre,
    apache ne peut plus le joindre et te le dit dans les logs.

    un redemarrage de anyterm pourrait suffire

    pour un redemarrage sur script, dans un premier temps je ferais bourrin dans ce style

    while true
    $(tail -f /var/log/apache2/error.log | grep 8888) && anyterm restart

    en gros ca regarde en permanence ce qui se passe dans error.log, ca filtre sur 8888
    si ca trouve 8888, ca renvoie 1 et demande donc le redemarrage de anyterm

    evidemment ca peut s'ameliorer

  • # inotify

    Posté par  . Évalué à 3.

    Je ne crois pas qu'Apache propose ce genre de chose (ou alors peut-être avec une extension).
    Par contre en utilisant inotify/incron, un bout de script et la méthode La RACHE, tu devrais pouvoir faire ce que tu veux.

    • [^] # Re: inotify

      Posté par  . Évalué à 2.

      De toutes les réponses, j'ai retenu la tienne : facile et rapide à mettre en oeuvre.
      J'ai fait un script bash lancé via la incrontab. Le script n'est pas parfait mais c'est suffisamment fonctionnel.
      Je le met ici, ça peut servir à d'autres. Je suis bien évidement ouverts au remarques.
      Merci à tous !

      #!/bin/bash
      
      # Le script est appelé pour chaque ligne modifiée
      # Il faut eviter de lancer les actions de multiples fois
      # On enregistre le PID du script en cours dans un fichier et on attend
      # On compare ensuite le PID courant avec celui enregistré dans le fichier :
      # Le dernier script lancé sera celui qui sera exécuté
      echo -n "$$" > /tmp/watch-myprocess.pid
      sleep 5
      pidAllowed=`cat /tmp/watch-myprocess.pid`
      if [[ $$ -ne $pidAllowed ]]
      then
          exit 0
      fi
      
      
      # Définition du fichier à interroger & de la date du jour en anglais (elle est en anglais dans les logs).
      file="/var/log/apache2/error.log"
      today=`oldLANG=$LANG;LANG=en_EN.UTF-8;date '+%a %b %d';LANG=$oldLANG`
      
      
      # Définition des destinataires du mail et de son contenu
      mailTo="root"
      mailSubject="TRES URGENT : anytermd semble etre en erreur"
      
      mailMessage="
      Bonjour,
      
      Le service xxx est encore hs, merci de faire le necessaire.
      
      Attention :
      Vous risquez de recevoir d'autres messages de ce type dans la journee malgres le bon fonctionnement du service : ne plus en tenir compte.
      
      Extrait des logs de $file qui ont genere ce message :
      
      "
      
      
      # Mots clés à rechercher dans les logs
      errorToFind[1]="\(20014\)Internal error: proxy: error reading status line from remote server localhost, referer: https://xxx"
      errorToFind[2]="\(111\)Connection refused: proxy: HTTP: attempt to connect to [::1]:8888 \(localhost\) failed"
      errorToFind[3]="ap_proxy_connect_backend disabling worker for \(localhost\)"
      errorToFind[4]="proxy: HTTP: disabled connection for \(localhost\)"
      
      # La recherche
      sendMail=0 # initialisation d'une variable afin de na pas envoyer de mail quand ce n'est pas utile
      while read line ; do
      for (( index=1; index<=${#errorToFind[@]} ; index++))
      do
      
      if [[ $line =~ $today.*${errorToFind[$index]} ]]
      then
      mailMessage="$mailMessage$line
      "
      sendMail=$sendMail"1"
      fi
      
      
      done
      done < $file
      
      
      # Envoi d'un email uniquement si un des mots clé a été trouvé
      if [[ $sendMail -ne 0 ]]
      then
      echo "$mailMessage" | mail -s "$mailSubject" $mailTo
      fi
      
  • # logwatch, tail|grep ou SystemTap

    Posté par  (site web personnel) . Évalué à 3.

    Il existe plusieurs systèmes d'analyse de log qui permettent ce genre de chose mais typiquement ils se lancent à intervalle fixe (toutes les heures par exemple). Le premier qui me vient à l'esprit est logwatch mais il y en a d'autres.

    Pour réagir en « temps réel » tu peux soit le faire toi même avec tail | grep par exemple. Alternativement il doit exister des trucs tout fait pour ça mais sans chercher je vois pas.

    Une autre méthode pour remonter ces erreurs en temps réel est d'intercepter directement l'appel système qui pose problème soit via auditd (mais ça ne résoud pas le problème d'effectuer une action une fois que c'est remonté dans les logs), soit via SystemTap qui permet d'effectuer des actions arbitraires lorsqu'un événement spécifique (qui, du coup, n'est pas forcément un appel système) se produit.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # fail2ban

    Posté par  . Évalué à 4.

    C'est surement un peu overkill, mais fail2ban fonctionne de cette façon (il lis un log et effectue une action quand un pattern est trouvé), en plus il est hautement configurable, y'a donc surement moyen…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.