Sonntag, 30. August 2009

Webseiten automatisch vor Überlast schützen am Beispiel einer MediaWiki-Seite

Das Szenario: Man ist stolzer Betreiber eines eigenen Servers auf dem ein Wiki läuft. Plötzlich berichtet Heise über das eigene Projekt oder man wird von einer anderen der großen Nachrichten-Portale verlinkt und plötzlich geht auf dem Server gar nichts mehr. Selbst der Zugriff per SSH um zu schauen was los ist funktioniert nicht mehr richtig und alle Nagios-Instanzen schlagen Alarm.

Damit es zu diesem Szenario nicht kommt, gibt es natürlich verschiedene Ansätze. Von redundant vorgehaltenen Servern, die per DNS Round-Robin angesprochen werden, über Loadbalancer auf Routingbasis, etc.

Viele dieser Maßnahmen sind aber entweder recht kostspielig oder haben den Nachteil nicht so gut mit soetwas wie einem Wiki zusammenzuarbeiten.

Es gibt aber eine weitere Möglichkeit, die den Dienst http://coralcdn.org benutzt.

Coral Content Distribution Network

Das Coral Content Distribution Network funktioniert transparent durch das Anhängen einer Domain des Dienstes an eine beliebige Webadresse. So wird aus www.google.de ganz schnell die gecachte Version, wenn man statt dessen www.google.de.nyud.net aufruft.

An dieser Stelle vielen Dank an rbu für den Hinweis auf Coral!

Doch wie kann man diesen Dienst benutzen, um ein Wiki bei Überlast des Servers noch einigermassen erreichbar zu halten?

Ein eigener Host für Coral

Zunächst habe ich zum Testen einen weiteren Virtual Host für das Wiki aufgesetzt, so dass ich dort Einstellungen machen kann, ohne das Wiki unbrauchbar zu machen.

Ausserdem hat das den Vorteil, dass ich https-Zugriffe verhindern bzw. umlenken kann, die über Coral natürlich nicht richtig funktionieren.

Und, noch etwas, dieser Virtual Host soll später vielleicht mal auf einen weiteren Rechner umziehen und kann so noch mehr Last abfedern, indem er statische Dateien wie Bilder direkt aus seinem Cache ausliefert.

Dieser VHost hört auf den originellen Namen cache.meinedomain.tld.

Folgende Parameter wurden (zusätzlich) gesetzt:


      #Dies soll ein Proxy werden, also Zugriff auf
      #folgende Seiten per proxy erlauben:

      <Proxy proxy:http://wiki.meinedomain.tld/ >
            Order deny,allow
            Allow from all
      </Proxy>

      ProxyVia On
      ProxyRequests Off

      #Diese Seite liefern wir auf / aus:
      ProxyPass / http://wiki.meinedomain.tld/
      ProxyPassReverse / http://wiki.meinedomain.tld/

      #Ausserdem Cachen wir auf der Festplatte
      CacheRoot /var/cache/apache2
      CacheDirLevels 2
      CacheDirLength 10
      CacheMinFileSize 10
      CacheMaxFileSize 2000000
      CacheEnable disk /
      CacheEnable disk http://wiki.meinedomain.tld/
      CacheEnable disk proxy:http://wiki.meinedomain.tld/

      #Die Cookies wollen wir nicht mit speichern...
      CacheDefaultExpire 3600
      CacheIgnoreHeaders Set-Cookie

      # Bis hier war das nur die (optionale) proxy-Konfiguration
      # kommen wir nun zum LoadBalancer

      RewriteEngine on
      RewriteCond %{HTTP_USER_AGENT} !^CoralWebPrx
      RewriteCond %{QUERY_STRING} !(^|&)coral-no-serve$
      RewriteMap    lb      prg:/var/www/loadbalance.sh
      RewriteCond   ${lb:%{REQUEST_URI}|NULL} !^NULL
      RewriteRule   ^(.*)$ ${lb:$1|%1}           [P,L]

Der zweite Block definiert ein shellscript als Entscheidungshilfe für das Ziel eines Redirects, wenn der Request nicht von dem coral-webproxy kam. Diese Ausnahme müssen wir konfigurieren, da wir sonst den Coral-Server auf sich selbst umlenken würden.

Und dieses Script ist auch schon das Geheimnis.

Das Redirect-Script

Das folgende Script wird vom apache sofort beim Start geforkt und erhält auf stdin fortan die angefragte URL und kann auf stdout dann ausgeben, wohin denn der Request umgelenkt werden soll.

Damit kann man nun nach eigenem Ermessen Paramter suchen, die für einen Redirect sorgen sollen.

Ich nehme hier das maximum von zweien der Load-Werte, so dass bei zuviel Ansturm die Besucher umgelenkt werden und mit Abflauen des Ansturms (die Besucher bleiben dann ja auf dem Proxy) auch wieder neue Besucherrequests angenommen werden.

Ein wenig zusammengehackt und sicherlich nicht die schnellste Implementierung, aber es erfüllt erstmal seinen Zweck, sollte aber durch ein C-Programm ersetzt werden, welches ein _wenig_ effizienter implementiert ist.

#!/bin/bash

loadbalancer="cache.meinedomain.tld.nyud.net";

while read LINE; do
 load="$(awk '{gsub("\\.",""); if ($1>$2){ print $1} else { print $2 }  }'< /proc/loadavg)"
 if [ "$load" -gt "$(cat /var/www/maxload.conf)" ]; then
   logger -t "loadbalance-cache" "redirecting due to load=$load. request: $LINE"
   printf "http://%s/%s\n" "${loadbalancer}" "${LINE}"
 else
   printf "NULL\n"
 fi
done

In der Datei /var/www/maxload.conf habe ich testweise einfach die Zahl 550 eingetragen, so dass ab einer Load größer 5.5 ein Redirect erfolgt.

Konfiguration des Wikis

Bei Zugriffen über den Proxy muss das Wiki read-only arbeiten. Dafür gibt es mehrere Gründe:

Zum Einen sollen nicht die privaten Previews eines Benutzers gecached werden, zum anderen redirecten wir ja wegen hoher Last - und ein Edit eines Artikels wird sicherlich nicht zum Senken der Last beitragen.

Dazu gibt es einen Codeblock in der LocalSettings.php des Wikis:

if ( preg_match( "/^CoralWebPrx/", $_SERVER['HTTP_USER_AGENT']) > 0
    || preg_match( "/coral-no-serve$/", $_SERVER['QUERY_STRING']) > 0) {

 $wgReadOnly="<span style=\"background-color:yellow;\">Das Wiki ist aus Lastgründen read-only. Du greifst daher gerade über ein Cache auf eine gespeicherte Version zu.</span>";
}

Dadurch verlieren wir zwar auch die PageHits-Zählung im Wiki, aber über einen Proxy werden diese ohnhin nicht mehr korrekt gezählt.

Konfiguration des Wiki-Hosts

Nachdem alles getestet ist und funktioniert, können wir bei Überlast alle Requests auf den Wikiserver direkt auf die cache-Variante von Coral lenken. Dies machen wir mit einigen Zeilen in der Definition des Virtual Hosts:

RewriteEngine on
RewriteMap    lbwiki      prg:/var/www/wiki.meinedomain.tld/loadbalance.sh
Folgende Regeln fügen wir nun an die .htaccess des Wikis an. Das muss geschehen, da wir dort noch andere Rewrite-Regeln definiert haben.
# Alle requests des coral-proxies auf den cache lenken,
# requests von unserem Cache nicht auf unser Cache umlenken.
RewriteCond %{REMOTE_ADDR} !^127.0.0.1$
RewriteCond %{REMOTE_ADDR} !^IP.DES.EIGENEN.PROXIES$
RewriteCond %{HTTP_USER_AGENT} ^CoralWebPrx
RewriteRule   ^(.*)$ http://cache.meinedomain.tld/$1           [R,L]

RewriteCond %{REMOTE_ADDR} !^127.0.0.1$
RewriteCond %{REMOTE_ADDR} !^IP_DES_CACHES$
RewriteCond %{QUERY_STRING} (^|&)coral-no-serve$
RewriteRule   ^(.*)$ http://cache.meinedomain.tld/$1           [R,L]


#Folgender Block prueft ob die load zu hoch ist und
#redirected dann auf den gecachten cache...
#RewriteMaps muessen global in der vhost konfig gemacht werden.
RewriteCond %{REMOTE_ADDR} !^127.0.0.1$
RewriteCond %{REMOTE_ADDR} !^IP_DES_CACHES$
RewriteCond %{HTTP_USER_AGENT} !^CoralWebPrx
RewriteCond %{QUERY_STRING} !(^|&)coral-no-serve$
RewriteCond   ${lbwiki:%{REQUEST_URI}|NULL} !^NULL
RewriteRule   ^(.*)$ ${lbwiki:$1|%1}           [R,L]


Wichtig ist hier, dem LoadBalancer einen anderen Namen zu geben.

Wir benutzen für diesen Artikel wieder dasselbe script, so dass direkt auf den Host cache.meinedomain.tld.nyud.net verwiesen wird.

Der erste Block ist eher 'Kosmetik' und verhindert, dass man auf wiki.meinedomain.tld über Coral zugreifen kann.

Samstag, 29. August 2009

easyjet: was kann man alles falsch machen?

Eine Bekannte schrieb mir, beim Buchen von Flügen per easyJet kämen Zertifikatsfehler. Was das denn zu bedeuten habe?

Das Zertifikat für https://www.easyjet.de ist nur für www.easyjet.com gültig. Nungut, kann passieren. Versuchen wir denen das mal zu sagen... Pustekuchen. Ein Kontaktformular haben die auf ihrer Seite gar nicht. Najaah, schauen wir mal im whois, da wird doch - nein, Fehlanzeige, keine Telefonnummern oder Emailadressen im whois. Nur eine Postadresse in London. Hach, raten wir ne mailadresse per telnet auf port 25:
$ dig mx easyjet.de +short
10 mxhost-2.vi.net.
5 mxhost-1.vi.net.
los gehts:
$ nc mxhost-1.vi.net  25
220 mxhost-1.vi.net ESMTP Postfix
HELO mail.xxxxxxxxxxx.net
250 mxhost-1.vi.net
MAIL FROM: <postmaster@xxxxxxxxxxx.net>
250 2.1.0 Ok
RCPT TO: <webmaster@easyjet.de>
554 5.7.1 <webmaster@easyjet.de>: Relay access denied
wat?! Der für die Domain zuständige MTA weigert sich dorthin zu relayen?

Dann kann und will ich ihnen auch nicht mehr helfen...

Die betreiben da unter easyjet.de Flugbuchungen, aber weder ihr SSL-Zertifikat funktioniert, noch ihr Mailsystem?! Super!

Aber das passt zu den Buchungsmails die sie verschicken. Multipart mit text und html-Teil. Aber: Der Text-Teil ist komplett leer, im html-Teil stehen dann die Buchungsdaten.

Freitag, 28. August 2009

Demokratie in Deutschland...

"Ein unkontrolliertes, geheimes Gremium erstellt unter umgehung aller Gewaltenteilung und aushebelung der Unschuldsvermutung, nur stichprobenartig kontrollierte geheime Listen von geheimen Seiten, die mittels eines geheimen Verfahrens umgesetzt werden. Kontrolle ist illegal, Bekanntmachen ist illegal, umgehen zur Kontrolle ist illegal. Danach fragen macht verdächtig, versehentlicht darauf landen macht verdächtig, dagegen sein macht verdächtig." Quelle: Heise-Forum

Natürlich ist das Gesetz keine Zensur, noch nicht, weil noch werden angeblich nur illegale Inhalte gefiltert. Eine umfassende Kontrolle findet jedoch nicht statt, und wer sagt denn, dass die Liste, die das BKA an die Kontrollorgane weitergibt, identisch mit der ist, die an die Provider geschickt wird. Immerhin ist es vorgesehen, dass die Liste sich alle paar Stunden ändern kann. Da hat man halt kurz nach dem Versenden an die Kontrollorgane die Liste schon wieder geändert und sich leider in der Version vertan

Aber in Deutschland ist ja auch mittlerweile normal, dass im Parlament Aussprachen nur noch schriftlich stattfinden, ohne dass die Redebeiträge gehalten werden. Wenn es dann doch mal sogenannte Debatten gibt, finden diese auch mal nachts um halb vier statt, und ein Agrarausschuss entscheidet über IT-Themen.

Der einzelne Parlamentarier fühlt sich dem Fraktionszwang verpflichtet und stimmt dann auch mal "mit Bauchschmerzen" für ein Gesetz, dass er für falsch hält. Danach hat der Parlamentatier auch noch die Stirn, dies zu sagen, verbunden damit, er gehe ja ohnehin davon aus, dass das Bundesverfassungsgericht das Gesetz stoppt.

Dann haben wir noch eine spezielle Ministerin, die von ihr selbst in Auftrag gegebene Gutachten als "unterirdisch" bezeichnet und dieses sowie alle Experten schlicht ignoriert.

Andere Minister vergeben den Auftrag Gesetze zu machen dafür gleich ganz an ausländische Anwaltkanzleien oder haben in ihrem Ministerium Angestellte, mit eigenem Büro, die von der Industrie bezahlt werden und an den Gesetzen mitarbeiten, die dann für diese Industrie gelten. Natürlich nur, um den Sachverstand zu nutzen, den diese mitbringen, und einen lebendigen Austausch zwischen Wirtschaft und Politik zu ermöglichen.

Fazit: Ich fühle mich jedenfalls derzeit verkauft und verraten von diesen sogenannten Volksvertretern und werde meine Kreuze entsprechend setzen.

Andererseits: Vielleicht habe ich das auch nur falsch verstanden, Staubsaugervertreter setzen sich ja auch nicht für die Rechte von Staubsaugern ein...

Montag, 3. August 2009

Zwischenruf und Nachdenkliches zum Urlaub

Bevor es ein paar Tage Urlaub gibt, sind mir doch noch ein paar Dinge über den Schirm gelaufen, die mich beschäftigen.

Zum Einen der Zwischenruf von Hans-Ulrich Jörges im Stern.

Er spricht mir in so vielen Punkten aus der Seele. Wenn ich mir ansehe, dass in diesem Land Gesetze nicht mehr im Parlament verhandelt, sondern dort lediglich noch die Reden schriftlich zu Protokoll gegeben werden, wenn ich höre, dass man der Fraktionsdisziplin wegen für das Gesetz stimmt, aber nur mit Bauchschmerzen, aber man ja ohnehin davon ausgeht, dass das Verfassungsgericht das Gesetz für nichtig erklärt - da frage ich mich schon, was aus unserer Demokratie geworden ist.

Dann kommt auch noch ein so genanannter Spitzenkandidat aus Sachsen, der Herr Thomas Jurk, daher und verkündet, dass er über dem Grundgesetz steht, und das ja nicht für alle gelten könne.

Übrigens meinte das auch unser Verteidigungsminister beim Thema des Abschiessens von Passagierflugzeugen. Man würde sich schon einen Piloten suchen, der den Befehl ausführt. Dies verstößt aber gegen das Urteil des Verfassungsgerichts.

Gleichzeitig werden Milliarden in die Autoindustrie geblasen um vor der Wahl ein Strohfeuer zu entfachen, damit es ja nicht vor der Wahl zu einem Kollaps kommt. Was die Banken an Steuergeldern verbrannt haben, darüber möchte ich gar nicht erst nachdenken - aber schön, dass sie alle schon wieder Gewinn erwirtschaften und Boni zahlen können. Nun, die Manager haben ja auch erfolgreich neues Geld aquiriert - von daher, chapeau!

Aber was mich wirklich aufregt ist, wie dreist man belogen wird. Wieder und wieder aus dem Hause unserer Familienministerin Zensursula von der Leyen.

Diesmal blamiert sie uns zwar nicht bei den Indern, so dass es keine Entschuldigung an die Indische Botschaft geben muss, nein, diesmal vertritt sie die Meinung, dass man auch mal darüber nachdenken könne andere Inhalte im Internet ebenfalls zu verstoppschildern.

Getreu dem Motto was schert mich heut mein Geschwätz von Gestern. Toll!

Gleichzeitig frage ich mich immer wieder, was die ganzen Kinder eigentlich unbeaufsichtigt im Internet machen, die man hier in Chatrooms und Social Networks vor irgendwas schützen muss.

Immerhin lassen die Erziehungsberechtigten die Kinder hier mir einem Kriegsinstrument unbeaufsichtigt alleine!

Das Internet ist von Wissenschaftlern für die Wissenschaft ersonnen und später durch das Militär weiterentwickelt worden.

Aber im Ernst: Kann man wenn man unter 18 Jahre alt ist einen eigenen Internetanschluss bekommen? Geht das ohne volle Geschäftsfähigkeit? Nein? Ach! Wie also kommen die 8-12 Jährigen dann ins Internet - wer missachtet da seine Aufsichtspflicht?