Base de connaissances

1 000 FAQ, 500 tutoriels et vidéos explicatives. Ici, il n'y a que des solutions !

Utiliser Varnish sur Serveur Cloud

Ce guide présente plusieurs exemples d'utilisation de Varnish sur Serveur Cloud Infomaniak.

 

Préambule

  • Consultez ces ressources complémentaires sur le langage de configuration Varnish (VCL) pour maîtriser le traitement des requêtes, le routage et la mise en cache :
  • En cas de besoin, des partenaires locaux et référencés par Infomaniak peuvent s'occuper de ces démarches : lancez un appel d'offres gratuit ; ils s'occupent de tout, vous libérant des détails techniques — découvrez aussi le rôle de l'hébergeur.

 

Configuration de Varnish

Une fois installé, la configuration de Varnish repose sur des règles précises de mise en cache et de purge. Veillez à restreindre l'accès pour éviter que des entités non autorisées puissent vider votre cache.

Voici un exemple de fichier de configuration regroupant les cas d'usage les plus fréquents :

vcl 4.0;

# Default backend configuration
backend default {
    .host = "127.0.0.80";  # Backend IP address
    .port = "80";           # Backend port
}

# Access Control List (ACL) for purge authorization
acl purge {
    "localhost";            # Local access
    "1.2.3.4";              # Trusted home IP
    "42.42.42.0"/24;        # Trusted company range
    ! "42.42.42.7";         # Specific IP exclusion (e.g., problematic user)
}

# Handle incoming requests
sub vcl_recv {
    # Handle PURGE requests
    if (req.method == "PURGE") {
        # Check if client IP is authorized
        if (!client.ip ~ purge) {
            return (synth(405, "IP not authorized for PURGE requests."));
        }
        return (purge);
    }

    # Custom PURGEALL for image directory
    if (req.method == "PURGEALL" && req.url == "/images") {
        if (!client.ip ~ purge) {
            return (synth(405, "IP not authorized for PURGEALL requests."));
        }
        # Invalidate all image-related objects in cache
        ban("req.url ~ \.(jpg|png|gif|svg)$");
        return (synth(200, "Images purged."));
    }

    # Bypass cache for authorized requests (e.g., admin panels)
    if (req.http.Authorization) {
        return (pass);
    }
}

# Handle backend responses before caching
sub vcl_backend_response {
    # Set TTL for images to 1 day
    if (beresp.http.content-type ~ "image") {
        set beresp.ttl = 1d;
    }

    # Respect backend's "uncacheable" instruction
    if (beresp.http.uncacheable) {
        set beresp.uncacheable = true;
    }
}

 

Purge via l'interface CLI

Dès lors que vos règles sont actives, vous pouvez tester la purge de votre site (ex: "domain.xyz") en utilisant l'outil curl :

# Purge the homepage
$ curl -X PURGE https://domain.xyz/

# Expected Varnish response
<!DOCTYPE html>
<html>
<head>
    <title>200 Purged</title>
</head>
<body>
    <h1>Success 200: Purge completed</h1>
    <p>The page has been successfully purged.</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 2</p>
    <hr>
    <p>Varnish Cache Server</p>
</body>
</html>

Pour purger une URL spécifique, modifiez simplement le chemin de la requête :

# Purge a specific file
$ curl -X PURGE https://domain.xyz/some_path/some_file.html

# Expected Varnish response
<!DOCTYPE html>
<html>
<head>
    <title>200 Purged</title>
</head>
<body>
    <h1>Success 200: Purge completed</h1>
    <p>The file has been successfully purged.</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 4</p>
    <hr>
    <p>Varnish Cache Server</p>
</body>
</html>

Ou pour déclencher la purge groupée des images définie dans le VCL :

# Execute PURGEALL for images
$ curl -X PURGEALL https://domain.xyz/images

# Expected Varnish response
<!DOCTYPE html>
<html>
<head>
    <title>200 Purged images</title>
</head>
<body>
    <h1>Success 200: Images purged</h1>
    <p>All images have been successfully purged.</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 32770</p>
    <hr>
    <p>Varnish Cache Server</p>
</body>
</html>

 

Purge depuis un CMS (PHP)

La gestion du cache peut aussi se faire dynamiquement via votre backend. Dans la configuration précédente, nous avons ajouté un contrôle sur l'en-tête Uncacheable. Votre CMS peut envoyer cet en-tête pour forcer Varnish à ne pas stocker une réponse.

Voici comment envoyer une requête de purge programmatique en PHP :

<?php
// Initialize cURL for a specific URL
if ($curl = curl_init("http://127.0.0.1/some_url")) {
    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "PURGE",
        CURLOPT_HTTPHEADER => [
            "Host: {$_SERVER['HTTP_HOST']}" // Match the target host
        ]
    ]);

    curl_exec($curl);
    
    // Check if the purge was successful (HTTP 200)
    if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200) {
        echo "Cache purged!";
    }
    curl_close($curl);
}
?>

Cette FAQ a été utile?