Django com Nginx e Gunicorn no Centos

Nesse post vou mostrar como efetuar o deploy de uma aplicação Django com Nginx e Gunicorn (Green Unicorn) no centos 6.
Gunicorn é um servidor wsgi nativo ou seja não é necessário nenhum módulo wsgi para seu pleno funcionamento. Por isso iremos utiliza-lo para servir todo conteúdo dinâmico que será passado através da função de proxy reverso do nginx que por sua vez cuidará do conteúdo estático.

Primeiramente habilite o repositório EPEL para obter alguns pacotes necessários principalmente o nginx.

Execute como root

Centos 32 bits:

 rpm -ivh http://mirror.optus.net/epel/6/i386/epel-release-6-7.noarch.rpm

Centos 64 bits:
 
rpm -ivh http://mirror.optus.net/epel/6/x86_64/epel-release-6-7.noarch.rpm 

Instale os pacotes necessários
 
yum install nginx python-devel python-virtualenv python-pip supervisor

No caso eu utilizo o virtualenv para efetuar o deploy da minha aplicação, por isso deixo para instalar os módulos necessários como acesso ao banco de dados quando o ambiente virtual estiver criado. Caso efetue o deploy sem utilizar o virtualenv o qual eu não recomendo, instale os módulos que necessite junto com os pacotes mencionados acima, como MySQL-python para MySQL ou PyGreSQL para Postgre.

Agora crie o ambiente virtual para sua aplicação no diretório em que desejar ex /var/www ou /home/usuario
 
virtualenv projeto

Acesse o diretório e criado para seu projeto e altere o PATH do sistema
 
source bin/activate

Instale o Django, Gunicorn e os demais módulos que seu projeto necessite, como exemplo vou instalar o módulo para conexão com banco de dados MySQL.

 
pip install Django

pip install gunicorn

pip install MySQL-python

Após a instalação de todos os componentes seu diretório (criado pelo virtualenv) está pronto para alojar seu projeto ou dar início a um novo basta depositar seu aplicativo criado localmente ou iniciar um novo projeto.


Vamos realizar um pequeno teste criando uma aplicação e verificar se está tudo funcionando. Dentro do diretório criado através do virtualenv inicie um projeto. Calma que a configuração do nginx ficará para o final.

djago-admin.py startproject ola_mundo

cd ola_mundo

Agora nós iniciamos nosso projeto através do gunicorn
 
gunicorn_django -b ip_do_seu_servidor:8000

Se tudo estiver funcionando você deverá visualizar tela padrão do django


Veja que nós utilizamos o gunicorn passando um ip e uma porta, o nginx irá utilizar o proxy reverso passando as informações para esse endereço ip e porta.
Obviamente que não vamos deixar nossa aplicação em produção dessa forma apenas iniciando o servidor wsgi (gunicorn) através desse comando e deixar o mesmo sem nenhum tipo de monitoração. Por isso iremos utilizar o supervisor um serviço que permite que o usuário gerencie e monitore processos em sistemas unix-like ou seja podemos iniciar nossa aplicação através do gunicorn de modo que o supervisor monitore o processo gerando logs, iniciando automáticamente nossa aplicação e reiniciando-a caso a mesma pare por algum motivo.

Conforme você deve ter reparado o supervisor já está instalado no sistema, isso é se você seguiu o tutorial certinho até aqui. Para configurar sua aplicação no supervisor é muito simples, basta registra-la no arquivo /etc/supervisord.conf.

Primeiramente habilite o gunicorn no django registrando-o no arquivo settings.py de sua aplicação, coloque a string 'gunicorn' em INSTALLED_APPS.

Agora veja o exemplo de configuração de uma aplicação no supervisor:

vim /etc/supervisord.conf

[program:nome_do_projeto]
command=/caminho/para/seu/projeto/bin/python /caminho/para/seu/projeto/manage.py run_gunicorn -b ip_do_servidor:8000
directory=/caminho/para/seu/projeto
user=usuario
autostart=True
autorestart=True
log_stderr=True
logfile=/var/log/supervisor/seu_projeto.log

Lembrando que a porta 8000 passado para o gunicorn é uma opção minha, você pode utilizar a porta que desejar. Vale lembrar também que essa porta será passada na configuração do nginx, sendo assim como você pode ter deduzido você pode executar uma aplicação na porta 8000 e outra na porta 8001, ambas em seu determinado ambiente criado através do virtualenv sem que nenhuma aplicação interfira na outra.

Após a configuração do supervisor você pode iniciar o serviço
 
# service supervisord start

Se tudo correu bem sua aplicação já está sendo executado através do gunicorn, e você poderá gerenciar o processo da mesma através do supervisorctl, um shell interativo onde você pode reinciar, parar e monitorar os processos de sua aplicação.

Agora vamos configurar o nginx, edite o arquivo /etc/nginx/nginx.conf
 
# vim /etc/nginx/nginx.conf

E dentro da seção http { adicione o seguinte conteúdo

server {
        listen 80;
        server_name seudominio.com.br;
        root /caminho/para/seu/projeto/;

        location /static/ {
        root /caminho/para/seu/projeto/local_arquivos_estaticos/;

        location /static/admin {
        root /caminho/para/seu/projeto/lib/python2.6/site-packages/django/contrib/admin/;
        }

        location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://ip_do_seu_servidor:8000;
    }
}

A configuração do nginx é basicamente essa, nós definimos que o proxy reverso deve ser direcionado para o ip e porta em que nossa aplicação django está sendo executada através do gunicorn. 
É importante ressaltar que na parte onde informamos o local dos arquivos estáticos de nossa aplicação para o nginx, vai depender da configuração do settings.py de seu aplicação especificamente da variável STATIC_ROOT  que por padrão vem definida como /static/ no django 1.4 e utilizar o comando collectstatic para obter os arquivos estáticos da página de administração por exemplo.

Para finalizar inicie o nginx
 
# service nginx start

Agora basta acessar o domínio ou o ip do seu servidor e aproveitar sua aplicação em produção.

2 Comentário(s) em “Django com Nginx e Gunicorn no Centos”

  1.  Boa noite Gilson,

    A configuração dos serviços serão iguais pelo menos em relação ao ubuntu, eu nunca testei no windows, mas a configuração deve ser padrão também.
    Vale lembrar que o arquivo de configuração no ubuntu pode estar em um diretório diferente do aqui mostrado.

    Qualquer dúvida sinta-se a vontade para perguntar ;)!

    [Responder comentário]

Deixe um comentário