Apache Status Überwachung per Monit

tsk

Member
Hallo zusammen,

ich überwache einen Ubuntu 16.04 live-Server mittels Monit aus den offiziellen Paketquellen. Derzeit 9 Services und 21 Files. Außer Apache sind mittlerweile alle Services unauffällig. Die Apache Überwachung treibt mich aber in den Wahnsinn.

Ich nutze den localhost für kritische Dienste, wie phpmyadmin, postfixadmin, server-status und Monit. Er ist nur per ssh-Tunnel erreichbar, und ausser server-status erfordern alle Dienste eine separate Authentifizierung (Monit 5.16 beherrscht noch kein login via basic auth). Server-status, um den es hier geht, ist über localhost IMMER problemlos abrufbar (im Log: Status 200, und nie 401)

In stochastischen Abständen, mal im Stundentakt, aber auch mal 6 Stunden gar nicht, dann wieder nach 2 Stunden) sendet mir Monit Warnungen per Mail:


Code:
Description: failed protocol test [HTTP] at [localhost]:80/server-status [TCP/IP] -- HTTP error: Server returned status 401
2 Minuten später dann:
Description: connection succeeded to [localhost]:80/server-status [TCP/IP]
Prüfe ich die Logs, so sehe ich nur erfolgreiche Zugriffe von Monit (status 200), aber keinen einzigen 401. Mein Apache wird also sinnlos durch Monit mehrmals am Tag neu gestartet. Heute Morgen hatte ich sogar einen Monit Timeout beim Apache - d.h., die Überwachung für Apache wurde eingestellt. Dieser lief aber anstandslos.

Meine Apache-Monit Konfiguration:

Code:
check process apache with pidfile /var/run/apache2/apache2.pid
   group www
   group apache
   start program = "/etc/init.d/apache2 start"
   stop program  = "/etc/init.d/apache2 stop"
   if 4 restarts within 20 cycles then timeout
   if failed host localhost port 80
	protocol apache-status
	path "/server-status"
	loglimit > 60%
   then restart
   depend apache_bin
   depend apache_rc

 check file apache_bin with path /usr/sbin/apache2
   group apache
   include /etc/monit/templates/rootbin

 check file apache_rc with path /etc/init.d/apache2
   group apache
   include /etc/monit/templates/rootbin
Die Konfiguration von Apache mod_status:

Code:
<IfModule mod_status.c>
	# Allow server status reports generated by mod_status,
	# with the URL of http://servername/server-status
	# Uncomment and change the "192.0.2.0/24" to allow access from other hosts.

	<Location /server-status>
		SetHandler server-status
		<RequireAny>
			Require local
			Require ip 127.0.0.1
			Require ip ::1
		</RequireAny>
	</Location>

	# Keep track of extended status information for each request
	ExtendedStatus On

	# Determine if mod_status displays the first 63 characters of a request or
	# the last 63, assuming the request itself is greater than 63 chars.
	# Default: Off
	#SeeRequestTail On

	<IfModule mod_proxy.c>
		# Show Proxy LoadBalancer status in mod_status
		ProxyStatus On
	</IfModule>
</IfModule>
Anmerkung dazu: Anfangs stand dort nur "Require local", was lt. Doku lokale IP4 und IP6 Zugriffe gestatten sollte. Dies führte aber zur doppelten Häufigkeit der False-Positives bei Monit. Monit greift sowohl mit IP6 als auch IP4 (Verhältnis 4:1) auf den server-status zu.

Der relevante Teil der Apache Konfiguration für localhost:

Code:
   <LocationMatch "^/(?i:(?:monit|phpmyadmin|postfixadmin))">
        Require all denied
        <RequireAll>
            Require local
            Require valid-user
        </RequireAll>
        <IfModule mod_authz_core.c>
            <IfModule mod_authn_file.c>
                AuthType Basic
                AuthName "Restricted Content"
                AuthUserFile /etc/apache2/.htpasswd
            </IfModule>
        </IfModule>
    </LocationMatch>

    <Directory "/var/www/html/public_html">
        Require all denied
        <RequireAll>
            Require local
            Require valid-user
        </RequireAll>
        <IfModule mod_authz_core.c>
            <IfModule mod_authn_file.c>
                AuthType Basic
                AuthName "Restricted Content"
                AuthUserFile /etc/apache2/.htpasswd
            </IfModule>
        </IfModule>
        DirectoryIndex index.html index.php
    </Directory>
Kann sich jemand dieses Verhalten erklären? Es wird kein einziger 401 im Zusammenhang mit Monit geloggt.
 

PHP-Friends

Blog Benutzer
Ich würde hier schlichtweg einen vollständigen Trafficdump (also mit Payload) heranziehen und mir die Requests von monit ansehen. Da kein HTTPS abgefragt wird, lässt sich dies ja relativ einfach analysieren.

Anbei - du kannst ausschließen, dass irgendeine Software dazwischenfunkt, indem sie sich z.B. an Port 80 bindet?

Edit: Konfiguriere den Check doch mal temporär auf IPv4-only, ich habe da eine leise Ahnung :)
 

tsk

Member
Ein vollständiger Trafficdump übersteigt derzeit noch mein Wissen. Muss ich mich erst einlesen. Werd ich aber tun.

Dazwischenfunken andere Applikationen kann ich weitgehend ausschließen. Es ist mir auch nicht möglich, händisch einen 401 beim server-status zu erzeugen.

Ich vermute sehr stark, dass es mit IP6 vs IP4 zu tun hat. Einfluss hatte ja bereits, "Require local" zusätzlich um IP6 und IP4 zu ergänzen. Warum Monit wahlfrei mal IP4, mal IP6 wählt, erschließt sich mir nicht. Ich weiß auch nicht, wie ich hier IP4 erzwingen kann.

Zwischendurch gibt es ja - bei identischer Konfiguration - 100-te problemlose Zugriffe von Monit auf den Server-status (IP6 und IP4, beide Status 200). Heute war 6 Stunden kein Problem, und dann 2 mal im Stundenrythmus. Scheint sehr esotherisch, das Problem.

EDIT: Ich spiele derzeit auf meinem lokalen Entwicklungsserver, welcher identisch wie der live-server eingerichtet ist. Ich kann somit jedes Last Problem auf dem Apache ausschließen, da ich dort alleine unterwegs bin.
 
Last edited by a moderator:

PHP-Friends

Blog Benutzer
Ich weiß auch nicht, wie ich hier IP4 erzwingen kann.
Code:
   if failed host localhost port 80
	protocol apache-status
	path "/server-status"
->

Code:
   if failed host 127.0.0.1 port 80
	protocol apache-status
	path "/server-status"
:)
 

tsk

Member
Oh Mann - ich Depp. Da hätte ich tatsächlich selbst drauf kommen können :)

Vielen Dank für den Tipp. Ich teste es erst mal auf dem Entwicklungsserver - und melde mich, sobald's was zu melden gibt.
 

tsk

Member
So, erstes Resümee:

Nach Erzwingen von IP4 und Reload von Monit gab es - kurz darauf - noch 1x false Positive. Darauf hin habe ich einen Restart von Monit vorgenommen - und seit dem ist tatsächlich Ruhe. Dies zumindest auf meinem Entwicklungsserver. Der Live-Server kommt jetzt an die Reihe.

Was mich wurmt: Ich finde keine Erklärung dafür. Es scheint eindeutig an den IP6 Zugriffen zu liegen. Ein Bug in Monit?

Nochmals 1000 Dank für die Hilfe.

EDIT: Problem gelöst. Der Live-Server zeigt über 18 Stunden keinerlei Auffälligkeiten mehr. Es muss somit an den stochastischen IP6 Zugriffen gelegen haben.
 
Last edited by a moderator:

Top