Qual é a melhor maneira de executar sites Drupal e Django atrás do mesmo servidor Varnish?

2

Eu tenho um site de alto tráfego rodando com Drupal e Apache, cinco servidores web por trás de um balanceamento de carga do servidor Varnish. Digamos que este site seja example.com. Estou usando cinco backends e um diretor como este no meu default.vcl:

director balancer round-robin {
  {
   .backend = web1;
  }
  {
  .backend = web2;
  }
  {
  .backend = web3;
  }
  {
  .backend = web4;
  }
  {
  .backend = web5;
  }
}

Agora estou trabalhando em um novo projeto do Django que será uma nova seção deste site em execução em example.com/new-section.

Depois de verificar a documentação , descobri que posso fazer algo assim:

sub vcl_recv {
     if (req.url ~ "^/new-section/") {
         set req.backend = newbackend;
     } else {
         set req.backend = default;
     }
}

Ou seja, usando um back-end diferente para um subdiretório / nova seção no mesmo domínio.

A minha pergunta é: como faço algo como isso funcionar com meu diretor e configuração de balanceamento de carga?

Provavelmente vou rodar dois ou mais servidores web (backends) com meu novo projeto Django, cada um com uma mistura de Gunicorn, Nginx e alguns pacotes Python, e gostaria de colocar todos eles em seus pacotes. próprio diretor de verniz para balancear a carga.

É possível usar a abordagem acima para decidir qual diretor usar ?, assim:

sub vcl_recv {
     if (req.url ~ "^/new-section/") {
         set req.director = newdirector;
     } else {
         set req.director = balancer;
     }
}

Todas as sugestões são bem-vindas.

Obrigado!

    
por Alexis Bellido 05.09.2012 / 23:03

1 resposta

1

Eu li a documentação do Varnish mais algumas vezes e comecei a brincar com a minha configuração local e consegui isso funcionar. O verniz, pelo menos a versão 2.1, que é o que eu usei para meus testes, considera um diretor como um backend, então você pode verificar o set request.backend e isso irá definir o diretor correto para usar. Então eu fiz isso:

if (req.url ~ "^/new-section") {
   set req.backend = django_balancer;
} else {
   set req.backend = balancer;
}

Onde django_balancer é um novo diretor criado de maneira semelhante ao meu balancer original (veja detalhes na pergunta). Obviamente, este novo diretor tem que apontar para a configuração dos servidores web para servir o projeto Django.

Agora o Varnish servirá tudo usando o diretor dos servidores do Drupal, exceto os URLs que começam com / new-section, que serão servidos pelo diretor para os servidores do Django.

Existe alguma configuração extra no default.vcl para o Drupal e o Django para tratar corretamente os cookies com o Varnish, mas isso é outro problema e já existem alguns recursos online com detalhes sobre como lidar com isso.

E, a propósito, eu recebi a dica da página wiki do Varnish sobre balanceamento de carga . a parte principal:

 You can send traffic to your brand new director in vcl_recv, like this:

 sub vcl_recv {
    if (req.http.host ~ "^(www.)?mysite.com$") {
      set req.backend = baz;
    }
 }

Eu acho que o uso de req.backend é confuso, deve haver algo como req.director para torná-lo mais claro.

    
por 13.09.2012 / 22:40