web-dev-qa-db-fra.com

Configurer plusieurs sites avec Varnish

Nous avons un serveur qui doit servir plusieurs domaines à travers un vernis, par exemple example1.com, example2.com et example3.com

Notre fichier .vcl actuel ressemble à ceci:

sub vcl_recv {
  set req.http.Host = "example1.com";    
  lookup;
}

Comment définir le req.http.Host correct pour la demande entrante correcte?

48
Tom

Vous pouvez prendre en charge plusieurs domaines frontaux de cette façon:

 backend example1 {
     .Host = "backend.example1.com";
     .port = "8080";
 }
 backend example2 {
      .Host = "backend.example2.com";
      .port = "8080";
 }
 sub vcl_recv {
    if (req.http.Host == "example1.com") {
        #You will need the following line only if your backend has multiple virtual Host names
        set req.http.Host = "backend.example1.com";
        set req.backend = example1;
        return (lookup);
    }
    if (req.http.Host == "example2.com") {
        #You will need the following line only if your backend has multiple virtual Host names
        set req.http.Host = "backend.example2.com";
        set req.backend = example2;
        return (lookup);
    }
 }
87
Cristian Vidmar

J'utilise une configuration similaire à celle de Cristian, mais dans les clauses if, je compare req.http.Host à l'expression régulière:

#for www.example.com or example.com
if (req.http.Host ~ "^(www\.)?example\.com$") {
        set req.backend = example_com;
        return (lookup);
}

#with any subdomain support
if (req.http.Host ~ "^(.*\.)?example2\.com$") {
        set req.backend = example2_com;
        return (lookup);
}

N'oubliez pas de régler les backends de manière appropriée!

25
msurovcak

incapable d'ajouter un commentaire alors on y va

légère modification pour le vernis 4

#for www.example.com or example.com
if (req.http.Host ~ "^(www\.)?example\.com$") {
        set req.backend_hint = example_com;
        return (lookup);
}

#with any subdomain support
if (req.http.Host ~ "^(.*\.)?example2\.com$") {
        set req.backend_hint = example2_com;
        return (lookup);
}

remplacer backend par backend_hint

8
hyena

Je voudrais ajouter un peu plus de détails aux messages de Cristian Vidmar et de msurovcak

Le modèle "(req.http.Host ==" example1.com ")":

Nous avons utilisé le modèle décrit pour héberger des dizaines à des centaines de sites par serveur.

Vous pouvez continuer avec des règles personnalisées spécifiques au site tout au long de votre configuration entière (vcl_fetch/vcl_backend_response, vcl_hash, etc.) en utilisant le

if (req.http.Host == "example1.com") {

exemple partout où cela est nécessaire.

Combinez cela avec un moteur de modélisation pour permettre aux configurations spécifiques au client d'être gérées via des fichiers individuels qui contiennent leur propre logique (tous enveloppés avec leur propre site si des blocs pour isoler le code).

Vous incluez ensuite chaque bloc de site individuel dans le fichier default.vcl en utilisant:

include "/etc/varnish/www.example1.com.vcl";

Une amélioration facultative pour diviser totalement les backends:

Si vous hébergez des sites Web totalement différents, alors les backends fractionnés (et le cache divisé) sont une bonne façon de procéder.

Si les sites sont similaires (même base de code/js/css/images), il peut être intéressant d'exécuter un domaine de ressources par exemple. resources.example.com que tous les sites utilisent.

Vous pouvez alors avoir un cache unique (et un taux de succès très élevé) sur chacun des éléments communs de plusieurs sites et conserver les différences sur les sites www individuels.

Une autre alternative à l'utilisation de back-ends divisés:

Une autre option consiste à diviser les instances de Varnish via des conteneurs. Chacun devient alors son propre monde isolé qui est géré (et vit et meurt) individuellement. Cela peut être une bonne option de sécurité et les frais généraux de plusieurs processus sont minimes sur les infrastructures modernes.

Certains avantages sont que vous pouvez alors prendre en charge différentes versions de Varnish et différents paramètres de démarrage de Varnish par instance.

Cela peut être idéal pour la journalisation individuelle, en exploitant différents modes ESI par instance et paramètres de configuration de la mémoire/réglage individuel.

Nous le faisons sur www.section.io et cela nous donne également la possibilité d'exécuter différents conteneurs dans différents emplacements géographiques ou les mêmes conteneurs dans différents emplacements pour se rapprocher le plus possible de bases d'utilisateurs géographiquement dispersées.

4
mattnthat