To content | To menu | To search


C'est vraiment du travail de poundé

Sur ce serveur j'utilise l'excellent reverse-proxy Varnish, qui permet à n'importe quelle bouse application un peu lourde de tenir la charge, et surtout, de s'exécuter plus rapidement. Mais j'utilise aussi beaucoup d'appli web (webmail, lecteur RSS, services Cloud, etc.) auquel je me connecte en mode sécurisé (https), que je juge obligatoire dès qu'il y a authentification. Or, Varnish ne supportant pas l'https, ces sites ne bénéficient pas de l'accélération...

Et puis j'ai trouvé la solution sur cette page : décrypter le flux https avant de le passer à Varnish. Il suffisait d'y penser... On déporte la gestion du SSL du serveur web vers un autre serveur, en l’occurrence et comme conseillé par ladite page, Pound.

Comme indiqué sur le site de Pound, ce n'est pas un serveur web (on continuera d'utiliser Lighttpd pour ça) ni un proxy-cache (on continuera d'utiliser Varnish). Cela lui permet d'être petit et donc, économe en mémoire.

Les infos étant un peu difficiles à trouver, voici quelques astuces:

  • pour que Pound fonctionne à la fois en IPv4 et en IPv6, il faut créer deux listeners, même si leur backend est identique. Je le fais écouter à la porc sur toutes les interfaces, mais rien ne vous empêche de préciser explicitement les IP.
  • ne pas oublier de définir un header indiquant que la page arrive en https; ce header permettra de tester si la page est en https ou non (Pound ne transmettant que du http, Varnish et Lighttpd ne "voient" que le port 80). Ce header pourra être utilisé par Varnish pour rediriger du http vers du https, par exemple.
  • pour le monitoring j'utilise le plugin Nagios check_pound_stat; pour que celui-ci fonctionne (et d'une façon générale si vous voulez utiliser l'utilitaire poundctl), il faut activer le socket d'admin qui ne l'est pas par défaut, via la directive "Control".

Voici donc ce que donne mon fichier pound.cfg:

Control "/var/run/pound.sock"

ListenHTTPS
        Address 0.0.0.0
        Port    443
        Cert    "/etc/ssl/key-cert.pem"
        HeadRemove "X-Forwarded-Proto"
        AddHeader "X-Forwarded-Proto: https"

        Service
                BackEnd
                        Address 127.0.0.1
                        Port    80
                End
        End
End
ListenHTTPS
        Address ::
        Port    443
        Cert    "/etc/ssl/key-cert.pem"
        HeadRemove "X-Forwarded-Proto"
        AddHeader "X-Forwarded-Proto: https"

        Service
                BackEnd
                        Address 127.0.0.1
                        Port    80
                End
        End
End

Côté Varnish, voila comment on redirige automatiquement un client qui se connecte en http vers le https (en fonction du vhost bien sûr, on ne veut pas du https-only partout):

sub vcl_recv {
    if ( (req.http.host ~ "^sub.toto.com" )
         && req.http.X-Forwarded-Proto !~ "(?i)https") {
        set req.http.x-Redir-Url = "https://sub.toto.com" + req.url;
        error 750 req.http.x-Redir-Url;
    }
}

sub vcl_error {
    if (obj.status == 750) {
        set obj.http.Location = obj.response;
        set obj.status = 302;
        return (deliver);
    }
}

PS: Pardon pour le titre. comme d'habitude je me suis senti obligé de faire un jeu de mot bien naze, mais n'y voyez aucun racisme ou autre incitation à la haine raciale, hein. D'ailleurs j'adore le curry et les naan fromage, et j'ai une amie plus noire qu'une indienne ;)

Add a comment

Comments can be formatted using a simple wiki syntax.

This post's comments feed