VMODs: O lego do Varnish 3

VMODs, ou simplesmente Varnish Modules é, segundo da documentação de modificações, um dos grandes sucessos obtidos na versão 3: "VMODs on the other hand, was an instant success, because they make it much easier for people to extend Varnish with new functionality".

E realmente, é o mesmo que tenho achado, como bem sabemos desde o Varnish 2.1 podemos usar C inline para criar e estender funcionalidades que por padrão o Varnish não trás, e com a chegada dos módulos essa brincadeira tona-se ainda melhor, por tudo que podemos fazer na VCL.

Sabermos ainda que existem coisas que não temos como fazer na VCL, por exemplo: Procurar um número de IP em um arquivo de banco de dados. Usando código C inline até temos como resolver este problema, já que o Varnish nos provê isso, e lá você pode fazer tudo, mas não é uma forma conveniente ou mesmo legível para resolver tais problemas. Eis o lugar onde VMODs entram em cena.

O que é a VMOD?

Trata-se de uma biblioteca compartilhada com algumas funções C que pode ser chamado a partir do código VCL.

A interface entre o VMOD o compilador VCL ("VCC") e o tempo de execução VCL ("VRT") é definido em um arquivo de nome vmod.vcc que um script python de nome "vmod.py" que faz todo o trabalho duro

Executando o vmod.py no arquivo vmod.vcc, será produzido dois arquivos, que são: "vcc_if.c" e "vcc_if.h", no qual devemos usar para construir o nosso arquivo de biblioteca compartilhada.

o vcc_if.c até pode ser esquecido em nosso VMOD, mas o vcc_if.h é importante, ele contém os protótipos para as funções que desejamos exportar para a VCL.

Nota:

Uma informação importante, você ainda pode dizer ao Varnish em tempo de execução para qual diretório ele deve olhar para buscar os VMODs. 

vmod_dir Default: ${VARNISH:DIR}/lib/varnish/vmods

Na prática.

Agora que já temos base do que é um VMOD e como ele funciona, vamos aos exemplos :) , estou usando alguns que encontrei na internet então vamos lá:

  • 1º Exemplo.

Módulo:

 

https://github.com/varnish/libvmod-exampleAutor:

 Martin Blix Grydeland

Descrição: 

O módulo implementa o

"Olá Mundo!", 

sendo bem pequeno e simples para entender.

Nota:

Após instalar o módulo (como instalar em

README

) basta executar o seguinte trecho de código em sua VCL.

import example; sub vcl_deliver {

# Vamos definit o resp.http.hello para "Hello, World"

set resp.http.hello = example.hello("World"); }

 

  • 2º Exemplo

Módulo: https://github.com/leed25d/geoip-vmod
Autor: David Newhall
Descrição: Provê a capacidade de retornar a localização geográfica de um endereço IP.
Nota: 

Após instalar o módulo (como instalar em README) basta executar o seguinte trecho de código em sua VCL.

import geoip; sub vcl_recv { # Definimos um cabeçalho de solicitação X-GeoIP # para o geo do solicitante (ou desconhecido). set req.http.X-Forwarded-For = client.ip; set req.http.X-GeoIP = geoip.country(req.http.X-Forwarded-For) }


  • 3º Exemplo

Módulo:

 

https://github.com/varnish/libvmod-curl
Autor:

 

Tollef Fog Heen


Descrião:

 Este vmod é um dos que mais gosto, ele provê o curls para o Varnish, então podemos usar o varnish como um cliente HTTP e buscar cabeçalhos e corpo nos backends.


Nota:

 Após instalar o módulo (como instalar em 

README

) basta executar o seguinte trecho de código em sua VCL.

 

import curl;

sub vcl_recv {

    curl.fetch("http://example.com/test");

    if (curl.header("X-Foo") == "bar") {

        …

    }

    curl.free();

}


Estes são alguns dos exemplos que podemos seguir para criar nosso próprio VMOD, nota-se que precisamos saber C para isso, algumas idéias de módulos seria usar C + libxml para fazer parse de arquivos XMLs diretamente no Varnish e já manter em cache, ainda com analise de cabeçalho e etc.. Ou Usar o PIL para gerar imagens ou qualquer outra coisa que sua imaginação desejar, você agora tem o poder do C e do Varnish nas suas mãos.

 

Um pouco mais antes de terminar.

Agora que já estamos mais acostumados e empolgados em poder criar VMODs para trabalhar com o Vanrish, veja alguns exemplos do que podemos fazer com o que já existe. 

Nota. Lembre-se que é necessário importar o módulo std ou qualquer outro que iremos utilizar, uma única vez e usar em toda a VCL.

  • Adicionando o std.collect(), coletamos vários cabeçalhos HTTP para um único cabeçalho.

import std; sub vcl_recv {    std.collect(req.http.foo); } sub vcl_fetch {    std.collect(beresp.http.bar); }

  • Retornando uma URL em caixa alta ou uma string.

sub vcl_deliver {         set resp.http.foo = std.toupper(req.url); }

ou

set beresp.http.x-scream = std.toupper("yes!");

  • Retorna o contrário do toupper, ou seja, strings todas em caixa baixa.

set beresp.http.x-nice = std.tolower("VerY");

Ainda temos random, log, set_up_tos, syslog, fileread, duration e integer, no qual adoraria escrever sobre, mas fica a dica para quem desejar conhecer, o VMOD é realmente uma verdadeira caixa de legos, e o mais legal é que você ainda pode criar novas peças e encaixar nas já existentes. Espero que tenha sido u bom post para você entender e começar a montar a sua VMOD, e espero que post aqui sobre a experiência.

Até a próxima.

Leia também: