Solde de chargement Varnish Avec des demandes de réécriture au serveur

J'essaie d'équilibrer la charge d'une application Web tiers avec Varnish, et pour cette application tierce requise `` le présent '' Nom du serveur (Il semble que cela se connecte à ce serveur par nom en arrière-plan. (et localhost ne marche pas) :() Pour la transmission dans la chaîne de requête. J'ai également besoin d'un travail de refus, ce qui signifie que je voudrais utiliser les administrateurs afin que ma configuration soit simple et évolutive.

Voici un exemple simple de ce que je

Aimer

Fabriquer:

sub vcl_pass {
set bereq.http.X-Varnish-Backend = bereq.backend.name
}

mais backend.name Disponible en beresp Seulement après avoir déjà fait une demande. Il paraît que Varnish ne décide pas quel backend à utiliser tout en

après

vcl_pass Se termine, et il n'y a pas d'autre crochet avant que la demande ne soit envoyée à Bekend.

C'est juste? Si oui, alors y a-t-il une autre solution (En plus des correctifs sur un serveur Web que je ne contrôle pas)? Sans cycles, même si je mettant en œuvre le remplacement du directeur du client dans VCL, Il ne sera pas en mesure d'échouer sur les fichiers des serveurs.
Invité:

Hannah

Confirmation de:

Tout d'abord, vous devez développer une stratégie qui vous permet de distinguer les applications utilisées. Vous pouvez utiliser différents noms d'hôte. (Tous indiquent votre serveur proxy Varnish) Ou vous pouvez utiliser différentes URL pour décider quelle demande doit être traitée par quel système de serveur. Si vous avez une stratégie, configurez Varnish:

Exemple A) Divers noms des hôtes

Préparer tous les retours nécessaires. Cela peut être un serveur ou plusieurs serveurs à l'aide du réalisateur:

backend example1 {
.host = "...";
.port = "...";
...
}

Définissez le bon serveur pour les demandes entrantes. (dans Varnish: req). J'ai défini une valeur supplémentaire req.http.backend, Pour l'utiliser à une étape ultérieure. Ici, vous pouvez remplacer ou annuler tout en-tête de demande de client HTTP:

sub vcl_recv {
...
if (req.http.host == "example1.mysite.com") {
set req.backend = example1;
set req.http.backend = "example1";
set req.http.host = "application1.internal.mysite.com";
unset req.http.Cache-Control;
...
}
...
}

Apporter des modifications à la réponse du serveur retourné (dans Varnish: beresp). Si vous avez un autre nom d'hôte pour l'application, vous pouvez modifier les redirections. Je supprime habituellement certains en-têtes x ou remplaçant les titres de mise en cache back-end ici:

sub vcl_fetch {
...
if (req.http.backend == "example1") {
...
unset beresp.http.X-Powered-By;
...
if ((beresp.status == 301 || beresp.status == 302) && beresp.http.Location ~ "^[url=http://application1]http://application1[/url]\.internal\.mysite\.com") {
set beresp.http.Location = regsub(beresp.http.Location, "^http://[^/]+", "[url=http://example1.mysite.com"]http://example1.mysite.com"[/url];);
}
}
...
}

Exemple B.) différent URL

DANS Varnish La différence réside dans la méthode vcl_recv. Veillez à ce que votre application puisse fonctionner avec le chemin "/ example1". D'autres décisions sont possibles, mais je ne recommanderais pas ceci:

sub vcl_recv {
...
if (req.http.host == "www.mysite.com") {
if (req.url ~ "(?i)^/example1/") {
set req.backend = example1;
set req.http.backend = "example1";
set req.http.host = "application1.internal.mysite.com";
unset req.http.Cache-Control;
...
}
...
}
...
}

Vous pouvez mettre en œuvre A ou B Ou fusionner A et B. (Plus ou moins) Tout est possible Varnish.

Pour répondre aux questions, connectez-vous ou registre