4 minuto(s) de leitura

Olá pessoal, o Varnish é um excelente acelerador HTTP para sites dinâmicos com alto volume de conteúdo . Em contraste com outros aceleradores HTTP, muitos dos quais começaram a ser projetados como proxies do lado cliente ou servidores gerais, o Varnish foi projetado desde o início como um acelerador HTTP.Ele tem uma séria limitação de não trabalhar com SSL, mas se isto não for um problema para o seu caso, recomendo fortemente sua utilização. Então mãos à obra:

varnish-cache

Instalação do Varnish, Nginx e Php-Fpm

yum install varnish nginx php-fpm

Configuração do PHP-FPM

cd /etc/php-fpm.d/  
mv www.conf www.disabled
vim /etc/php-fpm.d/nginx.conf
listen = /var/run/php-fpm/php-fpm.sock  
listen.owner = nginx  
listen.group = nginx  
listen.mode = 0660  
user = nginx  
group = nginx  
pm = dynamic  
pm.max_children = 10  
pm.start_servers = 1  
pm.min_spare_servers = 1  
pm.max_spare_servers = 3  
pm.max_requests = 500  
chdir = /var/www/html/
mkdir -p /var/www/html  
chkconfig php-fpm on  
/etc/init.d/php-fpm start

Configuração Nginx

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.disabled
vim /etc/nginx/nginx.conf
user nginx;  
worker_processes 1;  
worker_rlimit_nofile 16384;  
error_log /var/log/nginx/error.log warn;  
pid /var/run/nginx.pid;  
events { worker_connections 16384;  
}  
http {  
include /etc/nginx/mime.types;  
default_type application/octet-stream;  
log_format main ‘$remote_addr$remote_user  
[$time_local]$request” ‘  
‘$status $body_bytes_sent$http_referer” ‘  
‘”$http_user_agent” “$http_x_forwarded_for”‘;  
access_log /var/log/nginx/access.log main;  
sendfile on;  
keepalive_timeout 65;  
gzip on;  
include /etc/nginx/conf.d/*.conf;  
}
vim /etc/nginx/conf.d/teste.conf
server {  
listen 8080;  
server_name teste.com.br;  
root /var/www/html;  
access_log /var/log/nginx/teste.com.br.access_log;  
error_log /var/log/nginx/teste.com.br.error_log;  
client_max_body_size 64M;  
# Deny access to any files with a .php extension in the uploads directory  
location ~\* /(?:uploads|files)/.\*.php$ {  
deny all;  
}  
location / {  
index index.php index.html index.htm;  
try_files $uri $uri/ /index.php?$args;  
}  
location ~\* .(gif|jpg|jpeg|png|css|js)$ {  
expires max;  
}  
location ~ .php$ {  
try_files $uri =404;  
fastcgi_split_path_info ^(.+.php)(/.+)$;  
fastcgi_index index.php;  
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;  
fastcgi_param SCRIPT_FILENAME  
$document_root$fastcgi_script_name;  
include fastcgi_params;  
}  
}

Removendo a configuração default

rm -rf /etc/nginx/conf.d/default.conf  
rm -rf /etc/nginx/conf.d/example_ssl.conf  
rm -rf /usr/share/nginx/html
chkconfig nginx on  
/etc/init.d/nginx start

Configuração do Daemon do Varnish

(Comentar da linha 96 até a 103 e substituir pelo conteúdo abaixo)

vim /etc/sysconfig/varnish
DAEMON_OPTS=”-a :80  
-T localhost:6082  
-f /etc/varnish/default.vcl  
-u varnish -g varnish  
-S /etc/varnish/secret  
-s file,/var/lib/varnish/varnish\_storage.bin,2G”

Configuração do Varnish para Nginx e WordPress

Note que as três primeiras linhas já constam no arquivo, porém a linha da especificação da porta do Backend por padrão vem definida para 80.

Atentar para a necessidade de troca para 8080, que é a porta que o nosso Backend (Nginx) está rodando. Nesta configuração básica, iremos dizer ao Varnish para cachear qualquer requisição GET por 30 segundos.

vim /etc/varnish/default.vcl
backend default {  
.host = “127.0.0.1”;  
.port = “8080”;  
}

sub vcl_recv {  
if (req.request == “GET”) {  
return (lookup);  
}  
}

sub vcl_fetch {  
set beresp.ttl = 30s;  
return (deliver);  
}
/etc/init.d/nginx restart  
/etc/init.d/varnish start

Testando

curl -I http://ec2-23-20-111-223.compute-1.amazonaws.com
  • Note que fiz o teste em uma instância da Amazon, por esta razão este FQDN.

Resposta:

HTTP/1.1 403 Forbidden  
Server: nginx/1.2.9  
Content-Type: text/html  
Content-Length: 168  
Accept-Ranges: bytes  
Date: Wed, 11 Sep 2013 18:49:28 GMT  
X-Varnish: 1487051254  
Age: 0  
Via: 1.1 varnish  
Connection: keep-alive

Repare estas linhas:

Server: nginx/1.2.9
X-Varnish: 1487051254

Instalação do PHP

yum install -y php php-opcache php-gd php-mcrypt php-dom php-bcmath php-devel php-enchant php-fpm php-mbstring php-mysql php-pecl-memcache php-xmlrpc
/etc/init.d/php-fpm restart

Ajustes no PHP

vim /etc/php.ini
cgi.fix_pathinfo=0  
upload_max_filesize = 64M

Instalação do Mysql

yum -y install mysql-server mysql  
service mysqld start  
mysqladmin -u root password ‘senhadoroot’  
chkconfig mysqld on
mysql -u root -p  
create database wordpress;  
grant all privileges on wordpress.\* to ‘ricardo’@’localhost’ identified by ‘senhadoricardo’;  
exit

Instalação do WordPress

cd /tmp  
wget http://wordpress.org/latest.zip  
unzip -q latest.zip  
mv wordpress/\* /var/www/html

Configuração do WordPress

Basta acessar a Url do servidor (http://ec2-23-20-111-223.compute-1.amazonaws.com/), e em seguida seguir os passos mostrados pelo próprio instalador do WordPress, que consiste em primeiro informar os dados de conexão ao banco de dados, e em seguida realizar a instalação do próprio.

Vendo o que está passando no Varnish

No servidor execute o comando “varnishlog” e navegue pelo site. Você irá ver tudo que está passando Varnish.

Se quiser saber o que está fazendo cache ou não, podemos customizar o comando, com passagem de parâmetros. Vamos lá:

[root@ip-10-137-16-34]# varnishncsa -F ‘%h %l %u %t “%r” %s %b “%{Referer}i” “%{User-agent}i” “%{Cookie}i” “%{Varnish:hitmiss}x” “%{Varnish:time\_firstbyte}x”‘

O que estiver em cache, você vai ver como HIT. Conteúdo que não está mais em cache e o browser do cliente foi pegar no disco, você vê como MISS.

Mais um teste

Conforme a nossa configuração, dissemos para o Varnish cachear qualquer requisição GET por 30 segundos. E ele está fazendo apenas isso. Vamos fazer um teste:

[root@ip-10-137-16-34]# wget -O /dev/null -S http://localhost

A saída foi:

[root@ip-10-137-16-34]# wget -O /dev/null -S http://localhost  
–2013-09-11 20:28:42– http://localhost/  
Resolving localhost (localhost)… 127.0.0.1  
Connecting to localhost (localhost)|127.0.0.1|:80… connected.  
HTTP request sent, awaiting response…  
HTTP/1.1 200 OK  
Server: nginx/1.2.9  
Content-Type: text/html; charset=UTF-8  
X-Powered-By: PHP/5.3.27  
X-Pingback: http://ec2-23-20-111-223.compute-1.amazonaws.com/xmlrpc.php  
Transfer-Encoding: chunked  
Date: Wed, 11 Sep 2013 20:28:42 GMT  
X-Varnish: 162097824  
Age: 0  
Via: 1.1 varnish  
Connection: keep-alive  
Length: unspecified [text/html]  
Saving to: /dev/null

Note que há uma linha começando com “Age: “. Este Age é o cabeçalho HTTP que o Varnish coloca indicando quanto tempo ele está no cache. Quando é 0, significa que o Varnish não tinha a página em cache e por isso teve que buscar no servidor Web.

Agora utilize o comando a seguir para executar o mesmo wget infinitamente, com intervalos de 1 segundo, e preste atenção na linha do cabeçalho Age. Olhe por pelo menos 1 minuto e você deve entender:

[root@ip-10-137-16-34]# while true; do wget -O /dev/null -S http://localhost/; sleep 1; done

Viu? A cada segundo, o cabeçalho Age vai aumentando, quando chega no número 30, ele zera novamente. Isso quer dizer que o Varnish só busca a página no servidor Web no mínimo de 30 em 30 segundos.

O Varnish tem diversas ferramentas de monitoramento das suas atividades, como o varnishncsa, varnishlog, varnishhtop e varnishstat. Abaixo um comando para você monitorar apenas os dados de Hit ou Miss:

[root@ip-10-137-16-34]# watch -n 1 -d “varnishstat -1 -f cache\_hit,cache\_miss”

Saída:

Every 1.0s: varnishstat -1 -f cache_hit,cache_miss

cache_hit 97 0.11 Cache hits  
cache_miss 76 0.08 Cache misses

Até a próxima!

Referências:
https://www.varnish-cache.org/docs/2.1/tutorial/

CentOS :: Setting Varnish, Nginx for WordPress

http://www.devin.com.br/uma-introducao-ao-varnish/
http://www.devin.com.br/varnish-logs/

Deixe um comentário