2016-07-15 14 views
0

Ich versuche, einen Rubygems Reverse-Proxy mit Varnish 4.1 zu implementieren. Clients in meinem Intranet haben kein allgemeines Outbound-NAT, daher muss Varnis intern alle Redirects verfolgen, vorzugsweise die 302 von rubygems.org und die Antwort vom CDN-Server zwischenspeichern.Folgende Weiterleitungen intern mit Varnish

Hier ist meine default.vcl:

vcl 4.0; 

import std; 

backend default { 
    .host = "rubygems.org"; 
    .port = "80"; 
} 

sub vcl_recv { 
    std.syslog(180, "doing vcl_recv"); 
    std.syslog(180, "req.url = " + req.url); 
} 

sub vcl_deliver { 
    std.syslog(180, "doing vcl_deliver"); 
    std.syslog(180, "resp.status = " + resp.status); 
    if (resp.status == 302) { 
     set req.url = resp.http.Location; 
     std.syslog(180, "restarting with req.url = " + req.url); 
     return(restart); 
    } 
} 

sub vcl_backend_fetch { 
    std.syslog(180, "doing vcl_backend_fetch"); 
    std.syslog(180, "bereq.retries = " + bereq.retries); 
} 

sub vcl_backend_error { 
    std.syslog(180, "doing vcl_backend_error"); 
} 

Wenn ich curl -i http://localhost/latest_specs.4.8.gz, Varnish eine HTTP-503 und protokolliert wirft die folgenden:

varnishd[20384]: doing vcl_recv 
varnishd[20384]: req.url = /latest_specs.4.8.gz 
varnishd[20384]: doing vcl_backend_fetch 
varnishd[20384]: bereq.retries = 0 
varnishd[20384]: doing vcl_deliver 
varnishd[20384]: resp.status = 302 
varnishd[20384]: restarting with req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 
varnishd[20384]: doing vcl_recv 
varnishd[20384]: req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 
varnishd[20384]: doing vcl_backend_fetch 
varnishd[20384]: bereq.retries = 0 
varnishd[20384]: doing vcl_deliver 
varnishd[20384]: resp.status = 302 
varnishd[20384]: restarting with req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 
varnishd[20384]: doing vcl_recv 
varnishd[20384]: req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 
varnishd[20384]: doing vcl_backend_fetch 
varnishd[20384]: bereq.retries = 0 
varnishd[20384]: doing vcl_deliver 
varnishd[20384]: resp.status = 302 
varnishd[20384]: restarting with req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 
varnishd[20384]: doing vcl_recv 
varnishd[20384]: req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 
varnishd[20384]: doing vcl_backend_fetch 
varnishd[20384]: bereq.retries = 0 
varnishd[20384]: doing vcl_deliver 
varnishd[20384]: resp.status = 302 
varnishd[20384]: restarting with req.url = http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz 

Es ist nicht die neue URL anfordert, auch zu sein scheint nach update req.url und Neustart der Anfrage.

Antwort

0

Dies hier nicht um eine endgültige Antwort ist aber sind einige Gedanken:

1) „req.url“ hält eine URL nur den Pfad Teil aber nicht das Protokoll und Host-Teil einer URL enthalten. Es scheint mir also einfach falsch zu sein, wenn Sie "req.url" in vcl_deliver "http://rubygems.global.ssl.fastly.net/latest_specs.4.8.gz" zuweisen und dann neu starten.

Meiner Meinung nach wird die neugestartete Anfrage nicht "rubygems.global.ssl.fastly.net" treffen, sondern immer noch "rubygems.org" - das definierte Standard-Backend.

Also ich denke, Sie müssten ein zweites Backend "rubygems.global.ssl.fastly.net" definieren und und wenn Sie neu starten. Sie müssen auch so etwas wie diese (nicht getestet) sind in Lack unterschiedliche Konzepte

set resp.http.Location = regsub(resp.http.Location,"^http://",""); 
set req.http.host = regsub(resp.http.Location,"/.*$",""); 
set req.url = regsub(resp.http.Location,"[^/]*",""); 

2) wiederholen und neu starten tun 4

Deshalb bereq.retries immer 0. zeigen Sie auf req suchen müssen .restarts