Seit einigen Tagen hatte der Apache-Webserver auf unserem Haupt-Entwicklungsserver das Problem, dass er im Abstand von einigen Stunden regelmäßig den Dienst eingestellt hat - jetzt habe ich den Übeltäter vermutlich gefunden.

Das Problem zeigte sich so, dass einfach keine HTTP-Zugriffe mehr möglich waren. Im Logfile erschien die Meldung:
[Tue Feb 12 09:40:38 2013] [error] server reached MaxClients setting, consider raising the MaxClients setting

Da ein Verdoppeln der MaxCients wenig geholfen hat (die Zeit zwischen den Crashs wurde etwas länger), war die Vermutung, dass irgend ein Skript spinnt.

Laut mod_status kann es eigentlich nur unser Bugtracker sein:

...die Requests dauern teilweise fast eine Stunde, nur um die Startseite des (eigentlich deaktivierten) Wikis des Bugtrackers zu laden. Und siehe da, ein netter Spammer hat einige Hundert Spam-Kommentare hinterlassen. Leider ist "The Bug Genie" hier nicht sonderlich genial und braucht ewig, um die zu laden. In Kombination mit irgendwelchen Bots die ab und an versucht haben, diese Seite abzurufen, und einem zu Testzwecken viel zu hoch eingestellten PHP-Timeout (max_execution_time), hat das zu absolutem Stillstand geführt.

Der Server sollte jetzt wieder zuverlässig arbeiten.


PS - Was bei mod_status nervt: Wenn der Server erstmal gründlich hängt, lässt sich die /server-status Seite gar nicht mehr abrufen.

Also musste ich mir erstmal ein Shellskript bauen, was die Seite regelmäßig holt, und Bescheid gibt, wenn der Server dann tatsächlich hängt. Gibt es dafür eine elegantere Lösung??

#!/bin/bash
STATUS_URL="http://your-domain/server-status"
while [ 1 ];
do
echo -n "Checking server..."
RES=$(curl $STATUS_URL 2>/dev/null)
if [ $? -eq 0 ]; then
  echo $RES > logfile.html
  echo "OK"
else
  echo -en "\007 \007"
  afplay doorbell2.wav
  echo "ERROR - check logfile"
  open logfile.html
  sleep 30
fi
sleep 4
done