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