NRW:Arbeitsgruppe/Technik/Varnish/LTW2012

Aus Piratenwiki
Wechseln zu: Navigation, Suche
ACHTUNG: Die Informationen hier im Wiki sind momentan nicht vollständig aktualisiert.
AG Technik NRW
Verwaltung: Übersicht | Protokolle | Dokumentation | FAQ
Dienste: E-Mail | Lists | Webcache | Blogs | Wikimirror | Domains | RT | Mumble | LAN | Serverstatus


Caching Server zur LTW2012

Zur Landtagswahl 2012 in NRW erwarten wir einigen Besucheransturm auf unserer Website. Da wir nicht genügend Bandbreite zur Verfügung stellen können, sind wir auf Hilfe anderer Piraten angewiesen. Ihr könnt sehr einfach helfen, wenn ihr einen dedizierten linuxbasierten Server und einiges an Traffic übrig habt. Bitte stellt unbedingt sicher, dass der Server gut erreichbar ist und euch keine zusätzlichen Kosten durch Traffic entstehen!

Die Server sollten mindestens über eine 100MBit/s Anbindung verfügen und 100GB Traffic bereitstellen dürfen. Dedizierte Server werden bevorzugt, da vServer meist wenig Ressourcen zugewiesen bekommen und die Bandbreite mit anderen Instanzen auf dem Hostsystem geteilt werden muss. Checkt bitte auch, ob die Geschäftsbedingungen eures Hosting-Vertrags die Nutzung als Mirrorserver erlauben.

Sollte es einmal Probleme mit irgend einem Server geben, meldet euch bitte möglichst schnell bei Martin Braun.

Server

Folgende Server liefern die Website des Landesverbands NRW aus

Nr. Ansprechpartner ipv4 ipv6 Anbindung Bemerkungen
1 Martin Braun 93.190.95.234 - 100 Mbit ComTrance, Düsseldorf
2 Martin Zieroth 91.121.203.85 - 100 Mbit OVH, Roubaix
3 Theodor Reppe 176.9.171.14 2a01:4f8:151:7202:171:14:0:1 1 Gbit Hetzner, Falkenstein
4 Rainer Bendig 46.4.177.5 - 100 Mbit Hetzner, Nürnberg
5 Alexander Brückel 176.9.204.245 - 100 Mbit Hetzner, Falkenstein
6 Sascha Körver 217.115.138.72 - 100 Mbit Host Europe, Köln
7 Thomas Göttgens 94.23.160.72 - 100 Mbit OVH, Roubaix
8 Wolfgang Steinert 78.46.227.166 - 100 Mbit Hetzner, Falkenstein
9 Tim Reuter 176.28.10.217 - 100 Mbit Host Europe, Köln
10 Christoph G. 89.238.81.237 - 100 Mbit Manitu, St. Wendel
11 Martin Braun 84.246.124.133 - 1 Gbit ConnectingBytes, Düsseldorf

How-To

So setzt ihr einen Server auf, der beim caching hilft.

  • Installiert Debian Squeeze oder Wheezy
  • Führt eine minimale Installation durch, alle zusätzlichen Pakete während der Installation bei "tasksel" abwählen
apt-get update
apt-get dist-upgrade
apt-get install ssh
  • Schaltet PasswordAuthentication in der /etc/ssh/sshd_config ab, das ist eine potentielle Sicherheitslücke
  • Kopiert euren public-key in die .ssh/authorized_keys Datei um euch per SSH und asymmetrischer Verschlüsselung anzumelden
  • Falls ihr Squeeze benutzt, fügt das Debian Wheezy repo in der /etc/apt/sources.list hinzu um Varnish 3.0 zu installieren
deb http://ftp.de.debian.org/debian/ wheezy main
  • Nun die Paketquellen neu laden
apt-get update
  • Und Varnish installieren. GCC muss je nach System zusätzlich angegeben werden.
apt-get install varnish gcc
  • Stellt sicher dass Varnish 3.0 installiert wurde
dpkg -la | grep varnish
ii  libvarnishapi1                     3.0.2-1                      shared libraries for Varnish
ii  varnish                            3.0.2-1                      state of the art, high-performance web accelerator
  • Jetzt könnt ihr das Wheezy repo wieder entfernen
  • Editiert die Datei /etc/default/varnish, und ersetzt ihren Inhalt mit der hier bereitgestellten Konfiguration
  • Editiert die Datei /etc/varnish/default.vcl, und ersetzt ihren Inhalt mit der hier bereitgestellten Konfiguration
  • Startet Varnish neu, damit die Konfiguration aktiv wird
/etc/init.d/varnish restart
  • Testet euer Setup um sicherzustellen dass auch die korrekte Seite ausgeliefert wird
  • Meldet uns die externe IP Adresse eures Servers, damit wir ihn in die Lastverteilung einbauen können

Varnish Konfiguration

Tragt folgende Konfiguration in der /etc/default/varnish ein. Beachtet dass -a auf :80 gesetzt ist, sonst lauscht Varnish auf einem anderen Port.

DAEMON_OPTS="-a :80 \
            -T localhost:6082 \
            -f /etc/varnish/default.vcl \
            -S /etc/varnish/secret \
            -s malloc,256m"


Tragt folgende Konfiguration in der /etc/varnish/default.vcl ein

backend default {
   .host = "84.246.124.133";
   .port = "8080";
}

sub vcl_fetch {
   set beresp.ttl   = 300s;

   if (req.url ~ "\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$") {
           unset beresp.http.set-cookie;
           set beresp.ttl   = 10m;
   }

   if (req.http.Cookie ~"(wp-postpass|wordpress_logged_in|comment_author_)") {
       set beresp.ttl = 0s;
   } else {
       set beresp.ttl=10m;
   }

   if (!beresp.ttl > 0s) {
       set beresp.http.X-Cacheable = "NO:Not Cacheable";
   } else if ( req.http.Cookie ~"(wp-postpass|wordpress_logged_in|comment_author_)" ) {
       set beresp.http.X-Cacheable = "NO:Got Session";
       return(hit_for_pass);
   }  else if ( beresp.http.Cache-Control ~ "private") {
       set beresp.http.X-Cacheable = "NO:Cache-Control=private";
       return(hit_for_pass);
   } else if ( beresp.ttl < 1s ) {
       set beresp.ttl   = 300s;
       set beresp.grace = 300s;
       set beresp.http.X-Cacheable = "YES:Forced";
   } else {
       set beresp.http.X-Cacheable = "YES";
   }
   if (beresp.status == 404 || beresp.status >= 500) {
       set beresp.ttl = 0s;
   }

   return(deliver);
}

sub vcl_hash {
   if ( req.http.Cookie ~"(wp-postpass|wordpress_logged_in|comment_author_)" ) {
       #set req.hash += req.http.Cookie;
       hash_data(req.http.Cookie);
        }
}

sub vcl_deliver {
   remove resp.http.X-Varnish;
   remove resp.http.Via;
   remove resp.http.Age;
   remove resp.http.X-Powered-By;
}

sub vcl_recv {
   set req.url = regsub(req.url, "\?ver=.*$", "");
   set req.url = regsub(req.url, "\?replytocom=.*$", "");

   remove req.http.X-Forwarded-For;
   set    req.http.X-Forwarded-For = client.ip;

   set req.grace = 120s;
   if (req.url ~ "\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$") {
       unset req.http.Cookie;
       return(lookup);
   }
   set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", "");
   set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
   if (req.http.Cookie ~ "^\s*$") {
       unset req.http.Cookie;
   }
   if (req.request == "PURGE") {
       if (!client.ip ~ purgehosts) {
               error 405 "Not allowed.";
       }
       ban("req.url ~ " + req.url + " && req.http.host == " + req.http.host);
       error 200 "Purged.";
   }

   if (req.request != "GET" && req.request != "HEAD") {
       return( pass );
   }

   set req.http.cookie = regsub(req.http.cookie, "1231111111111111122222222333333=[^;]+(; )?", "");

   if (req.request == "GET" && (req.url ~ "(wp-admin|bb-admin|server-status|feed)")) {
       return(pipe);
   }
   if (req.http.Cookie && req.http.Cookie ~ "(wordpress_|PHPSESSID)") {
       return(lookup);
   }
   if(req.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache" || req.url ~ "(control.php|wp-comments-post.php|wp-login.php|bb-login.php|bb-reset-password.php|register.php)") {
       return (pass);
   }
   return( lookup );
}

acl purgehosts {
   "localhost";
   "www.piratenpartei-nrw.de";
   "piratenpartei-nrw.de";
}

Testen

Setzt die domain "www.piratenpartei-nrw.de" in der /etc/hosts (Linux/OSX) oder c:\windows\system32\drivers\etc\hosts (Windows) auf die externe IP eures Servers und navigiert mit eurem Browser auf "www.piratenpartei-nrw.de"

123.123.123.123 www.piratenpartei-nrw.de