2016-05-16 9 views
0

Als Python-Ingenieur lernt man, DRY-Stil-Code zu schreiben; nicht weil es ein Modewort ist, aber es macht deinen Code sauberer und besser lesbar für andere.Varnish Variablen und DRY-Code

Wer einmal den Code eines ehemaligen Kollegen gelesen hat, kann das gut verstehen.

Mit Lack gibt es keine variable Zuweisung, also wie kann man sogar versuchen, DRY-Stilregeln zu schreiben?

Beachten Sie Folgendes:

Ich habe eine Gruppe von Backend-Instanzen Apache mit mehr als zehn vhosts läuft. Es gibt eine Frontend-Instanz, die basierend auf der vhost neu schreiben muss.

Ich bin fest mit diesem:

if (req.url ~ "^/amp/") { 
    # vhost's AMP code == xyz 
    if (req.http.host = "host1.com") { 
     set req.url = regsub(req.url, "/amp/", "/nps/$host1-brand-code/"); 
    } 
    if (req.http.host = "host2.com") { 
     set req.url = regsub(req.url, "/amp/", "/nps/$host2-brand-code/"); 
    } 
    ... 
} 

Was hier Stauchen ist, ist die Wiederholung von regsub

"/nps/$host1-brand-code/" 

Was passiert, wenn die Verlage entscheiden, dass im nächsten Monat /new-nps-url/$host1-brand-code zu ändern. Ich werde gezwungen sein, viele if-Anweisungen für nur einen Cluster zu aktualisieren, und wir haben viele Cluster!

+0

Haben Sie nachging [Lack-Module] (https://github.com/varnish/varnish-modules)? Es scheint, dass sie 'vmod-var' haben, was Ihnen erlaubt, eine Variable wie gewünscht einzustellen. Sie haben einige [Tests] (https://github.com/varnish/varnish-modules/tree/master/src/tests/var) zur Verwendung und [test02.vtc] (https://github.com/varnish /varnish-modules/blob/master/src/tests/var/test02.vtc) kann für Sie von besonderem Interesse sein. –

+0

@CoryShay das ist eine gute Lösung, vielen Dank für den Link! Ich muss mich jedoch vorsichtig annähern, da Lack auf diesen Clustern über einen Koch installiert/aktualisiert wird und eine neue "So" -Notwendigkeitspflege eingeführt wird. –

Antwort

1

So eine Option, wenn Sie nicht die Route von VMODs gehen wollen (obwohl die var vmod, die @ Cory-Shay vorgeschlagen ist eine gute) ist benutzerdefinierte Subroutinen zu verwenden und dann die HTTP-Variablen zu übergeben Ihre Parameter sind ähnlich wie in Python.

In Ihrem Fall:

sub ourcompany_amp_code { 
    set req.url = rebsub(req.url, "/amp/", "/nps/" + req.http.BRAND_CODE); 
    // Cleanup so it does not get passed to upstream 
    // Though the "_" in the name will generally prevent that 
    // in any case 
    unset req.http.BRAND_CODE; 
} 


sub vcl_recv { 
    if (req.http.host = "host1.com") { 
     set req.http.BRAND_CODE = "$host1-brand-code"; 
    } else if (req.http.host = "host2.com") { 
     set req.http.BRAND_CODE = "$host2-brand-code"; 
    } 
    call ourcompany_amp_code; 
} 

Dies würde können Sie mehrere Dinge mit der Marke Code in der Theorie zu tun. Aber wenn Sie nur den einzigen Ersatz tun würden, können Sie einfach den Körper von ourcompany_amp_code nach Ihrer Serie von if-Anweisungen verschieben.

Mit dem var VMOD können Sie einfach ersetzen die Verwendung des req.http.BRAND_CODE mit var.set