Turbosys

Internet Funcional

TurboBlog

Cache do Django no Memcached através de Nginx

O Nginx é um servidor http robusto e de alta performance que vem ganhando destaque no mercado recentemente, sendo incluído até em provedores de hospedagem compartilhada como opção para servir arquivos estáticos.

O Django é um framework de desenvolvimento web que provê alta produtividade de desenvolvimento. Ele possui ferramentas para gerenciar dados em cache e um dos backends disponíveis para isso é o Memcached.

O Memcached é um sistema de cache em memória RAM também muito performático.

Costumávamos trabalhar servindo as requisições HTTP através do Nginx, resolvendo arquivos estáticos diretamente através dele e redirecionando requisições à arquivos dinâmicos para o Apache, que por sua vez fazia uso do Django.

O Django poderia fazer cache de conteúdo mas mesmo assim, uma boa quantidade de recursos seria gasta pelo guloso Apache.

Recentemente passamos a trabalhar com uma organização um pouco diferente: temos o Nginx recebendo as requisições e redirecionando-as para o Apache. Este acessa o Django exatamente como antes, porém, o Nginx está preparado para ler o Memcached diretamente, sem passar pelo Apache.

Vamos a um exemplo:

upstream backend {
server 127.0.0.1:8080 weight=1;
}

server {

listen 80;
server_name turbosys.com.br;

location / {

# não faça cache de requisições POST
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if ($request_method = POST) {
proxy_pass http://backend;
break;
}

# a chave do memcached é composta pela url completa
set $memcached_key $host$request_uri;

# o memcached não guarda o tipo do conteúdo
# precisamos definir isso manualmente
default_type "text/html; charset=utf-8";

# esta instrução direciona a requisição para o memcached
memcached_pass 127.0.0.1:11211;

# se a chave não foi encontrada, direciona para o fallback
# neste caso, o apache + django
error_page 501 502 404 405 = @fallback;

}

location @fallback {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

Aplicamos essa configuração no sistema de gestão de conteúdo Site na Hora, o que nos garantiu um aumento de performance considerável.

Como as páginas de sites neste sistema não tem variação para usuários logados, o procedimento foi mais simples. Existe como fazer distinção entre versões de páginas (para usuários autenticados e não autenticados por exemplo), porém, isso é assunto para um outro post ;)

Comentários

Nenhum comentário cadastrado, seja o primeiro a comentar!
Nome
Email
*Conteúdo
*Palavra-desafiocaptcha

Preencha com a palavra escrita na imagem

Serviços

Portfólio

Veja Mais

Blog

Recentemente lançamos o blog Deville StarClub e nele tivemos uma demanda interessante: desejava-se diminuir a necessidade de equipe de design e para isso fez-se necessária uma ferramenta que permitisse ao ...

O Nginx é um servidor http robusto e de alta performance que vem ganhando destaque no mercado recentemente, sendo incluído até em provedores de hospedagem compartilhada como opção para servir ...

Confira o estudo de caso da contribuição da Turbosys no desenvolvimento do software python-cloudfiles para comunicação com os servidores em nuvem da Rackspace

Leia Mais

Clientes

  • Logotipo de Área Comunicação
  • Logotipo de Asfalto
  • Logotipo de Clube de Criação do Paraná
  • Logotipo de Contenido
  • Logotipo de Digital Group
  • Logotipo de Digital Square
Veja Mais