Instalando o WordPress sobre Nginx, PHP-FPM e Varnish no Centos

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
[nginx]
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;
#tcp_nopush 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/

  • Tales Santos

    Ricardo ficou muito bom!

  • Felipe Fernandes

    Fazer o procedimento de instalação do varnish em um servidor que já tem um site rodando, é possível? e qual seriam os cuidados durante o passo a passo que você indicou?

    Obrigado

    • Felipe,
      Sim, é possivel. O varnish é uma instalação isolada que não irá interferir no que você já tem rodando.

      Atente apenas para não suir o varnish na mesma porta que talvez já possuia seu servidor web rodando, normalmente a porta 80.

  • Amigo faz um video com essas configurações seria muito bom