Sunteți pe pagina 1din 13

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ...

Page 1 of 13

Ele poderia ser dividido em vrios artigos independentes abordando cada etapa e instalao de cada software, mas reuni todas as informaes em um nico artigo que aborda um ambiente completo de alta disponibilidade, balanceamento de carga e cache (proxy reverso) de um ambiente web multiplataforma, como Apache + PHP ou Apache + Tomcat por exemplo.

Utilizaremos o keepalived para fornecer failover de endereamento IP e checagem de estado dos servidores web. Assim se um dos ns ficar fora de operao, o keepalived, atravs da sua checagem de estado, cuidar de configurar os devidos endereos e rotas IP nos ns que assumiro o servio anteriormente de outro servidor. J o Nginx (leia-se engine X) um rpido e leve servidor web e proxy reverso. Sua arquitetura interna otimizada, permite servir centenas de conexes com um pequeno overhead de CPU e memria. Nesta configurao usaremos o Nginx como um proxy reverso, onde as requisies das pginas dos nossos servidores web chegaro primeiramente ao Nginx que por sua vez realizar o balanceamento de carga entre os servidores web Apache serviro as pginas solicitadas. No nosso cenrio utilizaremos tambm o Nginx para servir o contedo esttico dos sites (como imagens, arquivos pdf, css, js etc), j que ele muito mais rpido que o apache fazendo este servio. Utilizaremos tambm a opo de fazer cache das pginas solicitadas, assim o Nginx pode responder uma pgina que j esteja em cache sem precisar abrir nenhuma conexo com os servidores Apache ou Tomcat, deixandoos livres pra processar o que realmente necessrio, no caso o contedo dinmico como PHP, JSP etc. As sesses so salvas por padro nas mesmas mquinas que servem o PHP. O que implica que temos que garantir que nossos usurios sejam direcionados para o mesmo servidor web. Mas nosso balanceamento de carga dividir equalitriamente as requisies entre os servidores web, ento uma sesso iniciada em um servidor no ser reconhecida nos outros servidores membros do cluster. Para resolver esse problema utilizaremos o repcached, que um patch para o memcached, que por sua vez um sistema que permite realizar cache de quase todo tipo de objetos (como resultados de funes, resultados de consultas de bancos de dados etc) em memria RAM. Realizar cache em memria ao invs carregar dados de um banco de dados, pode aumentar significativamente a performance de sistemas PHP. O repcached adiciona suporte replicao dos dados do memcached entre os ns do cluster, assim uma sesso que seja armazenada no repcached de um n estar disponvel em qualquer outro n do cluster, e se este n inicial vier a ficar indisponvel poder resgatar os seus dados armazenados nos outros membros do cluster quando voltar a ficar on-line. Assim sesses estaro ser compartilhadas entre todos os servidores que faro parte do nosso cluster, j que no temos como saber para qual servidor web o usurio ser balanceado a cada solicitao. Como nosso todos os ns do nosso cluster de alta disponibilidade web vai servir o mesmo contedo, isto , as mesmas pginas, temos que estar certificados que eles estejam sincronizados entre si. A soluo mais fcil seria utilizar um storage e um sistema de arquivos distribudo como ocfs2 ou gfs conectado aos servidores, mas como nem sempre temos um equipamento como esse disponvel, recorremos a outras solues. Poderamos usar um diretrio compartilhado por NFS e montado em todos os servidores, mas continuaramos assim com um gargalo que seria a alta taxa de I/O na rede. Optamos por usar uma simples soluo de espelhamento utilizando rsync nos diretrios publicados nos servidores web.Existem outras opes mais avanadas de espelhamento pela rede como o DRBB e sistemas de arquivos distribudos como o GlusterFS que exigiriam um artigo especfico falando sobre eles, mas para o nosso ambiente o rsync suficiente.

Utilizaremos apenas dois servidores fsicos utilizando Debian GNU/Linux 6 (squeeze) amd64 com uma instalao bsica atravs da imagem netinst. Apesar de utilizar apenas dois servidores esta soluo bastante escalvel podendo-se facilmente aumentar o nmero de ns do cluster de acordo com as necessidades. As requisies aos websites servidos sero primeiramente recebidas no Nginx do Servidor A, denominado master, que realizar o balanceamento das requisies entre os Apache dos Servidores A e B (back end servers) conforme a imagem abaixo:
Servidor A: 10.10.10.1 Servidor B: 10.10.10.2 IP Virtual (VIP): 10.10.10.10

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 2 of 13

Clique para ampliar

A fim de se evitar um Ponto nico de Falhas, (SPOF, Singe Point of Failure) realizaremos o chamado failover entre os processos Nginx, assim caso o Nginx do Servidr A venha a falhar o Servidor B assumir seu papel evitando que todo o sistema venha a ficar indisponvel, mesmo estando os servidores web de p e funcionando. Temos, portanto, dois nveis de Alta Disponibilidade, entre os balanceadores de carga (NginX) e entre os Servidores Web A e B (Apache), pois caso um deles fique indisponvel as requisies sero direcionadas apenas ao outro servidor at que o servidor defeituoso volta a ficar on-line. A ilustrao abaixo demonstra o cenrio em possveis falhas:
Falha 1 (Servidor B totalmente inoperante):

Clique para ampliar

Enquanto o Servidor B estiver indisponvel, as requisies sero encaminhadas somente ao Servidor A.


Falha 2 (Processo Nginx do Servidor A com problemas):

Clique para ampliar

Aqui temos um problema com o processo balanceador de carga do Servidor A, porm o servidor web Apache est funcionando e pronto para receber requisies. O Keepalived reconhecer que o Nginx do Servidor A caiu e o Servidor B ira atribuir para si o IP Virtual e tornara-se o balanceador de carga do sistema, encaminhando as requisies aos Apache dos Servidores A e B.
Falha 3 (Servidor A recupera-se da falha e volta ao estado de Master)

Clique para ampliar

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 3 of 13

O Servidor Web A tornase totalmente disponvel novamente, tanto o processo balanceador de carga Nginx quando o servidor web Apache. Ento o keepalived atribui novamente o IP Virtual para o Servidor A e este volta ao estado original do sistema, balanceando as requisies entre os Apache dos Servidores A e B.

Os seguintes comandos devem ser executados nos dois servidores membros do balanceamento de cargo, Servidores A e B. Instalamos o keepalived pelo apt-get:
1 aptget install keepalived

Aps, temos que editar o sysctl.conf e ativar a opo net.ipv4.ip_nonlocal_bind para permitir que processos escutem em endereos IP ainda no atribudos:
1 2 echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf sysctl p

Daqui pra frente a configurao ser dividida entre os Servidores A e B, j que possuem detalhes pertinentes a cada um. Executaremos os seguintes comandos no Servidor A, que ser denominado master no keepalived: Criaremos o arquivo de configurao do keepalived em /etc/keepalived/keepalived.conf com o seguinte contedo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 vrrp_script chk_http_port { script "/usr/bin/killall 0 nginx" interval 2 weight 2 } vrrp_instance VI_1 { interface eth0 state MASTER virtual_router_id 53 priority 101 # 101 on master, 100 on backup authentication { auth_type PASS auth_pass som3_an0th3r_p4ss } track_script { chk_http_port } virtual_ipaddress { 10.10.10.10/24 dev eth0 } }

O que instrui o keepalived a ficar monitorando o status os processos nginx. Enquanto o processo estiver rodando, os endereos ip definidos na seo virtual_ipaddress (10.10.10.10) sero atribudos ao servidor. Caso o processo venha a cair, ou o servidor inteiro ficar inoperante, o outro n detectar e caso o seu processo nginx esteja de p ele auto configurar o endereo ip virtual neste servidor, mantendo assim o servio sempre de p. Os parmetros virtual_router_ip e priority configura valores do protocolo de redundncia vrrp. Deve-se setar o mesmo valor de virtual_router_id para todos os ns participantes do balanceamento. J o valor de priority deve ser o maior no servidor master, aquele que iniciar com o endereo ip virtual atribudo, e valores inferiores a este nos servidores backups. Agora configuraremos o keepalived do Servidor B. Criaremos o arquivo de configurao do keepalived em /etc/keepalived/keepalived.conf com o seguinte contedo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 vrrp_script chk_http_port { script "/usr/bin/killall 0 nginx"; interval 2 weight 2 } vrrp_instance VI_1 { interface eth0 state MASTER virtual_router_id 53 priority 100 # 101 on master, 100 on backup authentication { auth_type PASS auth_pass som3_an0th3r_p4ss } track_script { chk_http_port }

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 4 of 13

19 20 21 22 23

virtual_ipaddress { 10.10.10.10/24 dev eth0 } }

Depois de salvos os arquivos, devemos iniciar o processo keepalived nos Servidores A e B:


1 service keepalived start

Aps isso, mensagens da inicializao do keepalived podero ser vistas nos logs, em especial em /var/log/messages.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Jan Jan Jan Jan Jan Jan Jan Jan Jan Jan Jan Jan Jan Jan Jan 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:34 10:50:35 10:50:36 servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA servidorA Keepalived_vrrp: Registering Kernel netlink reflector Keepalived_vrrp: Registering Kernel netlink command channel Keepalived_vrrp: Registering gratutious ARP shared channel Keepalived_vrrp: IPVS: Can't initialize ipvs: Protocol not available Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'. Keepalived_vrrp: Configuration is using : 62094 Bytes Keepalived_vrrp: Using LinkWatch kernel netlink reflector... Keepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available Keepalived_healthcheckers: Registering Kernel netlink reflector Keepalived_healthcheckers: Registering Kernel netlink command channel Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'. Keepalived_healthcheckers: Configuration is using : 4249 Bytes Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector... Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE

Verificaremos se o endereo ip virtual foi atribudo ao servidor master do balanceamento com sucesso:
1 ip addr show dev eth0

O que no Servidor Web A retorna:


1 2 3 4 5 6 7 root@servidorA:~# ip addr show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 54:52:00:07:9c:2e brd ff:ff:ff:ff:ff:ff inet 10.10.10.1/24 brd 10.10.10.255 scope global eth0 inet 10.10.10.10/24 scope global secondary eth0 inet6 fe80::5652:ff:fe07:9c2e/64 scope link valid_lft forever preferred_lft forever

J oServidor Web B retorna:


1 2 3 4 5 6 root@servidorB:~# ip addr show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 54:52:00:00:00:ac brd ff:ff:ff:ff:ff:ff inet 10.10.10.2/24 brd 10.10.10.255 scope global eth0 inet6 fe80::5652:ff:fe00:ac/64 scope link valid_lft forever preferred_lft forever

Como podemos ver o endereo IP Virtual (VIP) est atribudo ao Servidor Web A, que o servidor master do keepalived pois possui um valor da diretiva priority maior. Podemos testar se o failover est realmente funcionando parando o servio keepalived no Servidor Web A. Neste caso o Servidor Web B identificar o problema e atribuir para si o endereo IP Virtual. Paramos o keepalived no Servidor Web A:
1 service keepalived stop

Aps poucos segundos, verificaremos os endereos IP atribudos ao Servidor Web B:


1 2 3 4 5 6 7 root@servidorB:~# ip addr show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 54:52:00:00:00:ac brd ff:ff:ff:ff:ff:ff inet 10.10.10.2/24 brd 10.10.10.255 scope global eth0 inet 10.10.10.10/24 scope global secondary eth0 inet6 fe80::5652:ff:fe00:ac/64 scope link valid_lft forever preferred_lft forever

Como vimos o endereo IP foi atribudo com sucesso ao Servidor B, garantindo failover IP.

Para exemplificar, iremos hospedar um domnio no nosso sistema com as seguintes caractersticas: Endereo DNS: www.exemplo.com Endereo IP: 10.10.10.10 Como vemos, os nossos sites precisam resolver para o endereo IP Virtual, que por sua vez balancear as solicitaes entre os Servidores Web.

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 5 of 13

Instalaremos o Apache com apenas as configuraes necessrias para o nosso sistema funcionar, opes de hardenizao e segurana no sero abordadas aqui. Os comandos desta seo devem ser executados em ambos os Servidores Web A e B:
1 aptget install apache2 php5

Para que o Apache possa logar corretamente o IP do cliente que ser encaminhado pelo Nginx, devemos localizar e substituir as seguintes linhas de definies de log no arquivo /etc/apache2/apache2.conf:
1 2 LogFormat "%v:%p %h %l %u %t "%r" %>s %b "%{Referer}i" "%{UserAgent}i"" vhost_combined LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{UserAgent}i"" combined

por
1 2 3 4 #LogFormat "%v:%p %h %l %u %t "%r" %>s %b "%{Referer}i" "%{UserAgent}i"" vhost_combined LogFormat "%v %{XForwardedFor}i %l %u %t "%r" %>s %b "%{Referer}i" "%{UserAgent}i"" vhost_combined #LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{UserAgent}i"" combined LogFormat "%{XForwardedFor}i %l %u %t "%r" %>s %b "%{Referer}i" "%{UserAgent}i"" combined

Agora criaremos o arquivo de definies do VirtualHost do nosso domnio em /etc/apache2/sites-available/www.exemplo.com


1 2 3 4 5 6 7 <VirtualHost *:81> DocumentRoot "/var/www" ServerName www.exemplo.com ErrorLog "/var/log/apache2/www.exemplo.com.error_log" CustomLog "/var/log/apache2/www.exemplo.com.access_log" common </VirtualHost>

Agora ativamos o VirtualHost criado:


1 a2ensite www.exemplo.com

No arquivo /etc/apache2/ports.conf localizaremos as seguintes diretivas que configuram as portas nas quais o apache escuta:
1 2 NameVirtualHost *:80 Listen 80

e substiruiremos por:
1 2 NameVirtualHost *:81 Listen 81

O mesmo deve ser feito para o arquivo do VirtualHost padro, caso este esteja ativado, localizado em /etc/apache2/sites-available/default: Substituir:
1 <VirtualHost *:80>

por:
1 <VirtualHost *:81>

Conferimos se h algum erro de configurao:


1 2 root@servidorA:~# apache2ctl configtest Syntax OK

Agora reiniciamos o Apache:


1 apache2ctl restart

Os comandos desta seo devem ser executados em ambos os Servidores Web A e B: Instalamos o pacote via apt-get:
1 aptget install nginx

Utilizaremos o seguinte arquivo de configurao /etc/nginx/nginx.conf:


1 2 3 4 5 6 7 8 9 10 11 user wwwdata; worker_processes error_log pid 2;

/var/log/nginx/error.log; /var/run/nginx.pid; 1024;

events { worker_connections use epoll; # multi_accept on; }

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 6 of 13

12 13 14 15 16 17 18 19 20 21 22

http{ include/etc/nginx/mime.types; default_typeapplication/octetstream; access_log/var/log/nginx/access.log; gzip_disable"MSIE[16].(?!.*SV1)"; include/etc/nginx/conf.d/*.conf; include/etc/nginx/sitesenabled/*; server_names_hash_bucket_size33; }

Em seguida criaremos o arquivo /etc/nginx/conf.d/options.conf:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #SizeLimits client_body_buffer_size128K; client_header_buffer_size128K; client_max_body_size50M;#php'supload_max_filesize large_client_header_buffers88k; proxy_buffers816k; proxy_buffer_size32k; #Timeouts client_body_timeout60; client_header_timeout60; expiresoff; keepalive_timeout6060; send_timeout60; #GeneralOptions ignore_invalid_headerson; keepalive_requests100; limit_zonegulag$binary_remote_addr5m; recursive_error_pageson; sendfileon; server_name_in_redirectoff; server_tokensoff; #TCPoptions tcp_nodelayon; tcp_nopushon; #Compression gzipon; gzip_buffers168k; gzip_comp_level6; gzip_http_version1.0; gzip_min_length0; gzip_typestext/plaintext/cssimage/xiconapplication/xperlapplication/x gzip_varyon; #LogFormat log_formatmain'$remote_addr$host$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer""$http_user_agent"' '"$gzip_ratio"'; proxy_cache_path/var/cache/nginx/levels=1:2keys_zone=cache:100minactive=1hmax_size=1024M;

Na sequncia criaremos o arquivo /etc/nginx/conf.d/proxy.conf:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 proxy_cache_valid1h;#200,301and302willbecached. proxy_cache_use_staleerror timeout invalid_header http_500 http_502 http_504 http_404; proxy_bufferingon; proxy_cache_min_uses3; proxy_ignore_client_abortoff; proxy_intercept_errorson; proxy_next_upstreamerrortimeoutinvalid_header; proxy_redirectoff; proxy_set_headerXForwardedFor$remote_addr; proxy_connect_timeout600; proxy_send_timeout600; proxy_read_timeout600; proxy_ignore_headersExpiresCacheControl; proxy_cache_key"$scheme$host$uri$is_args$args";

E o arquivo /etc/nginx/conf.d/upstream.conf:
1 2 3 4 upstreamlb{ server10.10.10.1:81max_fails=10fail_timeout=300s;#WebServerA server10.10.10.2:81max_fails=10fail_timeout=300s;#WebServerB }

Crie o arquivo de definies do domnio no Nginx /etc/nginx/sitesavailable/www.exemplo.com com o seguinte contedo:


1 2 3 4 5 6 7 8 9 10 11 12 server{ listen10.10.10.10:80; server_namewww.exemplo.com; access_log/var/log/nginx/www.exemplo.com.access.log; location/{ proxy_passhttp://lb; proxy_set_headerHost$host; proxy_set_headerXRealIP$remote_addr; proxy_set_headerXForwardedFor$proxy_add_x_forwarded_for; } }

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 7 of 13

Agora, uma explicao mais detalhada dos principais parmetros setados nestes arquivos de configurao:
user www-data; Define com qual usurio o processo nginx ser iniciado. worker_processes 2; Define o nmero de threads do nginx. Geralmente seta-se este valor com o nmero de ncleos da CPU do servidor. sempre importante manipular esse valor fazendo um benchmark de conexes. worker_connections 1024; Nmero mximo de conexes por worker. Para saber o nmero de conexes do servidor multiplique: max_clients = worker_processes * worker_connections proxy_cache_valid 1h; Perodo em que um hit pode ficar no cache. Caso um objeto entre no cache, ele passar 1h marcado como vlido, e o servidor o usar quando tal objeto for requisitado. Aps expirado esse tempo o objeto sai do cache e novas requisies por ele sero realizadas diretamente aos servidores backend. upstream lb; Define um conjunto de servidores e portas para onde sero encaminhadas as requisies que no estiverem em cache. O nginx balancear as requisies de forma equalitria entre os servidores usando o mtodo round-robin. listen 10.10.10.10:80; Endereo e porta onde o Nginx escutar por conexes. server_name www.exemplo.com; Endereo DNS do VirtualHost. proxy_pass http://lb; Encaminha as requisies ao upstream lb definido no arquivo upstream.conf.

Agora criamos o link que ativa o VirtualHost para o diretrio /etc/nginx/sites-enabled:


1 2 cd /etc/nginx/sitesenabled/ ln s../sitesavailable/www.exemplo.com.br

Criamos tambm o diretrio onde ser armazenado o cache do Nginx e setamos suas permisses:
1 2 mkdir /var/cache/nginx/ chown Rwwwdata:wwwdata/var/cache/nginx/

Vamos testar a configurao do Nginx antes de inicia-lo, caso exista algum erro nos arquivos de configurao este teste acusar:
1 2 3 root@servidorA:~#nginxt theconfigurationfile /etc/nginx/nginx.confsyntaxisok configurationfile /etc/nginx/nginx.conftest issuccessful

Agora, podemos iniciar o servio Nginx nos Servidores A e B:


1 servicenginxstart

Agora temos o nosso cluster de alta disponibilidade parcialmente completo, mas j podemos testar o FailOver IP e a distribuio das conexes entre os backends. Criaremos um arquivo dentro do diretrio /var/www de cada servidor com o hostname do servidor:
1 root@servidorA:~#hostnamef>>/var/www/index.html

Agora iremos abrir no Navegador o endereo do site que acabamos de configurar e pressionando o boto Atualizar por vrias vezes, poderemos ver que ele o sistema est balanceando as conexes entre os dois servidores web.

Utilizaremos o repcached para replicar as sesses dos sistemas que rodaro nos dois servidores, assim usurios logados em um servidor no perdero suas sesses quando balanceados para o outro servidor. Os comandos a seguir devem ser executados em ambos Servidores A e B. Temos que editar os seguintes valores na seo Session do arquivo /etc/php5/apache2/php.ini:
1 2 3 [Session] session.save_handler=memcache session.save_path="tcp://10.10.10.1:11211,tcp://10.10.10.2:11211"

Assim dizemos ao php para gravar as sees no memcache, e informamos os endereos IP dos servidores que faro parte da replicao. Editamos tambm o arquivo /etc/php5/conf.d/memcache.ini:
1 2 memcache.maxratio=0 memcache.allow_failover=1

Agora procedemos com a instalao do memcached:

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 8 of 13

aptgetinstall memcached

Aps isso devemos baixar o cdigo-fonte do repcached, compilar e instala-lo no servidor. Infelizmente o repcached ainda no empacotado no repositrio oficial do Debian.
1 2 3 4 5 6 7 cd /usr/src/ wget"http://ufpr.dl.sourceforge.net/project/repcached/repcached/2.21.2.8/memcached1.2.8repcached tar zxvfmemcached1.2.8repcached2.2.tar.gz cd memcached1.2.8repcached2.2 ./configure enablereplication make make install

No Servidor A usaremos o seguinte arquivo de configurao /etc/repcached.conf:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 #repcachedconfigfile #2011 jeancaffou #Runrepcachedasadaemon.Thiscommandisimplied,andisnotneededforthe #daemontorun.SeetheREADME.Debianthatcomeswiththispackageformore #information. d #Logrepcached'soutputto/var/log/repcached logfile/var/log/repcached.log #Beverbose #v #Beevenmoreverbose(printclientcommandsaswell) #vv #Startwithacapof64megsofmemory.It'sreasonable,andthedaemondefault #Notethatthedaemonwillgrowtothissize,butdoesnotstartoutholdingthismuch #memory m64 #Defaultconnectionportis11211 p11211 #Runthedaemonasroot.Thestartrepcachedwilldefaulttorunningasrootifno #ucommandispresentinthisconfigfile unobody #SpecifywhichIPaddresstolistenon.ThedefaultistolistenonallIPaddresses #Thisparameterisoneoftheonlysecuritymeasuresthatrepcachedhas,somakesure #it'slisteningonafirewalledinterface. #l127.0.0.1 #Limitthenumberofsimultaneousincomingconnections.Thedaemondefaultis1024 #c1024 #Lockdownallpagedmemory.ConsultwiththeREADMEandhomepagebeforeyoudothis #k #Returnerrorwhenmemoryisexhausted(ratherthanremovingitems) #M #Maximizecorefilelimit #r #Portforserverreplication.Defaultis11212 X11212 #IPforrepcachedpeerserver x10.10.10.2

E o seguinte no Servidor B:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #repcachedconfigfile #2011 jeancaffou #Runrepcachedasadaemon.Thiscommandisimplied,andisnotneededforthe #daemontorun.SeetheREADME.Debianthatcomeswiththispackageformore #information. d #Logrepcached'soutputto/var/log/repcached logfile/var/log/repcached.log #Beverbose #v #Beevenmoreverbose(printclientcommandsaswell) #vv #Startwithacapof64megsofmemory.It'sreasonable,andthedaemondefault #Notethatthedaemonwillgrowtothissize,butdoesnotstartoutholdingthismuch #memory m64 #Defaultconnectionportis11211 p11211 #Runthedaemonasroot.Thestartrepcachedwilldefaulttorunningasrootifno #ucommandispresentinthisconfigfile unobody #SpecifywhichIPaddresstolistenon.ThedefaultistolistenonallIPaddresses #Thisparameterisoneoftheonlysecuritymeasuresthatrepcachedhas,somakesure #it'slisteningonafirewalledinterface. #l127.0.0.1 #Limitthenumberofsimultaneousincomingconnections.Thedaemondefaultis1024 #c1024 #Lockdownallpagedmemory.ConsultwiththeREADMEandhomepagebeforeyoudothis

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy+ ... Page 9 of 13

39 40 41 42 43 44 45 46 47 48 49 50 51

#k #Returnerrorwhenmemoryisexhausted(ratherthanremovingitems) #M #Maximizecorefilelimit #r #Portforserverreplication.Defaultis11212 X11212 #IPforrepcachedpeerserver x10.10.10.1

Como podemos observar no final destes arquivos informado o endereo IP do outro n que vai rodar o repcached. Assim o Servidor A informa no seu arquivo de configurao o endereo IP do Servidor e vice-versa. Aproveitaremos alguns arquivos da instalao do memcached para usarmos no repcached:
1 cp /etc/default/memcached /etc/default/repcached

Em seguida editamos o arquivo /etc/default/repcached e alteramos a seguinte linha de:


1 ENABLE_MEMCACHED=no

para
1 ENABLE_REPCACHED=YES

E desativamos a inicializao do memcached editando o arquivo /etc/default/memcached de:


1 ENABLE_MEMCACHED=YES

para
1 ENABLE_MEMCACHED=no

Utilizaremos o seguinte script rc para o repcached, localizado em /etc/init.d/repcached:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #!/bin/sh ###BEGININITINFO #Provides:repcached #RequiredStart:$remote_fs$syslog #RequiredStop:$remote_fs$syslog #ShouldStart:$local_fs #ShouldStop:$local_fs #DefaultStart:2345 #DefaultStop:016 #ShortDescription:Startrepcacheddaemon #Description:Startuprepcached,ahighperformancememorycachingdaemonwithreplication ###ENDINITINFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/bin/memcached DAEMONBOOTSTRAP=/usr/share/memcached/scripts/startrepcached NAME=repcached DESC=repcached PIDFILE=/var/run/$NAME.pid testx$DAEMON||exit0 testx$DAEMONBOOTSTRAP||exit0 sete ./lib/lsb/initfunctions #Edit/etc/default/repcachedtochangethis. ENABLE_REPCACHED=no testr/etc/default/repcached&&./etc/default/repcached case"$1"in start) echon"Starting$DESC:" if[$ENABLE_REPCACHED=yes];then startstopdaemonstartquietexec$DAEMONBOOTSTRAP echo"$NAME." else echo"$NAMEdisabledin/etc/default/repcached." fi ;; stop) echon"Stopping$DESC:" startstopdaemonstopquietoknodopidfile$PIDFILEexec$DAEMON echo"$NAME." rmf$PIDFILE ;; restart|forcereload) # #Ifthe"reload"optionisimplemented,movethe"forcereload" #optiontothe"reload"entryabove.Ifnot,"forcereload"is #justthesameas"restart". # echon"Restarting$DESC:" startstopdaemonstopquietoknodopidfile$PIDFILE rmf$PIDFILE sleep1 startstopdaemonstartquietexec$DAEMONBOOTSTRAP echo"$NAME." ;; status) status_of_proc$DAEMON$NAME ;;

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy... Page 10 of 13

66 67 68 69 70 71 72

N=/etc/init.d/$NAME echo"Usage:$N{start|stop|restart|forcereload|status}">&2 exit1 ;; esac exit0

Substituiremos tambm o arquivo /usr/share/memcached/scripts/start-repcached pelo o seguinte:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 #!/usr/bin/perlw #startrepcached #2011 JeanCaffou<jean@briskula.si> #Thisscripthandlestheparsingofthe/etc/repcached.conffile #andwasoriginallycreatedfortheDebiandistribution. #Anyonemayusethislittlescriptunderthesametermsas #memcacheditself. usestrict; if($>!=0and$<!=0) { printSTDERR"Onlyrootwantstorunstartrepcached.n"; exit; } my$params;my$etchandle;my$etcfile="/etc/repcached.conf"; #Thisscriptassumesthatrepcachedislocatedat/usr/local/bin/memcached,and #thatthepidfileiswritableat/var/run/repcached.pid my$memcached="/usr/local/bin/memcached"; my$pidfile="/var/run/repcached.pid"; #Ifwedon'tgetavalidlogfileparameterinthe/etc/repcached.conffile, #we'lljustthrowawayallofourindaemonoutput. my$fd_reopened="/dev/null"; subhandle_logfile { my($logfile)=@_; $fd_reopened=$logfile; } subreopen_logfile { my($logfile)=@_; open*STDERR,">>$logfile"; open*STDOUT,">>$logfile"; open*STDIN,">>/dev/null"; $fd_reopened=$logfile; } #Thisissetupinplaceheretosupportothernon[az]directives my$conf_directives={ "logfile"=>&handle_logfile, }; if(open$etchandle,$etcfile) { foreachmy$line(<$etchandle>) { $line||=""; $line=~s/#.*//g; $line=~s/s+$//g; $line=~s/^s+//g; nextunless$line; nextif$line=~/^[dh]/; if($line=~/^[^]/) { my($directive,$arg)=$line=~/^(.*?)s+(.*)/; $conf_directives>{$directive}>($arg); next; } push@$params,$line; } }else{ $params=[]; } push@$params,"uroot"unless(grep"u",@$params); $params=join"",@$params; if(e$pidfile) { openPIDHANDLE,"$pidfile"; my$localpid=<PIDHANDLE>; closePIDHANDLE; chomp$localpid; if(d"/proc/$localpid") { printSTDERR"repcachedisalreadyrunning.n"; exit; }else{ `rmf$localpid`; } } my$pid=fork(); if($pid==0)

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy... Page 11 of 13

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

{ reopen_logfile($fd_reopened); exec"$memcached$params"; exit(0); }else{ if(openPIDHANDLE,">$pidfile") { printPIDHANDLE$pid; closePIDHANDLE; }else{ printSTDERR"Can'twritepidfileto$pidfile.n"; } }

Em seguida configuramos a inicializao do repcached durante o boot do sistema:


1 2 chmod +x/etc/init.d/repcached updaterc.drepcacheddefaults

Iniciamos o repcached:
1 servicerepcachedstart

Agora vamos fazer um teste para estarmos seguros de que a replicao de sesso esteja funcionando corretamente: Primeiro, no Servidor A iremos escrever uma chave chamada "mykey" com o valor "12345" e recuperaremos seu valor no Servidor B:
1 2 3 4 5 6 7 8 9 10 11 [user@host~]$telnet10.10.10.111211 Trying10.10.10.1... Connectedto10.10.10.1 Escapecharacteris'^]'. set mykey16005 12345 STORED getmykey VALUEmykey15 12345 END

Aps isso, a chave deve ter sido replicada para o Servidor B, onde recuperaremos seu valor:
1 2 3 4 5 6 7 8 [user@host~]$telnet10.10.10.211112 Trying10.10.10.2... Connectedto10.10.10.2 Escapecharacteris'^]'. getmykey VALUEmykey15 12345 END

Como vimos o valor do objeto mykey foi setado no Servidor A, replicado e recuperado no Servidor B. Agora temos nossa configurao do repcached funcionando perfeitamente.

Iremos configurar o rsync para sincronizar o contedo do diretrio /var/www do Servidor A para o Servidor B, assim deveremos copiar os arquivos para os sites no Servidor A que automaticamente os copiar para o Servidor B. Portanto servios como FTP, usados para atualizar os dados dos websites servidos, devem ser instalados no Servidor A.
1 aptgetinstall rsync

Em seguida criaremos um usurio rsync nos dois hosts e configuraremos autenticao por chaves RSA no ssh, para no haver a pergunta de senha a cada vez que o comando for executado: No Servidor B:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 root@servidorB:~#useraddrsyncc"RsyncUser"d/var/www/s/bin/false root@servidorB:~#mkdir~rsync/.ssh root@servidorB:~#chownrsync:root/var/www/var/www/.ssh root@servidorB:~#chmod0755/var/www root@servidorB:~#sshkeygen Generatingpublic/private rsakeypair. Enterfile in which tosavethekey(/root/.ssh/id_rsa): Enterpassphrase(emptyfor nopassphrase): Entersamepassphraseagain: Youridentificationhasbeensavedin /root/.ssh/id_rsa. Yourpublickeyhasbeensavedin /root/.ssh/id_rsa.pub. Thekeyfingerprintis: 6f:5b:a1:6b:e9:f6:78:4e:a1:9f:f4:86:79:73:cd:46root@marina Thekey'srandomartimageis: +[RSA2048]+ || || || || |So| |.ooE| |=.+oo.| |.+O+o+=| |+=+=o.+| ++

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy... Page 12 of 13

No Servidor A:
1 2 3 root@servidorA:~#useraddrsyncc"RsyncUser"d/var/www/s/bin/bash root@servidorA:~#chownrsync:root/var/www root@servidorA:~#chmod0755/var/www

Agora copiamos o contedo da chave recm-criada do Servidor B para o Servidor A conforme os passos abaixo: Servidor B:
1 root@servidorB:~#scp/root/.ssh/id_rsa.pubroot@10.10.10.1:~rsync/.ssh/authorized_keys

E setamos as devidas permisses dos arquivos criados no Servidor A:


1 2 root@servidorA:~#chownRrsync:rsync~/rsync/.ssh/ root@servidorA:~#chmod0600~/rsync/.ssh/authorized_keys

Agora criaremos um diretrio no Servidor A, e em seguida executaremos o rsync no Servidor B, que dever sincronizar os dois diretrios: Servidor A:
1 root@servidorA:~#mkdir/var/www/rsynctest

Servidor B:
1 root@servidorB:~#rsyncavdeletersync@10.10.10.1/var/www//var/www/

Se o rsync copiou o diretrio criado no Servidor A para o Servidor B, nossa configurao est correta. Basta apenas adicionar o comando ao cron para ser executado de minuto a minuto para manter os diretrios o mais sincronizados possveis. No Servidor A abrimos o arquivo crontab do usurio root com o seguinte comando:
1 crontab e

E adicionamos a seguinte linha:


1 2 #rsync */1****rsyncadeletersync@10.10.10.1:/var/www//var/www/

A configurao da sincronizao do Servidor A para o Servidor B foi concluda e ser executada uma vez a cada minuto.

Se desejarmos utilizar https nos sites hospedados em nosso cluster de alta disponibilidade, deveremos configurar os certificados digitais no Nginx. J o Apache deve servir os sites em texto plano como mostra a figura abaixo:

Clique para ampliar

Vamos adicionar suporte SSL ao VirtualHost www.exemplo.com que j foi configurado no Nginx. Vamos assumir que j temos os certificados SSL em mos, porm se voc precisar de um certificado SSL vlido e gratuito recomendo o htttp://www.startssl.com que possui suporte na maioria dos navegadores e possui uma verso gratuita de certificados vlidos. Usaremos o seguinte arquivo /etc/nginx/sites-available/www.exemplo.com:
1 2 3 4 5 6 7 8 9 10 11 12 server{ listen10.10.10.10:443; server_namewww.exemplo.com; access_log/var/log/nginx/www.exemplo.com.access.log; error_log/var/log/nginx/www.exemplo.com.error.log; sslon; ssl_certificate/etc/apache2/ssl.crt/www.exemplo.com.crt; ssl_certificate_key/etc/apache2/ssl.key/www.exemplo.com.key; ssl_session_cacheshared:SSL:10m;

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

HOWTO: High Available HTTP Load Balancer with Nginx Reverse Cached Proxy... Page 13 of 13

13 14 15 16 17 18 19 20 21 22 23 24 25

ssl_session_timeout5m; ssl_protocolsTLSv1; ssl_ciphersHIGH:!ADH:!MD5; ssl_prefer_server_cipherson; keepalive_timeout60; location/{ proxy_passhttp://lb; proxy_set_headerHost$host; proxy_set_headerXRealIP$remote_addr; proxy_set_headerXForwardedFor$proxy_add_x_forwarded_for; } }

A opo de cache do Nginx deve ser usada com cuidado, principalmente quando estamos servindo contedo dinmico ou pginas de sistemas. Uma boa aplicao do cache seria em pginas estticas muito acessadas, por exemplo resultados de concursos, pginas iniciais de instituies entre outras aplicaes. Por exemplo, queremos ativar o cache da pgina www.exemplo.com/fotos/ Iremos alterar o arquivo de configurao /etc/nginx/sites-enabled/www.exemplo.com:
1 2 3 4 5 6 7 8 9 location/fotos/{ proxy_passhttp://lb; proxy_set_headerHost$host; proxy_set_headerXRealIP$remote_addr; proxy_set_headerXForwardedFor$proxy_add_x_forwarded_for; #cachesettings include/etc/nginx/conf.d/proxy.conf; proxy_cachecache; }

As principais diretivas que controlam como o cache funciona so:


proxy_cache_min_uses 3; Define o nmero de hits necessrios para uma pgina entrar em cache. Neste exemplo caso a pgina configurada seja acessada por 3 vezes ela ser inclusa no cache do Nginx por um perodo de tempo definido na diretiva proxy_cache_valid, e durante este intervalo o servidor Apache no ser consultado para esta pgina. proxy_cache_key "$scheme$host$uri$is_args$args"; Define a chave que ser utilizada para os objetos em cache. No exemplo utilizamos a URL completa com argumentos, mas poderamos setar cookies nas aplicaes para que determinadas pginas no entrassem no cache; proxy_cache_valid 1h; Perodo de tempo em que uma pgina pode permanecer no cache. Aps expirado este tempo, a pgina volta a ser consultada nos servidores back end e aps proxy_cache_min_uses vezes ela voltar ao cache.

Para mais informaes respeito das diretivas do Nginx recomendo a leitura da documentao on-line no Wiki do projeto em: http://wiki.nginx.org/Modules.

http://www.proger.eti.br/2012/01/howto-high-available-http-load-balancer-with-nginx... 03/02/2013

S-ar putea să vă placă și