Qu’est-ce que varnish ?
Varnish est un serveur de cache http, permettant une accélération notable des sites web. Il agit comme un proxy inversé.
Problématique
Il est assez facile de mettre en place varnish pour un site web en http (port 80). Toutefois, varnish ne gère pas les certificats ssl, et est donc incapable de diffuser nativement du https. Il existe plusieurs moyens de le contourner, souvent en mettant un nginx « devant » varnish. Cette solution ne me convenait pas, car je voulais rester en tout apache.
Solution
Apache doit rester en frontend sur les ports 80 et 443. Cela permettra à letsencrypt de générer des certificats de façon automatique et de les renouveler. Toutefois, ces ports ne doivent servir qu’à rediriger vers varnish, qui lui écoute sur son port par défaut (le 6081). Apache va également écouter sur le port local (127.0.0.1) sur un port inutilisé pour diffuser le « vrai » site. Dans cet exemple, j’ai choisi le port 9001.
Méthodologie
Prérequis : avoir installé apache et varnish
Il faut activer les modules suivants :
a2enmod headers proxy proxy_connect proxy_html proxy_http
Il faut ajouter un port d’écoute dans apache. Pour cela, éditer le fichier /etc/apache/ports.conf et ajouter
Listen 127.0.0.1:9001
Le fait de rajouter 127.0.0.1 fait que votre serveur ne va pas répondre à une requête directe venant d’un autre ordinateur que lui.
Il faut maintenant dire à varnish que son backend est le localhost, sur le port 9001.
Pour cela, nous allons éditer le fichier /etc/varnish/default.vcl
vcl 4.0; # Default backend definition. Set this to point to your content server. backend default { .host = "localhost"; .port = "9001"; }
Puis il faut redémarrer varnish
systemctl restart varnish
Il faut maintenant modifier le virtualhost du site à diffuser. Pour cela, il faut copier son fichier de conf apache en un nouveau (par exemple monsite_9001.conf), et remplacer
<VirtualHost *:80>
par
<VirtualHost *:9001>
Si jamais ce fichier de conf était modifié par letsencrypt, il faut supprimer toutes les lignes de la fin de fichier, qui correspondent aux url rewriting. En effet, ce virtualhost ne gère aucun certificat ssl.
Il faut maintenant éditer le fichier d’origine (par exemple monsite.conf) et remplacer tout le contenu par ceci :
<VirtualHost *:80> ServerAdmin moi@monsite.net ServerName www.monsite.net ProxyPreserveHost On ProxyRequests On ProxyPass / http://localhost:6081/ ProxyPassReverse / http://localhost:6081/ </VirtualHost>
Ainsi, toutes les requêtes vont être redirigées vers le port 6081. Varnish va y répondre, va interroger le port 9001 et cacher ce qu’il a à cacher, et retourner la requête.
Il faut maintenant redémarrer apache :
systemctl restart apache2
Une fois testé, vous pouvez lancer certbot pour générer les certificats ssl, comme d’habitude.
Vous pouvez utiliser cette méthode pour tous les virtualhosts de votre serveur. En effet, varnish fait suivre les headers à apache, et ce dernier va bien répondre à votre requête.