ArtigosDestaque

Varnish 3: Acelerador HTTP

Ambiente de testes e configuração

Para demonstrar a mais valia do Varnish, criei um pequeno ambiente, dentro de uma máquina virtual com o Wordpress 3.2 instalado.

De referir que queria algo simples e rápido e o exemplo que dou serve apenas como demontração e melhorias podiam ser feitas a nível de performance na sua configuração.
Se tiverem um site Wordpress, este artigo pode servir como base, mas não como um trabalho acabado.

Do lado do servidor instalei o seguinte:

Centos 5.6
Apache httpd 2.2
Php 5.3
Varnish 3.0
Mysql 5.0
Wordpress 3.2
htop 8.3

Do lado cliente, para testar, usei:

Apache Bench

Do lado do servidor, deixei as configurações dos programas por defeito, com excepção:

Apache httpd.conf:

KeepAlive On
Listen 8080
DirectoryIndex index.php

De referir que quando testei o Apache httpd sem Varnish, ficou à escuta na porta 80

Varnish /etc/varnish/default.vcl:

backend default {
     .host = "localhost";
     .port = "8080";
}
acl purge {
        "localhost";
}
sub vcl_recv {
        if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return(lookup);
        }
if (req.url ~ "^/$") {
               unset req.http.cookie;
            }
}
sub vcl_hit {
        if (req.request == "PURGE") {
                set obj.ttl = 0s;
                error 200 "Purged.";
        }
}
sub vcl_miss {
        if (req.request == "PURGE") {
                error 404 "Not in cache.";
        }
if (!(req.url ~ "wp-(login|admin)")) {
                        unset req.http.cookie;
                }
    if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|
zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
       unset req.http.cookie;
       set req.url = regsub(req.url, "\?.$", "");
    }
    if (req.url ~ "^/$") {
       unset req.http.cookie;
    }
}
sub vcl_fetch {
        if (req.url ~ "^/$") {
                unset beresp.http.set-cookie;
        }
if (!(req.url ~ "wp-(login|admin)")) {
                        unset beresp.http.set-cookie;
}
}

Neste ficheiro, temos a parte que dá inteligência ao Varnish, passando o código VCL.
O ficheiro é composto por várias secções, mas as mais importantes são o backend, receive e fetch.

Nota: Apesar de o Varnish neste exemplo estar a correr na mesma máquina do Apache httpd, pode estar a correr noutra máquina.

Vamos “desmontar” o ficheiro, para perceber a lógica que está aqui.

backend default
Aqui estamos a dizer que o servidor web encontra-se na mesma máquina, à escuta na porta 8080.

acl purge
ACL significa “Access Control List”. Por isso, nesta parte estamos a criar uma lista, que por acaso só tem uma entrada, que vai ser usada noutras secções para efectuar certos procedimentos.

sub vcl_recv
Nesta secção verificamos, quando há um request de “purge”, se está na ACL que anteriormente foi definida. Se não estiver envia um erro 405 a dizer que não é permitido.

Todos os outros casos de pedidos, pedimos para verificar na cache, com o “lookup”.

Também dizemos que todos os pedidos contidos dentro de “/” retiramos os cookies.

sub vcl_hit
Aqui dizemos que se houver um pedido de “purge” e estiver na cache, colocamos o objecto em cache com um TTL (Time To Live), de zero, tendo que o Varnish ir buscar de novo o objecto quando for novamente pedido.

sub vcl_miss
Se houver um pedido de “purge” e o objecto não estiver em cache, envia um erro 404 a dizer que não está em cache.

Se não estiver em cache e o pedido for diferente de “/wp-login” e “/wp-admin”, retiramos os cookies.

Em caso de ficheiros estáticos, como jpg, css, js, etc, retiramos os cookies e normalizamos o pedido, para os cliente que enviam o URL completo.

No caso de estar contido dentro de “/”, retiramos os cookies.

sub vcl_fetch
Esta é a secção onde se passam as regras para os pedidos ao servidor real.

Se estiver contido em “/” e não for “/wp-login” e “/wp-admin”, retiramos os cookies.

Outro ficheiro que é importante é o /etc/varnish/secret visto que tem uma hash que identifica a instância do Varnish que está a correr, como por exemplo:

e9b4bcee-14c2-472b-89a2-d37c36f844f0

Esta hash serve para definir quem tem acesso ao controlo do Varnish. Esta verificação é feita pelos direitos de filesystem dados a este ficheiro.

Normalmente na instalação, este ficheiro é criado, mas podemos querer passar outras permissões.
Caso não seja criado, temos que passar o comando:

uuidgen > /etc/varnish/secret && chmod 0600 /etc/varnish/secret

Outro ficheiro que tem que se alterar é o /etc/sysconfig/varnish:

# Configuration file for varnish
#
# /etc/init.d/varnish expects the variable $DAEMON_OPTS to be set from this
# shell script fragment.
#

# Maximum number of open files (for ulimit -n)
NFILES=131072

# Locked shared memory (for ulimit -l)
# Default log size is 82MB + header
MEMLOCK=82000

# Maximum size of corefile (for ulimit -c). Default in Fedora is 0
# DAEMON_COREFILE_LIMIT="unlimited"

# Set this to 1 to make init script reload try to switch vcl without restart.
# To make this work, you need to set the following variables
# explicit: VARNISH_VCL_CONF, VARNISH_ADMIN_LISTEN_ADDRESS,
# VARNISH_ADMIN_LISTEN_PORT, VARNISH_SECRET_FILE, or in short,
# use Alternative 3, Advanced configuration, below
RELOAD_VCL=1

## Alternative 3, Advanced configuration
#
# See varnishd(1) for more information.
#
# # Main configuration file. You probably want to change it :)
VARNISH_VCL_CONF=/etc/varnish/default.vcl
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=50
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=2000
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location
#VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=1.5G
#
# # Backend storage specification
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120
#
# # DAEMON_OPTS is used by the init script.  If you add or remove options, make
# # sure you update this section, too.
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE}"
#

Este é o ficheiro que passa os parâmetros ao serviço do varnish.

Vamos “desmontar” também este ficheiro.

NFILES=131072
Neste ponto dizemos que o máximo de ficheiros abertos é de 131072.

MEMLOCK=82000
Aqui dizemos que o tamanho de memória partilhada que é bloqueada é de 82 MB.

RELOAD_VCL=1
Se for feito “restart” ao serviço, pede-se para voltar a ler o ficheiro VCL.

Em seguida, temos várias formas de configurar o serviço, mas a melhor forma é a “advanced” por dar maior flexibilidade.

VARNISH_VCL_CONF=/etc/varnish/default.vcl
Apontamos o caminho onde se encontra o ficheiro VCL.

VARNISH_LISTEN_PORT=80
O Varnish fica à escuta na porta 80.

VARNISH_ADMIN_LISTEN_PORT=6082
O CLI de “Command Line Interface” administrativo fica à escuta na porta 6082.

VARNISH_SECRET_FILE=/etc/varnish/secret
Apontamos o caminho que identifica a instância que está a correr de Varnish.

VARNISH_MIN_THREADS=50
50 é o numero de threads que são iniciadas com o serviço.

VARNISH_MAX_THREADS=2000
2000 é o número de threads máximo.

VARNISH_STORAGE_SIZE=1.5G
Este é o tamanho total dos objectos que estão em cache. Atenção, que este não é o valor máximo da cache, pois só inclui os objectos e não o overhead de informação que o Varnish coloca.

VARNISH_STORAGE=”malloc,${VARNISH_STORAGE_SIZE}”
Aqui dizemos que tipo de cache queremos e a quantidade definida no ponto anterior.
Existem vários tipos de cache, mas as mais usadas é para Memória ou para Disco. Neste caso coloquei para memória.

VARNISH_TTL=120
Este é o “Time To Live” por defeito, quando o servidor não especifica nenhum.

Existem 6 comandos para monitorizar e modificar, sem efectuar restart ao serviço o Varnish. Os comandos são:

varnishstat
varnishhist
varnishlog
varnishncsa
varnishtop
varnishadm

varnishstat
Mostra ao detalhe um sem número de estatísticas do funcionamento do Varnish.

varnishhist
Mostra em real time, num gráfico os pedidos, divididos se estão em cache ou tem que pedir ao servidor http e a velocidade que está a conseguir dar os pedidos em cache e a velocidade de acesso ao servidor http.

varnishlog
Mostra ou coloca para log os logs em real time do Varnish. Muito útil fazendo pipe com o comando “grep”.

varnishncsa
Igual ao comando anterior, mas mostra ou coloca os logs em formato do Apache httpd.

varnishadm
Interface administrativo que se liga ao CLI via telnet. Permite ver e modificar o comportamento do Varnish em real time.

Por exemplo, podemos mudar o número de pools em real time com o comando:

varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret param.set thread_pools 4
Página anterior 1 2 3Página seguinte

Artigos Relacionados

Botão Voltar ao Topo