Como implantar um aplicativo Django:

Que tal saudações a todos, este é meu primeiro artigo em <» DesdeLinux (de varios que tengo en mis borradores xD), espero les sea de utilidad 😀

Bem, no meu novo e atual trabalho, no momento está sendo realizada a migração de vários sistemas para Django (que estranho eh ?? xD) e uma das minhas tarefas, além do desenvolvimento, é colocá-los em produção, então como bom aprendiz, pois foi a primeira vez que coloquei uma aplicação em produção em um servidor real: $ comecei a ler o doc oficial de cada um dos pacotes requeridos da pilha (Gunicorn e Supervisord principalmente), e vendo que os tutoriais Em espanhol eles não foram muito claros para mim em alguns aspectos, resolvi criar um mini guia com os passos que segui para colocar o aplicativo em produção, baseado nas pilhas Django, Gunicorn, Supervisord, Nginx e Postgresql.

No caso em que trabalho, os servidores ainda estão executando o Debian Squeeze, mas o guia deve ser totalmente válido para outras distribuições ... então vamos direto ao ponto e começar:

Vou trabalhar como um superusuário. Em primeiro lugar, os seguintes pacotes são necessários:

PIP -> Ferramenta para instalar e gerenciar pacotes para Python
aptitude install python-pip

nginx -> Servidor Web (vamos usá-lo como proxy reverso e para armazenar em cache os arquivos estáticos 'img, js, css'). Instalamos com:
aptitude install nginx

Supervisor -> Aplicativo para gerenciar e monitorar nosso aplicativo, embora seja usado para muito mais. Nós o instalamos com:
aptitude install supervisor

ambiente virtual -> Ajuda-nos a criar um ambiente de execução virtual personalizado para a nossa aplicação. Nós o instalamos com:
aptitude install python-virtualenv

gunicórnio -> servidor web para python (não vamos instalar ainda)

Presumo que eles já devam ter o postgresql instalado e configurado

psicopg2 -> Conector Postgresql para python (não vamos instalá-lo ainda)

Crie um ambiente virtual com virtualenv:

Primeiro, vamos mover para o diretório de trabalho que usaremos para colocar em produção:
cd /var/www/

Então, neste diretório, vamos criar o ambiente virtual:
virtualenv ENV-nombreApp

Vamos para o diretório que acabei de criar virtualenv
cd ENV-nombreAPP

Copiamos o aplicativo neste diretório e agora passamos a ativar o ambiente com:
source bin/activate

O prompt agora deve ser semelhante a (ENV)usuario@host:

Isso fará com que tudo o que fazemos seja armazenado no diretório / var / www / ENV-appname / sem afetar os pacotes do sistema

Agora vamos para o diretório do aplicativo:
cd nombreApp

Prosseguimos com a instalação da lista de dependências do aplicativo (se necessário), em que são especificadas no arquivo requisitos.txt:
pip install -r requirements.txt

Também podemos instalar pacotes individualmente, por exemplo, para instalar o conector de postgresql:
pip install psycopg2

Instalação e configuração do GUnicorn:

Para instalar, fazemos da mesma maneira:
pip install gunicorn

Agora vamos configurá-lo, para isso vamos criar um arquivo chamado gunicorn-deploy.py na raiz do nosso aplicativo (embora o nome possa ser qualquer um) com o seguinte conteúdo:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Configuração do supervisord:

Agora vamos definir o Supervisor, para isso geramos o arquivo de configuração com

echo_supervisord_conf > /etc/supervisord.conf

Agora vamos editar o arquivo de configuração:
vim /etc/supervisord.conf

E removemos o comentário das linhas a seguir, removendo o; (ponto e vírgula):

[unix_http_server] file = / tmp / supervisor.sock [supervisord] logfile = / var / log / supervisord.log logfile_maxbytes = 50 MB logfile_backups = 10 loglevel = debug pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [programa: appname] comando = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -Appname / appname / gunicorn-deploy.py directory = / var / www / ENV-appname / appname / autostart = true autorestart = true user = Nome de usuário redirect_stderr = true stdout_logfile = / var / www / logs / appname / supervisord.log

Agora vamos criar o script para supervisord para iniciar o sistema, para isso vamos criar o arquivo:
vim /etc/init.d/supervisord

E adicionamos o seguinte conteúdo:

 # Supervisord auto-start # # description: Auto-start supervisord # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 no início) echo -n "Iniciando supervisord:" $ SUPERVISORD echo ;; stop) echo -n "Parando supervisord:" $ SUPERVISORCTL shutdown echo ;; reiniciar) echo -n "Parando supervisord:" $ SUPERVISORCTL shutdown echo echo -n "Iniciando supervisord:" $ SUPERVISORD echo ;; aquele C

E agora damos permissões de execução ao arquivo para que ele possa iniciar com o sistema:
sudo chmod +x /etc/init.d/supervisord

Atualizamos os links para iniciar o serviço:
sudo update-rc.d supervisord defaults

Começamos o serviço:
sudo /etc/init.d/supervisord start

Configurando o nginx:

Esta etapa também é bastante simples, iremos criar o seguinte arquivo de configuração de nginx para nosso aplicativo:

vim /etc/nginx/sites-enabled/nombreApp

E vamos adicionar o seguinte conteúdo para você

servidor {escuta 9001; # porta onde desejam que nginx server_name escute www.domain.com; # ou 192.168.0.100, endereço que iremos acessar access_log /var/log/nginx/Appname.access.log; # onde teremos o local do log do aplicativo / {# onde nginx chamará ao acessar www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } location / static / {# onde nginx acessará quando entrarmos em www.domain.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

E nós reiniciamos o nginx:
service nginx restart

Configurando o Django:

Vamos modificar o arquivo de configuração django:
vim nombreApp/settings.py

Procuramos a linha que diz DEBUG = Verdadeiro e mudamos o valor, remanescente DEBUG=Falso

Adicionamos os parâmetros do banco de dados:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # ou mysql, ou o que quer que eles estejam usando 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' : 'password DB', 'HOST': 'localhost', # ou o que eles precisam 'PORT': '', # ou o que eles estão usando}}

Nós procuramos a linha ALLOWED_HOSTS = [] e adicionamos o domínio ou endereço pelo qual acessaremos, deixando algo como ALLOWED_HOSTS = ['www.domain.com']

Configuramos o diretório para os arquivos estáticos, procuramos a linha que diz STATIC_ROOT = ' ' e mudamos o valor, colocando o caminho absoluto onde queremos que nossos arquivos estáticos estejam, no meu caso deixei mais ou menos assim STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Quase terminado, executamos o seguinte comando:
./manage.py collectstatic

Isso criará uma pasta com o nome 'estática no caminho que especificamos no configurações.py ', é onde todos os nossos arquivos estáticos estarão.

E, finalmente, reiniciamos o supervisor para fazer as novas alterações:
supervisorctl restart nombreApp

E isso seria tudo, no final não era tanto verdade? parecia simples para mim 😀

Espero que seja útil para você, saudações 😉

Documentação GUnicorn

Documentação do supervisor


9 comentários, deixe o seu

Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   f3niX dito

    Eu entendo que o aplicativo Django não deve ser colocado na raiz da pasta do servidor web (/ var / www). Por segurança, não sei se estou errado.

    Saudações.

    1.    urKh dito

      Toda a razão!!! Era algo que eu desconhecia totalmente, vou atualizar o verbete 😛 e assim que voltar na segunda-feira farei alterações no aplicativo xD
      obrigado

  2.   Rodrigo Bravo (goidor) dito

    Epale brother bom tutorial. Recentemente também estive no mesmo mas no Debian 7, tive que pesquisar e ler mais ou menos. Recomendo que você crie o ambiente virtual do virtualenv na casa do usuário em uma pasta oculta.

    Saudações!

  3.   servir fenriz dito

    hahaha ctm Eu ontem documentando Django e vocês já estão passando pela galáxia 999999 Saudações men xD

  4.   daniel2ac dito

    Artigo muito bom =) há apenas uma semana eu implantei meu aplicativo django, mas fiz isso com uwsgi e nginx, você sabe qual a vantagem do gunicorn? Eu já vi isso ser muito mencionado.
    É bom ver que django está se tornando muito popular, a verdade é o melhor framework que já vi =)

  5.   ozkar dito

    Para o STATIC_ROOT o que eu faço é definir uma variável global. Algo como isto:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    Onde back-end é um aplicativo que criei. Desta forma, certifico-me de que onde implanto o projeto, o caminho global é o mesmo.

  6.   inteligente dito

    Interessante, vou tentar no futuro.

    A propósito, alguém sabe como habilitar acentos e caracteres não ASCII em um aplicativo django?

    Já procurei em todos os lugares, nenhum dos métodos a seguir funciona para mim:
    sys.setdefaultencoding ('utf-8') # em sites.py

    # - * - coding: utf-8 - * - # em cada arquivo Python

    A edição de site.py e a colocação de utf-8 em vez de ascii devem funcionar, mas $ file models.py me informa que meu arquivo ainda é ascii.

    Alguma sugestão?

    1.    inteligente dito

      Funcionou!!!!

  7.   anime230 dito

    muito bom tutorial, mas você poderia fazer um de como fazer o upload do meu aplicativo em um servidor web já em produção
    obrigado