O Varnish é um componente que ficou extremamente popular há alguns anos, e com bons motivos. Ele é um proxy reverso que acelera bastante o carregamento de páginas. Neste post não vamos nos aprofundar no Varnish, pois ele seria conteúdo para pelo menos 1 post inteiro. Vamos mostrar como configurá-lo junto com o WordPress no CentOS/Amazon Linux e no Ubuntu, e o seu resultado sobre a velocidade das páginas.
O WordPress é uma plataforma de publicação, blogs e CMS extremamente popular e muito útil e fácil de usar. Seu sucesso é tão grande que ele está completando 10 anos e não há sinais de que esteja perdendo popularidade, muito pelo contrário.
Embora o WordPress seja uma ferramenta ótima, ele pode ficar lento com uma carga mais intensa e não foi feito para comportar sozinho um volume tão pesado de acessos. O ideal é termos uma arquitetura utilizando suas facilidades de publicação, mas “protegê-lo” de uma carga mais pesada.
Neste post assumiremos que ele já está instalado no seu servidor e você quer apenas acelerá-lo com o Varnish. Porém, está no forno um outro post em breve sobre uso do WordPress de forma profissional na Amazon, no qual discutiremos as boas práticas para usá-lo de forma adequada em sites valiosos para nós. Vamos assumir que você tem o WordPress rodando 1 ou mais sites no mesmo servidor na porta 80, e então o Varnish assumirá a porta 80 e seu HTTP server passará a escutar em outra porta.
sudo yum install varnish
Precisamos na sequência modificar as configurações do servidor HTTP e todos os virtual hosts para que não usem mais a porta 80, alterando todos para alguma outra porta. No meu caso eu utilizei a 18080, pois a 8080 já estava sendo utilizada.
sudo vim /etc/httpd/conf/httpd.conf
Faça a mesma coisa para todos os sites dentro de /etc/httpd/sites-available, trocando as ocorrências da porta 80 por 18080 (ou qualquer outra que você preferir):
NameVirtualHost *:18080 Listen 18080
sudo mv /etc/varnish/default.vcl ~/varnish-default-vcl.old sudo mv /etc/sysconfig/varnish ~/default-varnish-old
sudo vim /etc/sysconfig/varnish
Preencher com o conteúdo abaixo.
# Configuration file for varnish # # /etc/init.d/varnish expects the variables $DAEMON_OPTS, $NFILES and $MEMLOCK # to be set from this shell script fragment. # # Should we start varnishd at boot? Set to "no" to disable. START=yes # Maximum number of open files (for ulimit -n) NFILES=131072 # Maximum locked memory size (for ulimit -l) # Used for locking the shared memory log in memory. If you increase log size, # you need to increase this number as well MEMLOCK=82000 # Default varnish instance name is the local nodename. Can be overridden with # the -n switch, to have more instances on a single server. # INSTANCE=$(uname -n) # This file contains 4 alternatives, please use only one. ## Alternative 1, Minimal configuration, no VCL # # Listen on port 6081, administration on localhost:6082, and forward to # content server on localhost:8080. Use a 1GB fixed-size cache file. # # DAEMON_OPTS="-a :6081 \ # -T localhost:6082 \ # -b localhost:8080 \ # -u varnish -g varnish \ # -S /etc/varnish/secret \ # -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G" ## Alternative 2, Configuration with VCL # # Listen on port 6081, administration on localhost:6082, and forward to # one content server selected by the vcl file, based on the request. Use a 1GB # fixed-size cache file. # DAEMON_OPTS="-a :80 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -S /etc/varnish/secret \ -t 120 \ -s malloc,256m" ## 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=6081 # # # Telnet admin interface listen address and port # VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 # VARNISH_ADMIN_LISTEN_PORT=6082 # # # The minimum number of worker threads to start # VARNISH_MIN_THREADS=1 # # # The Maximum number of worker threads to start # VARNISH_MAX_THREADS=1000 # # # Idle timeout for worker threads # VARNISH_THREAD_TIMEOUT=120 # # # Cache file location # VARNISH_STORAGE_FILE=/var/lib/varnish/$INSTANCE/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=1G # # # File containing administration secret # VARNISH_SECRET_FILE=/etc/varnish/secret # # # Backend storage specification # VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${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} \ # -S ${VARNISH_SECRET_FILE} \ # -s ${VARNISH_STORAGE}" # ## Alternative 4, Do It Yourself # # DAEMON_OPTS=""
sudo vim /etc/varnish/default.vcl
Preencher com o conteúdo abaixo, só ajustando de acordo com a sua escolha de portas.
# Default backend definition. Set this to point to your content server. backend default { .host = "127.0.0.1"; .port = "18080"; .connect_timeout = 60s; .first_byte_timeout = 60s; .between_bytes_timeout = 60s; .max_connections = 800; } acl purge { "127.0.0.1"; "localhost"; } sub vcl_recv { set req.grace = 2m; # Set X-Forwarded-For header for logging in nginx remove req.http.X-Forwarded-For; set req.http.X-Forwarded-For = client.ip; # Remove has_js and CloudFlare/Google Analytics __* cookies and statcounte is_unique set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js|is_unique)=[^;]*", ""); # Remove a ";" prefix, if present. set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); # Either the admin pages or the login if (req.url ~ "/wp-(login|admin|cron)") { # Don't cache, pass to backend return (pass); } # Remove the wp-settings-1 cookie set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", ""); # Remove the wp-settings-time-1 cookie set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(;)?",""); # Remove the wp test cookie set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(;)?", ""); # Static content unique to the theme can be cached (so no user uploaded images) # The reason I don't take the wp-content/uploads is because of cache size on bigger blogs # that would fill up with all those files getting pushed into cache if (req.url ~ "wp-content/themes/" && req.url ~ "\.(css|js|png|gif|jp(e)?g)") { unset req.http.cookie; } # Even if no cookies are present, I don't want my "uploads" to be cached due to their potential size if (req.url ~ "/wp-content/uploads/") { return (pass); } # any pages with captchas need to be excluded if (req.url ~ "^/contact/" || req.url ~ "^/links/domains-for-sale/") { return(pass); } # Check the cookies for wordpress-specific items if (req.http.Cookie ~ "wordpress_" || req.http.Cookie ~ "comment_") { # A wordpress specific cookie has been set return (pass); } # allow PURGE from localhost if (req.request == "PURGE") { if (!client.ip ~ purge) { error 405 "Not allowed."; } return (lookup); } # Force lookup if the request is a no-cache request from the client if (req.http.Cache-Control ~ "no-cache") { return (pass); } # Try a cache-lookup return (lookup); } sub vcl_fetch { #set obj.grace = 5m; set beresp.grace = 2m; } sub vcl_hit { if (req.request == "PURGE") { purge; error 200 "Purged."; } } sub vcl_miss { if (req.request == "PURGE") { purge; error 200 "Purged."; } }
sudo /etc/init.d/httpd restart sudo /etc/init.d/varnish restart
O processo para o Ubuntu é idêntico, só mudando os comandos e os locais dos arquivos de configuração.
sudo apt-get install varnish
Modificar as configurações do servidor HTTP e todos os virtual hosts para que não usem mais a porta 80, alterando todos para alguma outra porta (18080 no meu caso).
sudo vim /etc/apache2/ports.conf
Faça a mesma coisa para todos os sites dentro de /etc/apache2/sites-available, trocando as ocorrências da porta 80 por 18080 (ou qualquer outra que você preferir):
NameVirtualHost *:18080 Listen 18080
sudo mv /etc/default/varnish ~/default-varnish-old sudo mv /etc/varnish/default.vcl ~/varnish-default-vcl.old
sudo vim /etc/default/varnish
Preencher com o conteúdo idêntico ao da seção do CentOS.
Depois disso, fazer:
sudo vim /etc/default/varnish
Preencher também de acordo com a seção idêntica do CentOS.
sudo service apache2 restart sudo service varnish restart
Pronto, depois de configurar o Varnish para cachear as páginas do WordPress e acelerar os carregamentos, já podemos conferir o resultado disto no PageSpeed. O blog e o site da Rivendel estavam com ratings bons já, mas de vez em quando vinha uma observação sobre melhorar o tempo de resposta do servidor. Isto ficou sensivelmente melhor com o Varnish, como podemos ver abaixo.
Carregamento bem rápido e rating de 92 no site e 91 no blog, e ambos muito melhor preparados para aguentar uma carga pesada de acessos. Nada mal, né? Agradeço ao Varnish 🙂
Gostou do conteúdo? Tem alguma dúvida? Entre em contato com nossos Especialistas Mandic Cloud, ficamos felizes em ajudá-lo.