HTTP und HTTPS Proxy mit Pound, Varnish und Apache unter Debian

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche
Hinweis: Bitte beachten Sie, dass dieser Artikel / diese Kategorie sich entweder auf ältere Software/Hardware Komponenten bezieht oder aus sonstigen Gründen nicht mehr gewartet wird.
Diese Seite wird nicht mehr aktualisiert und ist rein zu Referenzzwecken noch hier im Archiv abrufbar.

Der folgende Artikel zeigt, wie ein HTTP und HTTPS Proxy mit Pound, Varnish und Apache unter Debian aufgebaut werden kann. Ziel des Setups ist es, Apache-Inhalte mit Varnish sowohl für HTTP als auch für HTTPS zu cachen. Da Varnish nicht für HTTPS-Caching konzipiert ist, terminiert Pound als SSL Wrapper die HTTPS-Verbindung und leitet die Anfragen per HTTP an Varnish weiter, der für alle Inhalte des Apache als Cache fungiert.

Architektur

Aufbau von Pound, vor Varnish und Apache.

Die Abbildung rechts zeigt den schematischen Aufbau der Komponenten:

  • Pound (apsis.ch): SSL Wrapper und Reverse Proxy
  • Varnish (varnish-cache.org): Web Accelerator bzw. Caching Server
  • Apache (apache.org): Web Server

Diese übernehmen dabei folgende Aufgaben:

  1. Pound nimmt alle Client-Anfragen von außen entgegen:
    • HTTP Anfragen empfängt Pound auf Port 80.
    • HTTPS Anfragen empfängt Pound auf Port 443. In der Pound Konfiguration wird dazu das SSL-Zertifkat eingebunden.
  2. Pound leitet alle Anfragen per HTTP (unverschlüsselt) an das Varnish-Backend weiter. Varnish nimmt diese auf Port 8080 entgegen. Befinden sich die angefragten Daten im Cache, wird kein Request an den Apache-Server durchgeführt, sondern direkt der Cache-Inhalt zurückgeliefert. Dieser Caching-Mechanismus funktioniert aus Client-Sicht für HTTP und HTTPS. Aus Sicht von Varnish finden nur HTTP-Verbindungen (hin zum Pound Reverse Proxy) statt.
  3. Als letzter Teil der Kette tritt der Apache-Server auf. Dieser lauscht lokal auf Port 8000 und kommuniziert ausschließlich per HTTP mit Varnish. Apache benötigt daher nur Virtual Hosts für HTTP auf Port 8000. Das Apache-Modul ssl und eigene Virtual Hosts für HTTPS werden nicht konfiguriert.

Eine eindrückliche Erklärung dieses Aufbaus ist auch in der Präsentation Understanding High Performance Caching with SSL vom DrupalCampNJ 2013 zu finden.[1]

Installation

Unter Debian 7 Wheezy befinden sich Pound, Varnish und Apache in den offiziellen Repositories:

Die Pakete werden mit folgendem Kommando installiert:

$ sudo apt-get install apache2 varnish pound

Konfiguration

Die Konfiguration wird im Bottom Up Stil vorgenommen.

Apache

Das Web Server Backend wird so konfiguriert, dass es nur mehr lokal auf Port 8000 lauscht:

$ sudo vi /etc/apache2/ports.conf
NameVirtualHost 127.0.0.1:8000
Listen 127.0.0.1:8000
[...]
$ sudo vi /etc/apache2/sites-enabled/000-default 
SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on
<VirtualHost 127.0.0.1:8000>
[...]

Die Konfigurationszeile SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on lässt Applikationen, die auf eine HTTPS-Verbindung prüfen, glauben, dass HTTPS gesetzt ist. Da auf Pound-Ebene HTTPS bereits terminiert wird, muss die Information "HTTPS=on" auf diesem Weg an Apache durch gereicht werden.[2]

Um in den Apache Log-Dateien die eigentlich IP der Clients anzuzeigen, wird für Apache ein eigenes Log-Format definiert:[3]

$ sudo vi /etc/apache2/conf.d/varnish-log 
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined
$ sudo vi /etc/apache2/sites-enabled/000-default
[...]
CustomLog ${APACHE_LOG_DIR}/varnish_access.log varnishcombined
</VirtualHost>

Varnish

Im ersten Schritt wird Varnish so konfiguriert, dass er auf Port 8080 lauscht. Soll Varnish nur lokal laufen, kann - wie in der nachfolgenden Konfiguration - dem Port localhost voran gestellt werden (Zeile 46):

$ sudo vi /etc/default/varnish
[...]
DAEMON_OPTS="-a localhost:8080 \
             -T localhost:6082 \
             -f /etc/varnish/debian.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"
[...]

Im zweiten Schritt wird für Varnish ein Backend als Verbindung zu Apache konfiguriert. Da Apache auf Port 8000 lauscht, wird hier dieser Port angegeben. Die Abschnitte zu HIT und MISS zeigen, wann Varnish Inhalte aus dem Cache ausliefert.[4]

backend www {
        .host = "127.0.0.1";
        .port = "8000";
}
## Deliver
sub vcl_deliver {
        ## By removing X-Powered-By the varnish signature is removed
        remove resp.http.X-Powered-By;
        if (obj.hits > 0) {
                set resp.http.X-Cache = "HIT";
                set resp.http.X-Cache-Hits = obj.hits;
        } else {
                set resp.http.X-Cache = "MISS";
        }
        return(deliver);
}

Pound

Damit Pound nach der Installation startet, wird folgende Option gesetzt:

$ sudo vi /etc/default/pound 
[...]
startup=1

Die Backend-Verbindung zu Varnish wird wie folgt konfiguriert:

ListenHTTP
        Address 192.168.56.101
        Port    80
        Service
                BackEnd
                        Address 127.0.0.1
                        Port    8080
                End
        End
End
ListenHTTPS
        HeadRemove "X-Forwarded-Proto"
        AddHeader "X-Forwarded-Proto: https"
        Address 192.168.56.101
        Port 443
        Cert "/etc/ssl/certs/ssl-cert-snakeoil.pem"
        Service
                Backend
                        Address 127.0.0.1
                        Port 8080
                End
        End
End

Achtung: Bezüglich des SSL-Zertifikats im pem-Format, dieses muss auch den Private Key enthalten (vgl. /usr/share/doc/pound/FAQ.gz):

4.3 Pound does not start with message "can't read private key": The file you specify in the ListenHTTPS directive must contain both the server certificate and the private key to it in PEM format. See the man page for SSL_CTX_use_PrivateKey_file(3) for details.

Für das obige Beispiel mit dem default snakeoil Zertifikat genügt ein Aufruf von:

# cat /etc/ssl/private/ssl-cert-snakeoil.key >> /etc/ssl/certs/ssl-cert-snakeoil.pem

Abschließend werden alle Dienste neu gestartet:

sudo service apache2 restart && sudo service varnish restart && sudo service pound restart

Verbindung testen

Ein einfacher Test mit curl zeigt, ob Request von Varnish gecacht werden:

$ curl -k -I https://192.168.56.101
HTTP/1.1 200 OK
Server: Apache/2.2.22 (Debian)
Last-Modified: Tue, 07 Oct 2014 06:22:35 GMT
ETag: "6ddd-b1-504cf39acc9cb"
Vary: Accept-Encoding
Content-Type: text/html
Date: Thu, 09 Oct 2014 19:39:50 GMT
X-Varnish: 774518538 774518536
Age: 5
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT
X-Cache-Hits: 2

Einzelnachweise

  1. Understanding High Performance Caching with SSL DrupalCampNJ 2013 (slideshare.net)
  2. Redirect Loop in PHP behind a Load Balancer with SSL (stackoverflow.com)
  3. Varnish HTTP FAQ (www.varnish-cache.org)
  4. Adding a header indicating hit/miss (varnish-cache.org)


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

Anleitung zur Installation des TK-Debian Basissystems
Debian Mirror
Subversion unter Debian mit Webaccess