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




                      

Escalando Sites com Nginx

  • 1.
    Escalando sites comNginx Um servidor web com código RUUUUUUSSO    
  • 2.
  • 3.
    Escalando sites comNginx ● 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_formatproxy '[$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. 100requisiçõ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 naprá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 errose timeouts consulta Nginx Stale XServer dinâmico cache Cache    
  • 16.
    Confs do staleno 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 -n10 -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 timeoutna 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 ColinSaliceti 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    
  • 27.