Avoir des demandes de journal Apache à leur arrivée plutôt qu'à la fin

9

J'essaie de diagnostiquer un problème de plantage de serveur bizarre (le serveur répond aux pings, mais n'acceptera pas les connexions SSH avant le redémarrage. 0% CPU ) où le redémarrage du serveur ramène tout à la normale. J'aimerais que mes journaux d'accès Apache (ou un autre journal) incluent toutes les demandes qui ont été faites juste après le crash, mais malheureusement Apache n'enregistre pas les demandes avant qu'elles ne soient terminées. Cela signifie que si une requête plante le serveur, cette requête ne se termine jamais et n'apparaît donc pas dans les journaux.

Existe-t-il un moyen de configurer Apache pour créer un fichier journal qui est écrit à mesure que les demandes arrivent?

Ben Dilts
la source
Jetez également un œil à votre configuration DNS, un serveur DNS cassé ou suspendu peut provoquer toutes sortes de problèmes avec SSH et ne pas pouvoir se connecter. [Qui sait ce qu'il peut faire pour apache - assurez-vous que les recherches de nom d'hôte sont désactivées.]
Sean Kimball

Réponses:

15

Je pense que vous avez besoin de la journalisation judiciaire, consultez ce lien: http://httpd.apache.org/docs/current/mod/mod_log_forensic.html

fragment:

Format du journal médico-légal:

Chaque demande est enregistrée deux fois. La première fois, c'est avant de poursuivre le traitement (c'est-à-dire après avoir reçu les en-têtes). La deuxième entrée de journal est écrite après le traitement de la demande en même temps que la journalisation normale se produit.

Afin d'identifier chaque demande, un ID de demande unique est attribué. Cet ID médico-légal peut être croisé dans le journal de transfert normal en utilisant la chaîne de format% {forensic-id} n. Si vous utilisez mod_unique_id, son ID généré sera utilisé.

La première ligne enregistre l'ID judiciaire, la ligne de demande et tous les en-têtes reçus, séparés par des caractères de canal (|). Un exemple de ligne ressemble à ceci (le tout sur une seule ligne):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 | Hôte: localhost% 3a8080 | User-Agent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv% 3a1.6) Gecko / 20040216 Firefox / 0.8 | Accepter: image / png, etc ...

Le caractère plus au début indique qu'il s'agit de la première ligne de journal de cette demande. La deuxième ligne contient juste un caractère moins et l'ID à nouveau:

-yQtJf8CoAB4AAFNXBIEAAAAA

Le script check_forensic prend comme argument le nom du fichier journal. Il recherche ces paires +/- ID et se plaint si une demande n'a pas été traitée.

Sandroid
la source
C'est ce que je cherchais, mais il ne semble pas que je puisse simplement effacer ce journal périodiquement (rm /var/log/apache2/forensic.log toutes les heures) ou la journalisation judiciaire s'arrête juste jusqu'à ce que je redémarre apache. Des idées?
Ben Dilts du
certainement si vous rm des journaux apache, cela se produira. Essayez d'utiliser logrotate ou tout autre équivalent existant dans votre environnement pour rouler les journaux périodiquement (en fonction du temps ou de la taille). Sinon, plutôt que de le supprimer, essayez de déplacer le fichier, puis touchez /var/log/apache2/forensic.log (vérifiez les autorisations cependant)
sandroid
2

La réponse de Sandroid convient à votre question, mais vous devriez également envisager de lancer une capture de paquets réseau. Si vous avez les ressources, la mise en miroir du port dans le commutateur et l'utilisation d'une deuxième machine exécutant WireShark pour enregistrer tout le trafic IP peuvent vraiment aider. Si quelque chose supprime le serveur au point où les services non HTTP ne répondent pas, il se peut qu'il supprime la pile IP avant que les mauvaises données ne parviennent à Apache.

Si vous pouvez vous assurer que la machine exécutant la capture possède un matériel réseau et / ou des pilotes différents les uns des autres. Serait nul pour planter deux pour le prix d'un. ;-)

marque
la source