Varnish Server Cache Ricardo Brito do Nascimento 10 de dezembro de 2010 Resumo O Varnish é uma solução de cache e aceleração de processamento para os mais diversos tipos de aplicativos. 1 Introdução O Varnish é um cache web de alta performance. Ele utiliza os recursos avançados do cerne Linux 2.6, FreeBSD 6/7 e Solaris 10 para atingir seu alto desempenho. Entre as características desta ferramenta de cache-proxy, destaca-se: 1. Design moderno; 2. VCL Varnish Configuration Language uma linguagem de configuração muito flexível; 3. O balanceamento de carga com a verificação de estado dos backends; 4. Suporte parcial a tecnologia ESI; 5. Reescrita de URL; 6. Manipulação elegante para backends inoperantes; O Varnish trabalha na memória virtual, e é o kernel do sistema operacional que decide qual processo, e a quantidade de RAM destinada, ao mapear o espaço de endereçamento virtual dos processos. Esta ferramenta cache foi desenvolvida para trabalhar em arquitetura de 64 bits, e usar memória virtual; em um sistema de 32 bits, que foge o estilo inicial, poderá ter problemas para configurar mais de 2 GB de armazenamento. Atualmente não há planos para adicionar suporte a HTTPS na estrutura do Varnish, até que possa encontrar um caminho onde agrega-se um valor significativo, em relação à execução estável de stand-alone proxy HTTPS. 1
Embora não trabalhe nativamente com o protocolo HTTPS, outros recursos funcionam perfeitamente, como múltiplos VirtualHosts e o balanceamento de carga com algorítimo round-robin, isto através da VCL. 1.1 Porque o nome Varnish? Varnish do inglês, significa verniz, e segundo sua história (1), basicamente o fato instigador do nome, foi um cartaz publicitário, com a palavra Vernisage, que foi verificada em um dicionário, a qual apresentou três seguintes significados: r.v. var nished, var nish ing, var nish es 1. To cover with varnish. Para cobrir com verniz. 2. To give a smooth and glossy finish to. Para dar um acabamento liso e brilhante para 3. To give a deceptively attractive appearance to; gloss over. Para dar uma aparência atraente para enganosamente; encobrir. As três descreve o que acontece ao sistema de backend quando colocado atrás do Varnish. 2 Instalação Com o Varnish tem-se a opção de instalação por binários, repositórios ou através do código fonte, como na maioria dos programas para Linux. Os binários, disponíveis para Debian, FreeBSD, RHEL5 e Ubuntu; e o código fonte pode ser baixado em http://www.varnish-cache.org/releases/ 2.1 Requisitos O Varnish requer um sistema operacional de 64 bits, sendo Linux, FreeBSD ou Solaris. 2.2 Dependências Primeiramente, antes de iniciar a instalação do Varnish as dependências devem estar contempladas no Sistema Operacional. 2
2.2.1 Ubuntu/Debian autotools-dev automake1.9 libtool autoconf libncurses-dev xsltproc groff-base libpcre3-dev pkg-config 2.2.2 RHELS/CentOS/Fedora automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig 2.3 por Repositórios: Ubuntu/Debian $ curl http://repo.varnish-cache.org/debian/gpg-key.txt \ apt-key add - $ echo "deb http://repo.varnish-cache.org/debian/ \ lenny varnish-2.1" \ >> /etc/apt/sources.list $ aptitude update $ aptitude install varnish 3
2.4 por Repositórios: RHELS/CentOS/Fedora A intalação do varnish está disponível através do repositório EPEL. Infelizmente a versão mais recente disponível é o varnish 2.0.6. Isto significa, se a instalação no RH-Like for feita através do repositório. $ yum install varnish 2.5 Por binários: FreeBSD $ pkg add -r varnish 2.6 Por binários: Ubuntu/Debian $ dpkg -ih varnish 2.7 Por binários: RHELS/CentOS/Fedora $ rpm - -nosignature -ivh http://repo.varnish-cache.org/redhat/el5/noarch/varnishrelease-2.1-2.noarch.rpm 2.8 por fonte FreeBSD $ cd /usr/ports/varnish make install clean 2.9 por fonte Linux Para obter o código fonte do Varnish é necessário o subversion. Execute os comandos: $ svn co http://varnish-cache.org/svn/branches/2.1 varnish-cache $ cd varnish-cache $ sh autogen.sh $ sh configure $ make $ /bin/varnishtest &&./varnishtest tests/*.vtc $ make install 4
A documentação oficial, alerta que podem ocorrer falha no teste, e diz não se preocupe de um ou dois testes falharem, alguns dos testes são demasiadamente longos. Se tudo ocorreu corretamente, o Varnish, agora está instalado no diretório /usr/local, o binário varnishd está em /usr/local/sbin/varnishd e o arquivo de configuração padrão está em /usr/local/etc/verniz/default.vcl. 3 Utilizando o Varnish Para utilizar o Varnish adequadamente, o administrador de sistemas, deve saber como configurar seu aplicativo ou servidor web e ter conhecimento básico do protocolo HTTP, além do Varnish funcionando com a configuração padrão. O Varnish atua com o conceito de servidores backend ou origin. Um servidor backend é o responsável por prover conteúdo que será acelerado pelo Varnish. A primeira tarefa é configurar onde encontrar este conteúdo. Isto é feito no arquivo de configuração padrão do Varnish, o InstallDir / varnish/default.vcl, que provavelmente estará em /usr/local/etc/varnish/ default.vcl ou /etc/varnish/default.vcl. Logo no topo deste arquivo de configuração, haverá um bloco com a seguinte aparência: # backend default { #.host = "127.0.0.1"; #.port = "8080"; # } Este trecho de configuração, comentado por #, escrito na linguagem VCL, define o servidor default (padrão) que hospeda o conteúdo a ser cacheado e acelerado pelo Varnish, ou seja o backend. Com trechos deste tipo, o Varnish pode ter várias infra-estruturas definidas e até aglomerados de backends para fins de balanceamento de carga. Para habilitá-lo, vamos retirar o comentário e apontar para um servidor válido na rede, considerando a porta do serviço. O trecho deverá ficar parecido com o trecho abaixo, após retirar os comentários e configurar valores válidos: backend default {.host = "192.168.1.1";.port = "80"; } 5
3.1 Iniciando o Varnish Inicialmente deve-se parar o processo do Varnish, se por ventura estiver rodando, execute: # pkill varnishd Com status de super usuário (root), execute o seguinte comando para iniciar o Varnish: # varnishd -f InstallDir /varnish/default.vcl \ -s malloc,1g -T 127.0.0.1:2000 -a 0.0.0.0:8080 -f /usr/local/etc/varnish/default.vcl indica o arquivo de configuração a ser utilizado. -s malloc,1g define o tipo de armazenamento o Varnish utilizará para o conteúdo de cache. -T 127.0.0.1:2000 -a 0.0.0.0:8080 Especifica que Varnish escutará a porta 8080, recebendo requisições HTTP. Em um ambiente de produção normalmente a porta padrão escutada, é a porta 80 (HTTP). Agora Varnish está em execução. Para testar o funcionamento correto, use o navegador acessar a máquina, na qual foi configurado o Varnish, exemplo: http: //192.168.1.2:8080/, deverá apresentar a aplicação web que esta rodando no servidor http://192.168.1.1:80. Após estas alterações a única chance do aplicativo não ter sido acelerado, é usa cookies para cada sessão (Varias aplicações em PHP e Java parecem enviar cookies de sessão mesmo que não seja necessário) ou se utiliza sessão autenticada, a qual o Varnish não fará cache. Para iniciar o Varnish na porta 80, execute o comando da seguinte forma: # varnishd -f InstallDir /varnish/default.vcl -s malloc,1g -T 127.0.0.1:2000 O que é equivalente a: # varnishd -f InstallDir /varnish/default.vcl -s malloc,1g -T 127.0.0.1:2000 -a 0.0.0.0:80 3.1.1 Dimensionamento de Cache Definir a quantia de memória e/ou disco, e o tipo a ser utilizado, SATA Serial Advanced Technology Attachment, ISCSI, FC Fibre Chanel ou SAS Serial Attached ISCSI, para montar a infraestrutura o Varnish pode ser uma tarefa complicada. Mas sempre considera-se: Quão grande é o volume de acesso de dados, para um portal ou sítio; o tamanho da página com todas as coisas nela contida, e do tamanho de todas as páginas e objetos ligados, desde a raiz. 6
Como é caro para gerar um objeto? Às vezes faz sentido imagens cache apenas um pouco ou não cache-los em tudo, se eles são baratos para servir de back-end e você tem uma quantidade limitada de memória. 3.2 Registro de Eventos Logs Uma das características realmente interessante é como o Varnish trabalha com o gerenciamento de logs. Em vez de gravar os registro em um arquivo mapeado em disco no sistema operacional, ele utiliza um segmento de memória compartilhado. Quando se esgota o espaço deste segmento, o Varnish sobrescreve automaticamente os registros mais antigos. A vantagem deste processo é a agilidade para registrar o evento, evitando o acesso ao sistema de arquivos, que é um processo lento, e não requer espaço em disco. Por outro lado se não tiver um programa para persistir os logs em disco o histórico de todos os eventos irão desaparecer. O varnish, possui um programa nativo chamado varnishlog, com o qual podese acompanhar o registro dos eventos, em tempo real. Este programa é executado via linha de comando. Este programa faz parte do processo master do Varnish, e verifica o bom andamento do cache. Havendo acessos a máquina onde varnish, está rodando, o resultado será semelhante a este trecho: 11 SessionOpen c 127.0.0.1 58912 0.0.0.0:8080 11 ReqStart c 127.0.0.1 58912 595005213 11 RxRequest c GET 11 RxURL c / 11 RxProtocol c HTTP/1.1 11 RxHeader c Host: localhost:8080 11 RxHeader c Connection: keep-alive A primeira coluna é o numero que identifica a requisição, todas as linhas que possuem o mesmo numero fazem parte da mesma transação HTTP. A segunda coluna é a etiqueta da mensagem, todas as entradas são etiquetadas, e ordenadas no inicio da atividade. As etiquetas ou tags começando com Rx indicam que o Varnish está recebendo dados e Tx indica o envio de dados. A terceira coluna apresenta a origem dos dados, sendo o cliente representado por (c) backend representado por (b). A quarta coluna é o registro sobre as requisições em HTTP. 7
-b Apenas apresenta as linhas do registo de tráfego que entram e os servidores de backend. Isso é útil quando se deseja otimizar as taxas de acesso ao cache; -c Mesmo que -b, mas para o tráfego do lado do cliente. -i tag Exibe apenas as linhas com a etiqueta especificada. -I varnishlog SessionOpen, Nota: só vai apresentar as novas sessões; as tags são case sensitive. -I Filtrar os dados através de Expressão Regular. Para mostrar todos os cabeçalhos de cookies provenientes dos clientes: $ varnishlog -c -i RxHeader -I Cookie; -o Grupo de registro por ID de requisição. 4 Varnish Configuration Language VCL O VCL é a linguagem de configuração utilizada no Varnish, desenvolvida pelos autores Dag-Erling Smørgrav, Poul-Henning Kamp, Kristian Lyngstøl e Per Buer. É uma linguagem de pequeno porte, especificamente projetada para ser usada na definição e na manipulação de poĺıticas de cache para o acelerador HTTP Varnish. Quando uma nova configuração é carregada, o processo gestor varnishd traduz o código de VCL para C, o compilando para um objeto que será então ligado e compartilhado dinamicamente aos processos do servidor. 4.1 Sintaxe A linguagem VCL foi deliberadamente criada, similar as linguagens C e Perl. Onde os blocos são delimitados por chaves, ponto e virgula para fim de sentença, e os comentários, podem ser escritos como em C, C++ ou Perl. Além da atribuição do tipo C (=), comparação (==) e os operadores booleano (!, && e ), o VCL suporta expressões regulares e verificação de ACL através da utilização do operador. No trato com strings, elas podem ser concatenadas apenas em colocá-las uma após a outra, sem qualquer operador adicional. Referências [1] VARNISH. Varnish Cache. nov 2010. Disponível em: <http://www.varnishcache.org/>. Acesso em: 07 dez 2010. [2] RS compute. Hardware utilizado no armazenamento de backup e recuperação. dez 2010. Hardware utilizado no armazenamento de backup e recuperação. 8
Disponível em: <http://www.compute-rs.com/pt/conselho-1556281.htm>. Acesso em: 10 dez 2010. [3] AGUIAR, A. S. Varnish: Uma camada de velocidade. mai 2010. Disponível em: <http://www.vivaolinux.com.br/artigos/impressora.php?codigo=11480>. Acesso em: 07 dez 2010. [4] VARNISH. General questions. dez 2010. Disponível em: <http://www.varnish-cache.org/docs/2.1/faq/general.html#what-isvarnish>. Acesso em: 07 dez 2010. [5] VARNISH. Releases Varnish. mai 2010. Disponível em: <http://www.varnish-cache.org/releases>. Acesso em: 07 dez 2010. 9