SlideShare una empresa de Scribd logo
1 de 27
Escalando sites com Nginx


    Um servidor web com código
         RUUUUUUSSO




                  
Porque Nginx?




             
Escalando sites com Nginx

    ●   Sites de conteúdo estático
    ●   Sites de conteúdo dinâmicos
    ●   Sites de conteúdo do usuário




                              
Porque não estático?



                      Top fãs

    Top músicas       Relacionados

       Gêneros        Notícias
                      Playlists
    Comentários


                   
Conteúdo dinâmico...

    ●   Tempo de resposta alto
    ●   Sobrecarga no servidor
    ●   Requisições enfileiradas
    ●   Queries desnecessárias




                              
Solucionando com Nginx



    Começando do básico



              
Cache


                     Server
        Nginx
                    dinâmico




        Cache




                 
Confs no nginx

    proxy_cache_path                        location ~ ^/ {
      /opt/projeto/nginx/cache                 proxy_pass http://localhost:3000;
      levels=2:2:2                             proxy_cache cache_local;
      keys_zone=cache_local:200m            }
      max_size=2000m
      inactive=7d;

    proxy_cache_key "$host$uri";

    proxy_cache_valid 301 302 120m;
    proxy_cache_valid 200 404 20m;

    proxy_temp_path /tmp/proxy 2 2 2;
    proxy_read_timeout 5;
    proxy_connect_timeout 20;
    proxy_send_timeout 20;
                                         
Verificando se funcionou

log_format proxy '[$time_local] $uri $status $upstream_cache_status $upstream_status';
access_log /var/log/nginx/proxy.log proxy;



> ab -n 3 -c 1 http://localhost/pessoa/1
> tail -f /var/log/nginx/proxy.log
[26/Apr/2012:23:03:04 -0300] /pessoas/1 200 MISS 200
[26/Apr/2012:23:03:04 -0300] /pessoas/1 200 MISS 200
[26/Apr/2012:23:03:04 -0300] /pessoas/1 200 MISS 200




                                            
Não aceitamos biscoitos


     location ~ ^/ {
        proxy_pass http://localhost:3000;
        proxy_ignore_headers
             "Expires"
             "Cache-Control"
             "Set-Cookie";
        proxy_cache cache_local;
     }



                        
Aí sim!!!


> ab -n 3 -c 1 http://localhost/pessoa/1
> tail -f /var/log/nginx/proxy.log
[26/Apr/2012:23:09:04 -0300] /pessoas/1 200 MISS 200
[26/Apr/2012:23:09:04 -0300] /pessoas/1 200 HIT -
[26/Apr/2012:23:09:04 -0300] /pessoas/1 200 HIT -




                           
Acessos Simultâneos

1. 100 requisições simultâneas na url X

2. Nginx verifica 100 vezes que url X não está no cache

3. Nginx envia 100 vezes requisição da url X para server dinâmico

4. Nginx cacheia 100 vezes url X




                                    
O problema na prática

> ab -n 10 -c 10 http://localhost/pessoa/4
> tail -f /var/log/nginx/proxy.log
[26/Apr/2012:23:17:26 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200
[26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200



                               
Stale updating


                 Nginx                Server
                 Stale               dinâmico

      consulta
       cache                 grava
                             cache


                 Cache




                          
Stale para erros e timeouts




      consulta
                 Nginx
                 Stale
                             XServer
                             dinâmico


       cache



                 Cache




                          
Confs do stale no nginx

    proxy_cache_path
      /opt/projeto/nginx/cache
      levels=2:2:2
      keys_zone=cache_local:200m
      max_size=2000m
      inactive=7d;

    proxy_cache_use_stale
        error timeout invalid_header
        updating
        http_500 http_502 http_503 http_504;
    proxy_read_timeout 5;
    proxy_connect_timeout 20;
    proxy_send_timeout 20;
                                   
Solucionado

> ab -n 10 -c 10 http://localhost/pessoa/4
> tail -f /var/log/nginx/proxy.log
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING -
[26/Apr/2012:23:19:30 -0300] /pessoas/4 200 EXPIRED 200



                               
Primeiro request :(


                 Nginx                Server
                 Stale               dinâmico

      consulta
       cache                 grava
                             cache


                 Cache




                          
Busy Lock



    proxy_cache_lock on;




              
Flood de timeouts

→ Server dinâmico demorando pra responder

→ Nginx não atualiza cache

→ Efeito cumulativo




                       
Flood de timeout na prática
def show
  sleep 10
end

> ab -n 3 -c 1 http://localhost/pessoa/4
> tail -f /var/log/nginx/proxy.log
[26/Apr/2012:23:29:02 -0300] /pessoas/4 200 STALE 200
[26/Apr/2012:23:29:07 -0300] /pessoas/4 200 STALE 200
[26/Apr/2012:23:29:12 -0300] /pessoas/4 200 STALE 200

tail -f log/development.log | grep "pessoas/4"
Started GET "/pessoas/4" for 127.0.0.1 at 2012-04-26 23:28:57 -0300
Started GET "/pessoas/4" for 127.0.0.1 at 2012-04-26 23:29:07 -0300
Started GET "/pessoas/4" for 127.0.0.1 at 2012-04-26 23:29:17 -0300

                                  
Solução do Colin Saliceti


    Nginx 1             Nginx 2              Server
     stale    Timeout    Stale    Timeout   dinâmico
               Baixo                Alto




    Cache               Cache




                          
Exemplo
                                 server {
 proxy_cache_path                    listen 127.0.0.1:80;
   /opt/projeto/nginx/cache/fe       location ~ ^/ {
   levels=2:2:2                          proxy_pass http://localhost:81;
   keys_zone=frontend:200m               # ...
   max_size=2000m                        proxy_read_timeout: 5s;
   inactive=7d;                          proxy_cache frontend;
                                     }
proxy_cache_path                 }
   /opt/projeto/nginx/cache/be   server {
   levels=2:2:2                      listen 127.0.0.1:81;
   keys_zone=backend:200m            location ~ ^/ {
   max_size=2000m                        proxy_pass http://localhost:3000;
   inactive=7d;                          #…
                                         proxy_ignore_client_abort on;
 #...                                    proxy_read_timeout 30s;
                                         proxy_cache backend;
 proxy_read_timeout 5;               }
                                 }  
Flood resolvido

> ab -n 3 -c 1 http://localhost/pessoa/8
> tail -f /var/log/nginx/proxy.log
[27/Apr/2012:01:27:17 -0300] /pessoas/8 200 STALE 200 5.001
[27/Apr/2012:01:27:17 -0300] /pessoas/8 200 UPDATING - -
[27/Apr/2012:01:27:17 -0300] /pessoas/8 200 EXPIRED 200 0.001
[27/Apr/2012:01:27:17 -0300] /pessoas/8 200 HIT - -
[27/Apr/2012:01:27:22 -0300] /pessoas/8 200 EXPIRED 200 10.010


tail -f log/development.log | grep "pessoas/8"
Started GET "/pessoas/8" for 127.0.0.1 at 2012-04-27 01:27:12 -0300




                                  
Escalando

              Nginx 1       Nginx 2    Server
               stale         Stale    dinâmico


              Nginx 1       Nginx 2    Server
Balanceador    stale         Stale    dinâmico


              Nginx 1       Nginx 2    Server
               stale         Stale    dinâmico



                         
Conclusão

    ●   Estável
    ●   Performático
    ●   Escalável
    ●   Baixo custo
    ●   Sossego




                        
Mantenha contato

timotta@gmail.com

@timotta

http://programandosemcafeina.blogspot.com




                      

Más contenido relacionado

La actualidad más candente

Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxThiago Paes
 
Hyper Text Transfer Protocol (HTTP)
Hyper Text Transfer Protocol (HTTP)Hyper Text Transfer Protocol (HTTP)
Hyper Text Transfer Protocol (HTTP)elliando dias
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Felipe Blini
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMRodrigo Zaccara
 
Yaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensãoYaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensãoThiago Paes
 
O bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsO bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsNuno Paz
 
NGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação webNGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação webernaniaz
 
Descobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performanceDescobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performanceGustavo Ciello
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website CacheavelLucas Brasilino
 
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4David Ruiz
 
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Aécio Pires
 
Instalação de um servidor debian
Instalação de um servidor debianInstalação de um servidor debian
Instalação de um servidor debianEduardo Mendes
 

La actualidad más candente (20)

Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 
Hyper Text Transfer Protocol (HTTP)
Hyper Text Transfer Protocol (HTTP)Hyper Text Transfer Protocol (HTTP)
Hyper Text Transfer Protocol (HTTP)
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVM
 
Yaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensãoYaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensão
 
O bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsO bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.js
 
Squid
SquidSquid
Squid
 
NGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação webNGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação web
 
Slides nginx
Slides nginxSlides nginx
Slides nginx
 
Servidor proxy Squid
Servidor proxy SquidServidor proxy Squid
Servidor proxy Squid
 
Descobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performanceDescobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performance
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website Cacheavel
 
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
FISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de DatacentersFISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de Datacenters
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4
 
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
 
Redis na Prática
Redis na PráticaRedis na Prática
Redis na Prática
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
 
Instalação de um servidor debian
Instalação de um servidor debianInstalação de um servidor debian
Instalação de um servidor debian
 

Similar a Escalando sites com Nginx: cache, stale e balanceamento de carga

Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)elliando dias
 
Escalabilidade e alta disponibilidade no php com nginx
Escalabilidade e alta disponibilidade no php com nginxEscalabilidade e alta disponibilidade no php com nginx
Escalabilidade e alta disponibilidade no php com nginxSaveincloud
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida realFernando Ike
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaCaelum
 
Project HA
Project HAProject HA
Project HAKarpv
 
Alta Disponibilidade utilizando Pacemaker e DRBD
Alta Disponibilidade utilizando Pacemaker e DRBDAlta Disponibilidade utilizando Pacemaker e DRBD
Alta Disponibilidade utilizando Pacemaker e DRBDFrederico Madeira
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...Marlon Willrich
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...Mauro Risonho de Paula Assumpcao
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]Tiago Hillebrandt
 
Economize o Consumo de Link WAN com o BranchCache
Economize o Consumo de Link WAN com o BranchCacheEconomize o Consumo de Link WAN com o BranchCache
Economize o Consumo de Link WAN com o BranchCacheRodrigo Immaginario
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneosFernando Ike
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresDouglas V. Pasqua
 

Similar a Escalando sites com Nginx: cache, stale e balanceamento de carga (20)

Aula 2
Aula 2Aula 2
Aula 2
 
Squid proxy
Squid proxySquid proxy
Squid proxy
 
Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)
 
Escalabilidade e alta disponibilidade no php com nginx
Escalabilidade e alta disponibilidade no php com nginxEscalabilidade e alta disponibilidade no php com nginx
Escalabilidade e alta disponibilidade no php com nginx
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vida
 
Project HA
Project HAProject HA
Project HA
 
Alta Disponibilidade utilizando Pacemaker e DRBD
Alta Disponibilidade utilizando Pacemaker e DRBDAlta Disponibilidade utilizando Pacemaker e DRBD
Alta Disponibilidade utilizando Pacemaker e DRBD
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula2 - Semana Sistemas de Informação 2015 - UNI...
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
 
Linux - Servidor Web Apache
Linux - Servidor Web ApacheLinux - Servidor Web Apache
Linux - Servidor Web Apache
 
Economize o Consumo de Link WAN com o BranchCache
Economize o Consumo de Link WAN com o BranchCacheEconomize o Consumo de Link WAN com o BranchCache
Economize o Consumo de Link WAN com o BranchCache
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneos
 
GlusterFs
GlusterFsGlusterFs
GlusterFs
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 

Más de Tiago Albineli Motta

Challenges and research for a real-time recommendation at OLX
Challenges and research for a real-time recommendation at OLXChallenges and research for a real-time recommendation at OLX
Challenges and research for a real-time recommendation at OLXTiago Albineli Motta
 
Inteligência Artificial: Da ciência da computação à ciência de dados
Inteligência Artificial: Da ciência da computação à ciência de dadosInteligência Artificial: Da ciência da computação à ciência de dados
Inteligência Artificial: Da ciência da computação à ciência de dadosTiago Albineli Motta
 
Machine Learning no dia a dia do desenvolvedor (Atualizado)
Machine Learning no dia a dia do desenvolvedor (Atualizado)Machine Learning no dia a dia do desenvolvedor (Atualizado)
Machine Learning no dia a dia do desenvolvedor (Atualizado)Tiago Albineli Motta
 
Machine Learning no dia a dia do desenvolvedor
Machine Learning no dia a dia do desenvolvedorMachine Learning no dia a dia do desenvolvedor
Machine Learning no dia a dia do desenvolvedorTiago Albineli Motta
 
Machine Learning e experimentos online para evitar o cancelamento no GloboPlay
Machine Learning e experimentos online para evitar o cancelamento no GloboPlayMachine Learning e experimentos online para evitar o cancelamento no GloboPlay
Machine Learning e experimentos online para evitar o cancelamento no GloboPlayTiago Albineli Motta
 
A ciência de dados por traz de sistemas de recomendação
A ciência de dados por traz de sistemas de recomendaçãoA ciência de dados por traz de sistemas de recomendação
A ciência de dados por traz de sistemas de recomendaçãoTiago Albineli Motta
 
Recomendação de ponta a ponta na Globo.com
Recomendação de ponta a ponta na Globo.comRecomendação de ponta a ponta na Globo.com
Recomendação de ponta a ponta na Globo.comTiago Albineli Motta
 
Testes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e PorqueTestes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e PorqueTiago Albineli Motta
 

Más de Tiago Albineli Motta (17)

Multi Armed Bandit
Multi Armed BanditMulti Armed Bandit
Multi Armed Bandit
 
Challenges and research for a real-time recommendation at OLX
Challenges and research for a real-time recommendation at OLXChallenges and research for a real-time recommendation at OLX
Challenges and research for a real-time recommendation at OLX
 
Inteligência Artificial: Da ciência da computação à ciência de dados
Inteligência Artificial: Da ciência da computação à ciência de dadosInteligência Artificial: Da ciência da computação à ciência de dados
Inteligência Artificial: Da ciência da computação à ciência de dados
 
Machine Learning no dia a dia do desenvolvedor (Atualizado)
Machine Learning no dia a dia do desenvolvedor (Atualizado)Machine Learning no dia a dia do desenvolvedor (Atualizado)
Machine Learning no dia a dia do desenvolvedor (Atualizado)
 
Machine Learning no dia a dia do desenvolvedor
Machine Learning no dia a dia do desenvolvedorMachine Learning no dia a dia do desenvolvedor
Machine Learning no dia a dia do desenvolvedor
 
Experimentation anti patterns
Experimentation anti patternsExperimentation anti patterns
Experimentation anti patterns
 
Machine Learning e experimentos online para evitar o cancelamento no GloboPlay
Machine Learning e experimentos online para evitar o cancelamento no GloboPlayMachine Learning e experimentos online para evitar o cancelamento no GloboPlay
Machine Learning e experimentos online para evitar o cancelamento no GloboPlay
 
A ciência de dados por traz de sistemas de recomendação
A ciência de dados por traz de sistemas de recomendaçãoA ciência de dados por traz de sistemas de recomendação
A ciência de dados por traz de sistemas de recomendação
 
xCLiMF
xCLiMFxCLiMF
xCLiMF
 
Rastros digitais
Rastros digitaisRastros digitais
Rastros digitais
 
Big data
Big dataBig data
Big data
 
Recomendação de ponta a ponta na Globo.com
Recomendação de ponta a ponta na Globo.comRecomendação de ponta a ponta na Globo.com
Recomendação de ponta a ponta na Globo.com
 
Recomendação na Globo.com
Recomendação na Globo.comRecomendação na Globo.com
Recomendação na Globo.com
 
Otimizando seu projeto Rails
Otimizando seu projeto RailsOtimizando seu projeto Rails
Otimizando seu projeto Rails
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
Testes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e PorqueTestes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e Porque
 
Dinamizando Sites Estáticos
Dinamizando Sites EstáticosDinamizando Sites Estáticos
Dinamizando Sites Estáticos
 

Escalando sites com Nginx: cache, stale e balanceamento de carga

  • 1. Escalando sites com Nginx Um servidor web com código RUUUUUUSSO    
  • 3. Escalando sites com Nginx ● Sites de conteúdo estático ● Sites de conteúdo dinâmicos ● Sites de conteúdo do usuário    
  • 4. Porque não estático? Top fãs Top músicas Relacionados Gêneros Notícias Playlists Comentários    
  • 5. Conteúdo dinâmico... ● Tempo de resposta alto ● Sobrecarga no servidor ● Requisições enfileiradas ● Queries desnecessárias    
  • 6. Solucionando com Nginx Começando do básico    
  • 7. Cache Server Nginx dinâmico Cache    
  • 8. Confs no nginx proxy_cache_path location ~ ^/ { /opt/projeto/nginx/cache proxy_pass http://localhost:3000; levels=2:2:2 proxy_cache cache_local; keys_zone=cache_local:200m } max_size=2000m inactive=7d; proxy_cache_key "$host$uri"; proxy_cache_valid 301 302 120m; proxy_cache_valid 200 404 20m; proxy_temp_path /tmp/proxy 2 2 2; proxy_read_timeout 5; proxy_connect_timeout 20; proxy_send_timeout 20;    
  • 9. Verificando se funcionou log_format proxy '[$time_local] $uri $status $upstream_cache_status $upstream_status'; access_log /var/log/nginx/proxy.log proxy; > ab -n 3 -c 1 http://localhost/pessoa/1 > tail -f /var/log/nginx/proxy.log [26/Apr/2012:23:03:04 -0300] /pessoas/1 200 MISS 200 [26/Apr/2012:23:03:04 -0300] /pessoas/1 200 MISS 200 [26/Apr/2012:23:03:04 -0300] /pessoas/1 200 MISS 200    
  • 10. Não aceitamos biscoitos location ~ ^/ { proxy_pass http://localhost:3000; proxy_ignore_headers "Expires" "Cache-Control" "Set-Cookie"; proxy_cache cache_local; }    
  • 11. Aí sim!!! > ab -n 3 -c 1 http://localhost/pessoa/1 > tail -f /var/log/nginx/proxy.log [26/Apr/2012:23:09:04 -0300] /pessoas/1 200 MISS 200 [26/Apr/2012:23:09:04 -0300] /pessoas/1 200 HIT - [26/Apr/2012:23:09:04 -0300] /pessoas/1 200 HIT -    
  • 12. Acessos Simultâneos 1. 100 requisições simultâneas na url X 2. Nginx verifica 100 vezes que url X não está no cache 3. Nginx envia 100 vezes requisição da url X para server dinâmico 4. Nginx cacheia 100 vezes url X    
  • 13. O problema na prática > ab -n 10 -c 10 http://localhost/pessoa/4 > tail -f /var/log/nginx/proxy.log [26/Apr/2012:23:17:26 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200 [26/Apr/2012:23:17:44 -0300] /pessoas/4 200 EXPIRED 200    
  • 14. Stale updating Nginx Server Stale dinâmico consulta cache grava cache Cache    
  • 15. Stale para erros e timeouts consulta Nginx Stale XServer dinâmico cache Cache    
  • 16. Confs do stale no nginx proxy_cache_path /opt/projeto/nginx/cache levels=2:2:2 keys_zone=cache_local:200m max_size=2000m inactive=7d; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_read_timeout 5; proxy_connect_timeout 20; proxy_send_timeout 20;    
  • 17. Solucionado > ab -n 10 -c 10 http://localhost/pessoa/4 > tail -f /var/log/nginx/proxy.log [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:27 -0300] /pessoas/4 200 UPDATING - [26/Apr/2012:23:19:30 -0300] /pessoas/4 200 EXPIRED 200    
  • 18. Primeiro request :( Nginx Server Stale dinâmico consulta cache grava cache Cache    
  • 19. Busy Lock proxy_cache_lock on;    
  • 20. Flood de timeouts → Server dinâmico demorando pra responder → Nginx não atualiza cache → Efeito cumulativo    
  • 21. Flood de timeout na prática def show sleep 10 end > ab -n 3 -c 1 http://localhost/pessoa/4 > tail -f /var/log/nginx/proxy.log [26/Apr/2012:23:29:02 -0300] /pessoas/4 200 STALE 200 [26/Apr/2012:23:29:07 -0300] /pessoas/4 200 STALE 200 [26/Apr/2012:23:29:12 -0300] /pessoas/4 200 STALE 200 tail -f log/development.log | grep "pessoas/4" Started GET "/pessoas/4" for 127.0.0.1 at 2012-04-26 23:28:57 -0300 Started GET "/pessoas/4" for 127.0.0.1 at 2012-04-26 23:29:07 -0300 Started GET "/pessoas/4" for 127.0.0.1 at 2012-04-26 23:29:17 -0300    
  • 22. Solução do Colin Saliceti Nginx 1 Nginx 2 Server stale Timeout Stale Timeout dinâmico Baixo Alto Cache Cache    
  • 23. Exemplo server { proxy_cache_path listen 127.0.0.1:80; /opt/projeto/nginx/cache/fe location ~ ^/ { levels=2:2:2 proxy_pass http://localhost:81; keys_zone=frontend:200m # ... max_size=2000m proxy_read_timeout: 5s; inactive=7d; proxy_cache frontend; } proxy_cache_path } /opt/projeto/nginx/cache/be server { levels=2:2:2 listen 127.0.0.1:81; keys_zone=backend:200m location ~ ^/ { max_size=2000m proxy_pass http://localhost:3000; inactive=7d; #… proxy_ignore_client_abort on; #... proxy_read_timeout 30s; proxy_cache backend; proxy_read_timeout 5; }   }  
  • 24. Flood resolvido > ab -n 3 -c 1 http://localhost/pessoa/8 > tail -f /var/log/nginx/proxy.log [27/Apr/2012:01:27:17 -0300] /pessoas/8 200 STALE 200 5.001 [27/Apr/2012:01:27:17 -0300] /pessoas/8 200 UPDATING - - [27/Apr/2012:01:27:17 -0300] /pessoas/8 200 EXPIRED 200 0.001 [27/Apr/2012:01:27:17 -0300] /pessoas/8 200 HIT - - [27/Apr/2012:01:27:22 -0300] /pessoas/8 200 EXPIRED 200 10.010 tail -f log/development.log | grep "pessoas/8" Started GET "/pessoas/8" for 127.0.0.1 at 2012-04-27 01:27:12 -0300    
  • 25. Escalando Nginx 1 Nginx 2 Server stale Stale dinâmico Nginx 1 Nginx 2 Server Balanceador stale Stale dinâmico Nginx 1 Nginx 2 Server stale Stale dinâmico    
  • 26. Conclusão ● Estável ● Performático ● Escalável ● Baixo custo ● Sossego