Pular para o conteúdo
Ramos da Informática - Comunidade de Desenvolvedores

Torne-se um desenvolvedor FullStack: Pacote completo de formação desenvolvedor Frontend e Backend utilizando as linguagens de programação e frameworks mais procurados no mercado de trabalho. Mais informações, aqui. Faça o download do E-BookGuia Completo Para Se Tornar um(a) Desenvolvedor(a) Full-Stack, Começando do ZERO”.

Engenheiro de Software, autor de livros sobe tecnologia e negócios. É mantenedor do site Ramos da Informática. Hobbies: investir em ações, natação e finanças.

Engenheiro de Software, autor de livros sobe tecnologia e negócios. É mantenedor do site Ramos da Informática. Hobbies: investir em ações, natação e finanças.

admin

Todos os artigos deste autor

Configurando um servidor de produção para aplicações Python

Chatbots com Whatsapp e Cielo integrados Nesse curso, eu vou te mostrar como o consumidor poder realizar um pagamento por dentro do aplicativo do WhatsApp, aonde o seu cliente vai entrar numa conversa como entraria numa conversa com qualquer pessoa ou com a sua empresa, navegar entre os produtos/serviços em menus simples enviados pelo chatbot, adicionar esses produtos/serviços no carrinho de compras, e num determinado ponto do chat, um link exclusivo é enviado para o cliente preencher os dados do cartão de crédito. No final, a análise é devolvida para o Whatsapp no qual a conversa foi iniciada. Inscreva-se.

Sempre tive muita dificuldade de configurar um servidor para rodar meus projetos Python e Django, nunca me dei bem com o Apache. Foi buscando outras maneiras de servir minhas aplicações Python Web que encontrei o Nginx e o Gunicorn, então resolvi compartilhar minha experiência com essas ferramentas, e como organizo um ambiente com vários projetos Python WSGI.

Preparando nosso ambiente

Abaixo algumas das ferramentas que serão utilizadas para preparar o nosso ambiente de Produção.

Servidor Python WSGI (Gunicorn)
Proxy (Nginx)
Controlador/Monitor de processos (Supervisor)
Ambientes Python isolados (Virtualenwrapper)

Instalando o gerenciador de pacotes, o proxy e o controlador de processos.

sudo apt-get install python-pip nginx supervisor

Utilidades

Pip: Gerenciador de pacotes Python.
Nginx: Usado como proxy e como server de arquivos estáticos.
Supervisor: Gerenciar o processo de start/stop da nossa aplicação.

Organizando meu ambiente com Virtualenvwrapper.

Instalando o Virtualenvwrapper para ter ambientes isolados, prossibilitando diferentes projetos Python, no mesmo servidor.

pip install virtualenvwrapper

Nosso filesystem será organizado da seguinte forma:

# — /home/myusr
# — /www [Projetos]
# — /env [Ambientes]
mkdir ~/www ~/env

Como funciona?

O Virtualenvwrapper irá criar os projetos dentro do ~/www e os ambientes dentro do ~/env, basta configurar algumas variáveis no seu ~/.bashrc.

# ~/.bashrc

export PROJECT_HOME=~/www
export WORKON_HOME=~/env
source /usr/local/bin/virtualenvwrapper.sh

Atualize o seu ~/.bashrc e crie um projeto.

mkproject myproject

Configurando Nginx e Supervisor da maneira simples.

O que fazer agora?

Vamos configurar o Nginx e o Supervisor para ele trabalhar na nossa estrutura de arquivos.

Edite o arquivo /etc/nginx/nginx.conf,

##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;# encontra a configuracao dos seus projetos
include /home/myusr/www/*/nginx.conf;

e edite o /etc/supervisor/supervisord.conf,

[include]
;files = /etc/supervisor/conf.d/*.conf# encontra a configuracao dos seus projetos
files = /home/myusr/www/*/supervisor.conf

Agora eles estão prontos para buscar as configurações dentro da nossa pasta de projetos, cada projeto vai ter uma configuração unica, e quando quiser removê-lo vai fazer isso de forma simples, excluindo a pasta do projeto.

Fazendo as coisas funcionarem

Agora que temos todos as ferramentas necessárias instaladas e nosso ambiente configurado e bem organizado, vamos colocar para funcionar o nosso projeto.

Configurando meu ambiente WSGI com Gunicorn.

Vamos ativar nosso ambiente virtual e instalar o Gunicorn

workon myproject
pip install gunicorn

Qual próximo passo então?

Vamos criar nossos arquivos de configuração, e logs do nosso projeto.

cd ~/www/myproject
mkdir static media logs project
touch nginx.conf supervisor.conf start.sh
touch logs/access.log logs/error.log logs/gunicorn.log logs/supervisor.log

No momento nosso filesystem se parece com esse:

— home/myusr/
— www/ [Projetos]
— myproject/
— nginx.conf [Config do Nginx]
— supervisor.conf [Config do Supervisor]
— start.sh [Script Gunicorn]
— project/ [Fonte do nosso projeto]
— logs/ [Logs]
— access.log [Log de acesso Nginx]
— error.log [Log de erro Nginx]
— gunicorn.log
— supervisor.log
— env/ [Ambientes]

Como configurar meu projeto?

Vamos começar pelo start.sh, ele vai ser responsável por iniciar a sua aplicação WSGI usando o servidor Gunicorn.

#!/bin/bash
# Diretorio e arquivo de log
set -e
LOGFILE=/home/myusr/www/myproject/logs/gunicorn.log
LOGDIR=$(dirname $LOGFILE)
# Numero de processo simultaneo, modifique de acordo com seu processador
NUM_WORKERS=3
# Usuario/Grupo que vai rodar o gunicorn
USER=myusr
#GROUP=root
# Endereço local que o gunicorn irá rodar
ADDRESS=127.0.0.1:8000
# Ativando ambiente virtual e executando o gunicorn para este projeto
source /home/myusr/envs/myproject/bin/activate
cd /home/myusr/www/myproject/project/
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn -w $NUM_WORKERS –bind=$ADDRESS –user=$USER –log-level=debug –log-file=$LOGFILE 2>>$LOGFILE myproject.wsgi:application

Na linha 6, ADDRESS, diz que o nosso projeto vai rodar localhost com a porta 8000, esse mesmo ip:porta será usado na configuração do nginx.conf, as linhas abaixo fazem o processo de ativar o ambiente virtual e navegar para pasta do fonte do projeto, para que o Gunicorn possa encontrar o arquivo wsgi.py, esse é o arquivo que configura o ambiente de produção no Django.

Agora vamos configurar o nginx.conf, para que ele possa escutar o nosso dominio na porta 80 e redirecionar a requisição para a nossa aplicação no 127.0.0.1:8000.

upstream myproject.com.br {
server 127.0.0.1:8000;
}server {
listen 80;
server_name myproject.com.br;
client_max_body_size 50M;

access_log /home/myusr/www/myproject/logs/access.log;
error_log /home/myusr/www/myproject/logs/error.log;

location /static/ {
alias /home/myusr/www/myproject/static/;
}
location /media/ {
alias /home/myusr/www/myproject/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

if (!-f $request_filename) {
proxy_pass http://myproject.com.br;
break;
}
}
}

Criamos um upstream que representa a nossa aplicação, e configuramos o server para escutar nosso dominio na porta 80 e redirecionar tudo com location / para nosso upstream, no location /static/ e localtion /media/ criamos um alias para nossa pasta de arquivos, assim o Nginx passa a servir os arquivos estáticos e de midia.

Falta pouco!

Precisamos só de configurar o Supervisor para iniciar nosso projeto automaticamente, veja o supervisor.conf de exemplo.

[program:myproject]
command=/home/myusr/www/myproject/start.sh
user=myusr
stdout_logfile=/home/myusr/www/myproject/logs/supervisor.log
redirect_stderr=true
autostart=true
autorestart=true

Ufa!, é um arquivo bem simples só precisamos informar o que queremos executar e com qual usuário ele fará isso, agora vamos iniciar nosso projeto.

sudo service nginx restart
sudo /etc/init.d/supervisor start myproject

Pronto!

Pronto agora você tem um ambiente bem estruturado rodando sua aplicação, um detalhe é que eu me limitei a instalar o Gunicorn dentro do ambiente virtual, caso um dia queira um outro web server que não seja o WSGI com outros projetos, é só instalar outro server no ambiente virtual do projeto, criar um script para iniciar o projeto, e voilá!

Este artigo foi importado automaticamente por fazer parte do Planetário Dev. Quer fazer parte deste HUB de conteúdos? Faça parte do Planetário e veja as vantagens.

Não tem site ou blog? Seja um autor do site e ainda pode ser remunerado.

Leia também:

Facebook
LinkedIn
Twitter
Pinterest
Reddit
Telegram
WhatsApp
Email
Print

Relacionados

Deixe uma resposta