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.
Bom Dia,
[Responder comentário]Amigo e para o ubuntu e windows seria muito diferente?
Obrigado
Boa noite Gilson,
[Responder comentário]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 ;)!