Utiliser varnish/apache et ssl avec certbot

Logo varnish
Logo varnish

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.

 

Laisser un commentaireAnnuler la réponse.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.