Installation des proxy inverses Pound et Varnish

Un proxy inverse ou reverse proxy est un type de serveur, placé frontalement sur internet.
Il permet à un utilisateur d’Internet d’accéder à des serveurs placés dans un LAN.
Pour plus d’informations sur les possibilités d’un proxy inverse, consultez Wikipedia.
Pound et Varnish sont des proxy inverses et ils seront utilisés en complément l’un de l’autre.
Cet article s’oriente donc sur l’usage de reverse proxy HTTPS vers HTTP avec un Mémoire cache.
Un article intéressant sur le reverse proxy en 5 questions.

Les reverses proxy : Pound et Varnish

Pound est un reverse proxy très léger et performant, capable de traiter les requêtes HTTPS et il peut répartir la charge de travail en envoyant les requêtes Web aux machines les moins occupées.
Varnish est un accélérateur HTTP son rôle est de mettre en cache les requêtes web.
Situé dans une position idéale, il soulage les serveurs web avec des possibilités de configuration très poussées avec son langage de programmation : Varnish Configuration Language.

Utilisation de Pound et Varnish  :

Détail du fonctionnement :

Vyatta englobe notre réseau en plusieurs zones : Bleu, Violette, Orange.
L’IP public (eth0) est naté vers l’IP privé (eth1) de Pound et accepte les protocoles : 80 et 443.
Pound réceptionne les requêtes et les fait suivre à Varnish en HTTP.
Puis, Varnish renvoie la requête vers l’un et/ou l’autre des serveurs : OwnCloud et ou Diaspora.
A l’intérieur de notre LAN, les requêtes sont en clair car Varnish ne travaille pas en HTTPS.
Chaque requête traitée par Varnish peut être mise en cache, suivant le fichier de configuration.
Dans mon article, Varnish et Pound seront installés sur le même serveur Debian 7 :

En plus de fournir une accélération web, et une protection logiciel, la High Scalability est possible.

Installation de Pound version 2.6

Pound sera installé sous la distribution Linux Debian 7, en version stable : Pound 2.6
Nous devons rajouter le dépôt officiel de Debian France dans la source liste :

nano /etc/apt/source.list

Rajouter le miroir qui contient le paquet de Pound :

deb http://ftp.fr.debian.org/debian wheezy main

Synchroniser vos miroirs et installer les updates disponibles :

apt-get update && apt-get upgrade

Installer Pound :

apt-get install pound

Configuration de Pound version 2.6

Avant de commencer, je vous conseille de lancer Pound à chaque démarrage :

nano /etc/default/pound

Modifier l’option suivante:

startup=1

Pour la suite, le fichier de configuration est pound.cfg, ouvrez-le :

nano /etc/pound/pound.cfg

Mon fichier de configuration  :

## Minimal sample pound.cfg
##
## see pound(8) for details


######################################################################
## global options:

User            "www-data"
Group           "www-data"
#RootJail       "/chroot/pound"

## Logging: (goes to syslog by default)
##      0       no logging
##      1       normal
##      2       extended
##      3       Apache-style (common log format)
LogLevel        1

## check backend every X secs:
Alive           30

## use hardware-accelleration card supported by openssl(1):
#SSLEngine      ""

# poundctl control socket
Control "/var/run/pound/poundctl.socket"


######################################################################
## listen, redirect and ... to:

## redirect all requests on port 8080 ("ListenHTTP") to the local webserver (see "Service" below):
ListenHTTPS
        Address 192.168.0.2
        Port 443
        Cert "/etc/pound/ssl/owncloud/owncloud.kassianoff.pem"
        Cert "/etc/pound/ssl/diaspora/diaspora.kassianoff.pem"
        AddHeader "X-Forwarded-Proto: https"
        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
        xHTTP           2
        Service
                BackEnd
                        Address 127.0.0.1
                        Port    80
                End
        End
End

Pound est exécuté avec l’utilisateur www-data et écoute sur le port 443 (https) sur 192.168.0.2.
Deux certificats sont générés pour les deux sous-domaines : OwnCloud et Diaspora.
Vérifier que le nom du certificat est identique à votre nom de domaine sans l’extension du domaine :

Cert "/etc/pound/ssl/nom_de_domaine/nom_de_domaine_.pem"

Varnish écoute sur le port 80 et est installé sur le même serveur que Pound d’où le « BackEnd« .
La requête HTTPS est envoyée sur l’adresse 127.0.0.1 du port 80,  Varnish va continuer le processus. Information : pour générer un certificat autosigné (source).

openssl req -x509 -newkey rsa:1024 -keyout local.server.pem -out local.server.pem -days 365 -nodes

Un petit redémarrage de Pound afin de prendre en compte la configuration ;

/etc/init.d/pound restart

La configuration de Pound est terminé,  pour plus d’information : rendez-vous sur le site officiel.

Installation de Varnish

Le paquet de Varnish est disponible dans les miroirs par défaut  :

apt-get install Varnish

Configuration de Varnish

La configuration de Varnish est beaucoup plus complexe, car on utilise le langage VCL.
Avant de se lancer dans la configuration de Varnish, modifier ce fichier  :

nano /etc/default/varnish

Modifier le port d’écoute de Varnish en « 80 » :

# Configuration file for varnish
#
# /etc/init.d/varnish expects the variables $DAEMON_OPTS, $NFILES and $MEMLOCK
# to be set from this shell script fragment.
#
# Note: If systemd is installed, this file is obsolete and ignored.  You will
# need to copy /lib/systemd/system/varnish.service to /etc/systemd/system/ and
# edit that file.

# Should we start varnishd at boot?  Set to "no" to disable.
START=yes

# Maximum number of open files (for ulimit -n)
NFILES=131072

## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.  Use a 1GB
# fixed-size cache file.
#
DAEMON_OPTS="-a :80 
             -T localhost:6082 
             -f /etc/varnish/default.vcl 
             -S /etc/varnish/secret 
             -p send_timeout=1800 
             -s malloc,256m"

Comme précisé dans la variable « DAEMON_OPTS » modifier le fichier de configuration par défaut.

nano /etc/varnish/default.vcl

On retrouve la configuration de Varnish avec le langage VCL :

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition.  Set this to point to your content
# server.
#
backend owncloud {
    .host = "192.168.1.2";
    .port = "80";
}
backend diaspora {
    .host = "192.168.1.3";
    .port = "8080";
}
sub vcl_recv {
        if(req.http.host == "owncloud.kassianoff.fr"){
                   set req.backend = owncloud;
        }
        if(req.http.host == "diaspora.kassianoff.fr"){
                   set req.backend = diaspora;
        }

#if(req.http.authorization || req.request == "POST" || req.http.cookie){
#                   return(pass);
#        }

        return(pipe);

Ajouter les deux « Backend » avec un nom distinct pour chacun d’entre eux et insérer « host » et « port« .
Le port d’écoute du serveur WEB de diaspora a été modifié à titre de démonstration.
La condition « sub vcl_recv » permet de choisir en fonction de la requête le bon « Backend ».

La configuration de Varnish est terminée,  relancer le processus :

/etc/init.d/varnish reload

Une fois fait votre reverse proxy HTTPS et le cache Varnish doivent être fonctionnels.
Comme le montre la capture de Firefox (outils développeur web) sur un de mes sous-domaine :

Sous ownCloud plusieurs problèmes peuvent survenir, notamment avec le partage de fichier.
Dans le « vhost » de votre serveur web ownCloud ajouter :

RequestHeader add X-Forwarded-Proto https

Activez le mode « headers » avec Apache2 :

a2enmod headers

L’initiation à Pound et Varnish est terminée, je vous encourage à continuer l’apprentissage de Varnish.