Jump to content

[Tutorial] Wordpress + Varnish + Nginx + Ispconfig3 No Centos 6.3


joaopaulo

Recommended Posts

[ATENÇÃO, NÃO FIZ REVISÃO DE ERROS ORTOGRÁFICOS AINDA... LEVEI 2H PARA FAZER O TUTORIAL]

Olá Pessoal,

Há alguns meses tem aparecido por aqui uma demanda grande de clientes com sites em Wordpress que estão tendo problemas com seus provedores de hospedagem devido ao alto tráfego. O tráfego chega a ser tão alto, que mesmo usando plugins de cache como o WP Total Cache ou WP Super Cache junto com o Nginx, não resolve o problema.

Todos os problemas foram resolvidos adotando o Varnish num webserver dedicado ao blog (pode-se usar mais domínios, mas nesse tutorial mostrarei como usar um só).

Para ficar mais fácil mensurar o problema, cito abaixo um caso de sucesso, usando apenas um domínio fictício, mas com informações reais do problema

Blog: batatinha.com (nome ficticio)

Problema: O servidor caía nos horários de pico, ou apresentava uma severa lentidão, sendo necessário reiniciar o mesmo.

Estatísticas (em picos):

1.7 milhões pageviews/ dia

240.000 visitantes/dia

6.600 usuários em pico (segundo amung.us)

3000 usuários online durante a maior parte do dia.

2.600 pageviews/minuto.

301 requisições/s.

Servidor: Dual Xeon Quad Core 2.66Ghz / 12GB RAM | CentOS | Bind9 + Nginx + PHP5 + SpawCgi + Exim + CSF + Mysql.

Ferramentas de Estatísticas: amung.us e analytics

Devido ao alto custo dessa máquina no DC onde estava, migramos para um servidor equivalente em um DC mais barato: Xeon Quad Core c/ HT / 16GB RAM / 64GB SSD.

Antes de contar o santo, já conto o milagre.

Depois de um período de migração com alguns probleminhas, estamos numa calmaria sem precedentes. O load do servidor em pleno pico fica próximo a 0, a quantidade de requisições que não são resolvidas pelo Varnish e são encaminhadas ao Nginx fica próximo há 3.28237111%, resumindo, 3.5%. Trocando em miúdos, daqueles 1.7milhões de pageviews/dia (é bom lembrar que cada pageview tem 29 requisições), apenas 1924 pageviews foram de fato processadas, o resto é tudo cache .

Segue abaixo alguns prints que tirei agora a tarde, o tráfego ainda não está alto, e percebe-se facilmente que o servidor tem pico para ir muito mais longe. Acho particularmente que aguentaria até uns 15.000 usuários online e cerca de 20 milhões de Pageviews/dia.

whoaumung.png

analytcs.png

htop.png

1. Passo: Instalando o ISPCONFIG3 no CentOS 6.3

O IspConfig é um painel gratuito para gerenciamento de hospedagem bem simples, porém com algumas vantagens que o tornam bem interessante, entre elas me limito a citar: Suporte nativo ao Nginx. E as desvantagens... estão no fato de nada ser automatizado. Sim, para quem é acostumado a usar o cPanel, ao criar uma conta o painel já gera o DNS, FTP, Usuário do Website, etc... No Ispconfig, você tem que fazer todas essas etapas manualmente.

Mas chega de blablablalbabla, vamos ao que interessa: Instalação do Ispconfig3 no Centos.

Como o passo a passo é meio longo, há excelentes tutoriais no howto.com sobre isso, e assim, me limito a informar aqui qual usei para instalar o Ispconfig, mas antes, permita-me fazer alguns comentários a respeito do processo de instalação:

  1. Como disse anteriormente, o servidor era dedicado para apenas um website, logo, alguns serviços desnecessários não foram instalados que são e algumas notas preliminares a instalação:
  • Cota de uso: não é necessário, logo, o passo 8 da instalação segundo o link abaixo não foi realizado;
  • Como o blog não recebe emails e nem envia, então não se faz necessária a instalação do Courier e clientes de email. Pulei o passo 11, 12, 13 ,14 e 17;
  • Na instalação do passo 16, aquelas regras que devem ser configuradas no Nginx .conf explicarei mais a frente onde e quando coloca-las, execute somente a instalação e a configuração do PHPMyadmin;
  • Note que pulei o passo 17, pois desativei as as ferramentas de e-mail. Quem for instalar o MailMan, as configurações do Nginx deixe para depois também.
  • Não realizei o passo 20, pois não faz sentido ter estátisticas locais se vamos usar o Analytics e amung.us;
  • Não realizei o passo 24, pois se não temos e-mail.. para que cliente de e-mail?

Instalando o Ispconfig 3 + Nginx no Centos6.3

2. Passo: Configurando o Mysql

Algo que a maioria das pessoas esquecem é que um servidor precisa de harmonia, não adianta utilizar configurações de alto tráfego no Nginx/Apache se o Mysql não estiver em harmonia. Aliás, o Mysql pode deixar o servidor bem lento se mal configurado.

Acesse o arquivo (via ssh): # nano /etc/my.cnf

No caso, as configurações usadas nesse caso foi a seguinte (não mudaria muito se fosse num servidor com menos memória ou processamento):


[mysqld]

local-infile=0

key_buffer_size=384M

sort_buffer=1M

join_buffer=1M

max_join_size=1M


#CPU * 2

thread_concurrency=16

#CPU / 2 ou mais

thread_cache= 10



table_cache=300

max_heap_table_size=32M

tmp_table_size=600M

query_cache_limit=768K

query_cache_size=96M

max_connections=500

max_user_connections=0


[innodb]

innodb_buffer_pool_size=32M

innodb_file_per_table=1

innodb_log_file_size=5M

#CPU/2

innodb_thread_concurrency=4

Toda vez que modificar esse arquivo, reinicie o mysql usando: /etc/init.d/mysql restart (se der erro de arquivo não encontrado, talvez seja mysqld no lugar de mysql). Conforme o seu blog e o número de Posts, essas configurações podem ser bem diferentes. Nada melhor do que usar o mysqltuner para isso. Mas... só faça o procedimento abaixo obviamente depois de já houver instalado o site no servidor! Você pode instalar o mysqltuner com o comando abaixo: # yum install mysqltuner -y Para consultar e ir otimizando, basta rodar o comando # mysqltuner Atente-se ao fato que ele irá pedir um usuário e senha do Mysql. Em seguida... observe os resultados, altere seu my.cnf conforme as sugestões, reinicie o mysql com # /etc/init.d/mysql restart e refaça o teste quantas vezes for necessário e tome por costume, ajustar o BD com o MysqlTuner ao menos uma vez a cada 60 dias. Isso também se aplica a servidores de webhosting com cPanel em produção. 3. Passo: Configurando o Nginx Ainda via SSH, abra o arquivo: # nano /etc/nginx/nginx.conf Altere o arquivo seguindo os comentários dispostos abaixo:

# Num de cores de seu servidor.

# Caso tenha mais que 4 cores, use 4 + Num. de CPU FISICA

worker_processes 5;



#Comente a linha abaixo, adicionando #

#worker_rlimit_nofile 8192;


events {

# 384 * NUM GB RAM ou 768 no mínimo.

worker_connections 6144;


#caso nao exista, adicione a tag abaixo

use epoll;

}




# Desative a compressao Gzip, afinal, quem vai comprimir vai ser

# o varnish! Basta adicionar # antes de


# gzip on


Reinicie o nginx, usando # /etc/init.d/nginx restart 4. Passo: Configurando o ISPConfig Como já disse anteriormente, no ISPConfig é tudo manual... logo... vamos lá: Acesse o ISPConfig via https://SEUIP:8080 O usuário padrão e senha padrão é: User: admin Senha: admin 4.1 Alterando a Senha do Admin Uma vez logado no ISPConfig, clique na aba "Extra" e em seguida no menu à esquerda em "Password and Language" Preencha os campos com a senha e idioma, conforme a imagem abaixo: senhax.png4.2 Configurando o DNS Partirei do príncipio que você irá utilizar DNS próprio no website. Acesse a aba "DNS" e clique em "Adicionar nova Zona com assistente". Na tela que se abrir, preencha os campos conforme as informações abaixo: Gabarito: Default Servidor: (vai estar o hostname que você configurou, no meu caso) frita.batatinha.com Cliente: Em branco Domínio: batatinha.com Endereco de IP: 1º IP do Servidor NS1: ns1.batatinha.com NS2: ns2.batatinha.com Correio: frita@batatinha.com Pronto, clique em Salvar! E você irá ver algo parecido com a imagem abaixo: listazona.png Agora, clique sobre o domínio batatinha.com. e na nova página, clique na abinha "Registros" (conforme imagem abaixo). listazona2.png E clique no botão "+A". Agora iremos adicionar as entradas A referente ao nosso nameservers. Hostname: ns1 IP: SEU_IP_1 Salve, e clique novamente em "+A", mas agora insira: Hostname: ns2 IP: SEU_IP_2 Pronto, sua zona DNS deverá ficar parecida com a minha: zonacompleta.png4.3 Adicionando o site Como você já entendeu o esquema de navegação do ISPConfig, não vou postar mais prints das abas e etc... Lembra-se daquelas configurações do PHPMyadmin, MailMan e SquirrelMail para o Nginx que falei que iríamos ver mais tarde? Então... volte lá e copie todas elas para o bloco de notas pois vamos usar já. Atenção: Copie apenas as dos programas que você instalou e somente as regras para HTTP. Esse tutorial não contempla como configurar o SSL num website. Clique na aba "Sites" e em seguida no botão "+ Add New Site". Na página que se abrir, na abinha "Website" preencha os campos seguindo o exemplo: Servidor: SEU_HOSTNAME Cliente: vazio Endereco de IP: * IPV6: (vazio) Cota de disco: -1 Cota de Tráfego: -1 CGI: (vazio) SSI: (vazio) Suas páginas de erro: (marque aqui) Auto-subdominio: wwww SSL: (vazio) PHP: Fast-CGI Ativo: (marque aqui) Antes de salvar, clique na abinha "Opções" e preencha os campos conforme o exemplo: Usuário Linux: (deixe o valor padrão) Groupo Linuxclient: deixe o valor padrão) Use Socket For PHP-FPM: (vazio) #Nos campos abaixo, multiplique os valores por um número constante. #No meu caso, multipliquei tudo por 20, mas varia conforme o hardware de seu servidor. PHP-FPM pm.max_children: 1000 PHP-FPM pm.start_servers: 400 PHP-FPM pm.min_spare_servers: 100 PHP-FPM pm.max_spare_servers: 700 open_basedir do PHP: deixe o valor padrão php.ini personalizado: deixe o valor padrão nginx Directives: (Cole aqui todas as configurações do Nginx que você copiou para o bloco de notas) Pronto, agora só salvar! 4.4 Criando meu Banco de Dados Ainda na aba "Sites", clique no menu à esquerda em "Bancos de Dados" e em seguida no botão "+Add new database". Preencha os campos conforme o exemplo abaixo: Servidor: (SEU_HOSTNAME) Cliente: (vazio) Tipo: Mysql Nome do Banco de Dados: c[CLIENTID]_(NOME_DO_BD) Usuário do Banco de Dados: c[CLIENTID]_(NOME_DO_USER) Senha do Banco de Dados: (SUA_SENHA) Charset do Banco de Dados: (DEFAULT ou LATIN1) Acesso Remoto: (vazio) Endereços IP Remotos: (vazio) Ativo: (marque aqui) Só salvar! Note que o nome do BD e user são meio esquisitos, deve ter ficado c0_qqrCoisa ou só c0QqrCoisa, mas quem está ligando para a beleza disso né? E por mais estranho que essa declaração a seguir possa parecer, o usuário e BD não são ligados a um domínio especificamente. bancoau.png4.5 Criando meu usuário de FTP Agora que você se familiarizou com a interface e as "excentricidade" do ISPConfig, então prossigamos. É hora do último passo na Interface dele: a criação do FTP. Na aba "Sites", clique no menu à esquerda em "Usuário FTP". Depois clique no botão "+Adicionar Usuário de FTP". Basta preencher os dados na abinha "FTP User" e salvar, acho que dispensa qualquer explicação agora... Fica de lição de casa descobrir como terminar de adicionar um usuário de FTP. 5. Passo: Fixando os bugs Por algum motivo ainda não muito esclarecido, o ISPConfig tende a não criar automaticamente as configurações realizadas no servidor, restringido apenas em adiciona-las no próprio DB.Este problema ocorre em cerca de 50% dos servidores rodando Centos 6.3. Isso pode ser resolvido facilmente rodando o comando # /usr/local/ispconfig/server/server.sh Mas tome nota que todos os arquivos de configuração serão re-escritos, perdendo todas personalizações daquelas não salvas no Painel. Para saber se seu servidor está a mercê desse bug, tente acessar o FTP imediatamente. 6. Passo: Instalando e Configurando o Varnish Para instalar o Varnish é fácil, basta executar no SSH como root: # yum install varnish Depois de instalado, vamos configura-lo para funcionar corretamente. Abra o arquivo:# nano /etc/sysconfig/varnish E siga as instruções abaixo:

#--------------------------------------------------

#COMENTE TODAS LINHAS ABAIXO

#DAEMON_OPTS="-a :6081 \

#			 -T localhost:6082 \

#			 -b localhost:8080 \

#			 -u varnish -g varnish \

#			 -s file,/var/lib/varnish/varnish_storage.bin,1G"



#----------------------------------------------------

# COMENTE DE NOVO AS LINHAS ABAIXO

#DAEMON_OPTS="-a :6081 \

#			 -T localhost:6082 \

#			 -f /etc/varnish/default.vcl \

#			 -u varnish -g varnish \

#			 -S /etc/varnish/secret \

#			 -s file,/var/lib/varnish/varnish_storage.bin,1G"



#------------------------------------------------

#DESCOMENTE AS LINHAS ABAIXO e siga as instrucoes

VARNISH_LISTEN_PORT=80

VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1

VARNISH_ADMIN_LISTEN_PORT=6082

VARNISH_SECRET_FILE=/etc/varnish/secret



#NUM DE THREADS, NO MEU CASO MIN DE 50 E MAX DE 1000

VARNISH_MIN_THREADS=50

VARNISH_MAX_THREADS=1000


#TIMEOUT

VARNISH_THREAD_TIMEOUT=120


#SO DESCOMENTE ESSA LINHA SE VC USAR CACHE EM DISCO

VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin


#TAMANHO DO CACHE. 4GB no meu caso

VARNISH_STORAGE_SIZE=4G


# TIPO DE STORAGE DO VARNISH.

#SE VC USAR CACHE EM DISCO, DESCOMENTE A LINHA

VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"

#SE FOR CACHE EM RAM, COMENTE A DE CIMA E ADICIONE

VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"

VARNISH_TTL=120

DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \

			 -f ${VARNISH_VCL_CONF} \

			 -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LIS$

			 -t ${VARNISH_TTL} \

			 -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VAR$

			 -u varnish -g varnish \

			 -S ${VARNISH_SECRET_FILE} \

			 -s ${VARNISH_STORAGE}"


Salve e pronto, vamos configurar as nossas VCL. 6.1 Entendendo e Configurando a VCL Uma VCL nada mais é do que a configuração do Varnish para uma aplicação. Digamos que é a configuração que vai dizer exatamente ao Varnish como, em que situações, de que maneira e onde deve ser armazenado e tratado o cache. É importante salientar que há duas versões do Varnish em circulação nos repositórios: a 3.0 e a 2.1.5, logo, antes de configurar sua VCL você deve saber qual versão do Varnish você está usando. Para isso, execute no ssh: # varnishd -V E o resultado será algo parecido com: # varnishd (varnish-2.1.5 SVN ) # Copyright © 2006-2009 Linpro AS / Verdens Gang AS Logo, fique atento. A partir daqui, vamos escolher a VCL que iremos usar para nosso Wordpress. Como estou usando a 2.1.5, cito uma VCL retirada do blog http://www.mihaivale...-for-wordpress/ que particularmente considero uma das melhores. E da para melhorar ainda mais. Quem ler o post, vai ver que ele conseguiu 4.4% de requisições indo para o Backend, eu citei acima que consegui 3.28% com algumas otimizaçõe a mais. Para inserir sua VCL, basta editar o arquivo # nano /etc/varnish/default.vcl E altere as linhas:


backend default {

.host = "127.0.0.1";

.port = "80";

}

PARA

backend default {

.host = "127.0.0.1";

.port = "8081";

}

E logo abaixo adicione:


sub vcl_recv {

/* These rules will apply for all the requests served */


/* Post requests will not be cached */

if (req.request == "POST") {

return (pass);

}


/* Normalize encoding/compression */

if (req.http.Accept-Encoding) {

if (req.http.Accept-Encoding ~ "gzip") { set req.http.Accept-Encoding = "gzip"; }

elsif (req.http.Accept-Encoding ~ "deflate") { set req.http.Accept-Encoding = "deflate"; }

else { remove req.http.Accept-Encoding; /* unknown algorithm, just remove */ }

}


/* Host: www.mysite.com; these rules will apply only for mysite.com */

if (req.http.host ~ "^(?:www\.)?mysite.com") {

unset req.http.vary;

/* Remove the following line if your site is serving content in the language it reads from the Accept-Language header */

unset req.http.accept-language;


/* If I am logged in to wordpress, I DO NOT WANT TO SEE cached pages */

if (req.http.cookie ~ "wordpress_logged_in") {

return (pass);

} else { /* If I'm just a regular visitor */

/* If the request is for pictures, javascript, css, etc */

if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {

/* Remove the cookie and make the request static */

unset req.http.cookie;

return (lookup);

}


/* Try to lookup in the cache */

return (lookup);

}

}


/* If the host header is empty, just return error */

error 404 req.http.host;

return (lookup);

}


sub vcl_fetch {

/* Host: www.mysite.com */

if (req.http.host ~ "^(?:www\.)?mysite.com") {

/* Do not cache POST requests */

if (req.request == "POST") {

return (pass);

}

/* If the request is for pictures, javascript, css, etc */

if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {

/* Cache it, and make it last 2 hours */

set beresp.ttl = 7200s;

/* Make the request static by removing any cookies set by those static files */

unset beresp.http.set-cookie;

/* Deliver the cached object */

return (deliver);

}

/* If I am logged in to wordpress, I DO NOT WANT TO SEE cached pages */

if (req.http.cookie ~ "wordpress_logged_in") {

return (pass);

} else {

/* Cache anything for 2 minutes. When the cache expires it will be cached again and again, at the time of the request */

set beresp.ttl = 120s;

return (deliver);

}

}

}

Pronto, salve.... e vamos para o último passo. 7. Passo: Finalizando o Nginx Como reparastes, colocamos o Varnish para rodar na porta 80.. via de regra o Linux não permite que 2 serviços ocupem a mesmissíma porta, logo,vamos ter que colocar o Nginx para rodar em outra porta, que será a 8081, uma vez que o ISPConfig está usando a porta 8080. Abra o arquivo # nano /etc/nginx/sites-available/batatinha.com.vhost Atenção: troque batatinha.com pelo seu domínio! Procure a linha:

listen :80;

e substitua por

listen :8081;

8. Passo: Reiniciando Tudo Agora só reiniciar tudo e torcer para que nada esteja errado: Execute:

/etc/init.d/varnish stop

/etc/init.d/nginx stop

pkill nginx

/etc/init.d/php-fpm stop

pkill php-fpm

/etc/init.d/mysqld stop

pkill mysqld

/etc/init.d/mysqld start

/etc/init.d/php-fpm start

/etc/init.d/nginx start

/etc/init.d/varnish start

FIM, SEJA FELIZ :D

Link to comment
Share on other sites

Desculpe desenterrar o tópico, mas ele foi muito útil para mim. 

 

Usei este tutorial como base para configurar o nginx + varnish + cpanel, sem nenhum plugin. (apachebooster, nginxcp, e outros). 

 

Fiz toda a configuração. O apache está na porta 81, o nginx na 8081 e o varnish na 80. 

 

O server funciona com o varnish desligado, normalmente. 

Quando eu digito "varnishhist" não aparece o relatório. 

 

então, creio que não esteja funcionando corretamente. 

 

Poderia me dar um help?

Link to comment
Share on other sites

Desculpe desenterrar o tópico, mas ele foi muito útil para mim. 

 

Usei este tutorial como base para configurar o nginx + varnish + cpanel, sem nenhum plugin. (apachebooster, nginxcp, e outros). 

 

Fiz toda a configuração. O apache está na porta 81, o nginx na 8081 e o varnish na 80. 

 

O server funciona com o varnish desligado, normalmente. 

Quando eu digito "varnishhist" não aparece o relatório. 

 

então, creio que não esteja funcionando corretamente. 

 

Poderia me dar um help?

Não entendi o porque do Apache e Nginx,... Ou um.. Ou outro.

Link to comment
Share on other sites

Simplesmente aparece que que a inicialização falhou: "FAILED".

Nos logs aparece isso:

 

"adjusted limit on open files from 4096 to 1048576, found 4 CPUs, using 4 worker threads, using up to 4096 sockets"
 
Já tentei solucionar de várias formas que encontrei na internet e nada =x
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Do you agree with our terms?