Como Fazer o Deploy de um Projeto Django com Gunicorn e Nginx: Guia Completo para Produção
Colocar uma aplicação web em produção é um dos marcos mais importantes para qualquer desenvolvedor Python. Embora o comando python manage.py runserver seja excelente para o desenvolvimento local, ele não foi projetado para lidar com múltiplos acessos simultâneos, segurança robusta ou alta disponibilidade. Para um ambiente de produção real, você precisa de uma infraestrutura sólida.
Neste guia, vamos explorar o padrão da indústria para hospedar aplicações Django: a combinação de Django, Gunicorn (um servidor WSGI), e Nginx (um servidor web de alta performance que atua como Proxy Reverso). Vamos aprender desde a preparação do servidor até a configuração final do sistema.
Introdução: Por que usar Gunicorn e Nginx?
Para entender o deploy, primeiro precisamos entender as peças do quebra-cabeça:
- Django: É o seu framework web. Ele processa a lógica de negócio, as rotas e as interações com o banco de dados.
- Gunicorn (Green Unicorn): É um servidor WSGI (Web Server Gateway Interface). O Django não consegue “falar” diretamente com a internet de forma eficiente. O Gunicorn serve como um intermediário que recebe as requisições do Nginx, processa-as através do Django e devolve a resposta. Ele é capaz de gerenciar múltiplos processos (workers) para lidar com vários usuários ao mesmo tempo.
- Nginx: É o nosso “porteiro”. Ele fica na frente de tudo. O Nginx lida com a segurança (SSL/HTTPS), serve arquivos estáticos (CSS, JS, Imagens) de forma extremamente rápida e redireciona as requisições dinâmicas para o Gunicorn.
Essa arquitetura garante que sua aplicação seja escalável, segura e capaz de suportar tráfego real.
Pré-requisitos
Antes de começar, certifique-se de que você possui os seguintes itens:
- Um servidor VPS (como DigitalOcean, AWS EC2, Linode ou Google Cloud) com Ubuntu 20.04 ou 22.04 instalado.
- Acesso via SSH ao servidor.
- Um projeto Django funcional (com banco de dados migrado e
requirements.txtatualizado). - Domínio apontando para o IP do seu servidor (opcional, mas recomendado).
- Conhecimento básico de comandos Linux (Terminal).
Passo a Passo para o Deploy
1. Atualizando o Sistema e Instalando Dependências
Acesse seu servidor via SSH e comece atualizando os pacotes do sistema. Em seguida, instale o Python, o gerenciador de pacotes Pip, o ambiente virtual e o Nginx.
sudo apt update
sudo apt upgrade -y
sudo apt install python3-pip python3-venv nginx curl git -y
2. Clonando o Projeto e Configurando o Ambiente Virtual
Navegue até o diretório onde deseja hospedar seu projeto (geralmente /var/www/ ou na sua pasta de usuário). Vamos clonar o repositório e criar um ambiente virtual para isolar as dependências do projeto.
cd /var/www
sudo git clone https://github.com/seu-usuario/seu-projeto.git
cd seu-projeto
Criar o ambiente virtual
python3 -m venv venv
Ativar o ambiente virtual
source venv/bin/activate
Instalar as dependências
pip install -r requirements.txt
pip install gunicorn whitenoise
Nota: O whitenoise é uma biblioteca essencial para servir arquivos estáticos em ambientes de produção quando você não usa o servidor de arquivos do Nginx diretamente.
3. Configurando Variáveis de Ambiente
Nunca coloque suas chaves secretas ou senhas do banco de dados diretamente no arquivo settings.py. Utilize variáveis de ambiente. Uma forma comum é usar um arquivo .env ou configurar diretamente no sistema.
Certifique-se de que o ALLOWED_HOSTS contenha o IP do seu servidor ou o seu domínio:
# settings.py
ALLOWED_HOSTS = ['seu_ip_ou_dominio.com', 'localhost']
DEBUG = False
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
4. Preparando o Banco de Dados e Arquivos Estáticos
Execute as migrações do banco de dados e colete os arquivos estáticos (CSS, JS, imagens).
python manage.py migrate
python manage.py collectstatic --noinput
5. Configurando o Gunicorn
Agora vamos testar se o Gunicorn consegue iniciar o projeto. Substitua meu_projeto.wsgi pelo nome do seu diretório de projeto onde reside o arquivo wsgi.py.
gunicorn --workers 3 --bind 0.0.0.0:8000 meu_projeto.wsgi
Se a aplicação rodar e você conseguir acessá-la pelo IP do servidor na porta 8000, o Gunicorn está configurado corretamente. Agora, precisamos torná-lo um serviço do sistema para que ele inicie automaticamente com o servidor.
Criando o arquivo de serviço do Systemd
Crie um arquivo de configuração para o Gunicorn:
sudo nano /etc/systemd/system/gunicorn.service
Cole o seguinte conteúdo (ajustando os caminhos para o seu usuário e projeto):
[Unit]
Description=gunicorn daemon
After=network.target
[Service] User=seu_usuario Group=www-data WorkingDirectory=/var/www/seu-projeto ExecStart=/var/www/seu-projeto/venv/bin/gunicorn --workers 3 --bind unix:/run/gunicorn.sock meu_projeto.wsgi Restart=always
[Install] WantedBy=multi-user.target
Dica: Usar um arquivo .sock em vez de uma porta IP é mais performático para a comunicação interna entre Nginx e Gunicorn.
Iniciando o Serviço
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
6. Configurando o Nginx como Proxy Reverso
O Nginx receberá as requisições da porta 80 (HTTP) e as encaminhará para o socket do Gunicorn.
Crie um arquivo de configuração para o seu site:
sudo nano /etc/nginx/sites-available/seu_projeto
Adicione a seguinte configuração:
server {
listen 80;
server_name seu_dominio.com;
location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; }
location /static/ { align 4 4; prod_args: off; root /var/www/seu-projeto; }
location /media/ { allow all; root /var/www/seu-projeto; } }
Nota: Certifique-se de que o Nginx tenha permissão de leitura na pasta do seu projeto.
Ative a configuração e reinicie o Nginx:
sudo ln -s /etc/nginx/sites-available/seu_projeto /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
Dicas de Especialista para Produção
Para garantir que seu deploy seja profissional e resiliente, siga estas recomendações:
- Segurança com SSL: Utilize o Certbot da Let’s Encrypt para obter certificados SSL gratuitos. Isso é indispensável para qualquer site moderno.
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx
- Monitoramento de Logs: Sempre verifique os logs para identificar erros silenciosos.
– Logs do Gunicorn: sudo journalctl -u gunicorn
– Logs do Nginx: sudo tail -f /var/log/nginx/error.log
- Gerenciamento de Workers: A regra geral para o número de workers do Gunicorn é
(2 x número de núcleos de CPU) + 1. - Backup de Banco de Dados: Configure um cron job para realizar dumps diários do seu banco de dados e salvá-los em um local seguro fora do servidor.
- Firewall: Use o
ufwpara fechar todas as portas, exceto a 80 (HTTP), 443 (HTTPS) e a porta SSH (geralmente 22).
FAQ (Perguntas Frequentes)
1. Por que meu site está dando erro 502 Bad Gateway? Isso geralmente acontece quando o Nginx não consegue se comunicar com o Gunicorn. Verifique se o arquivo .sock foi criado e se as permissões de pasta estão corretas para o usuário www-data.
2. Como atualizar meu código após o deploy? Após fazer o git pull no servidor, você deve atualizar o ambiente virtual (se houver novos pacotes), rodar o migrate, o collectstatic e reiniciar os serviços: sudo systemctl restart gunicorn
3. O Nginx serve arquivos estáticos mesmo com o Gunicorn rodando? Sim, mas a configuração do Nginx deve priorizar a pasta de estáticos. O Gunicorn não deve processar arquivos estáticos em produção, pois ele é lento para essa tarefa.
4. Como lidar com uploads de usuários (Media Files)? Arquivos de mídia não devem ser salvos na pasta do projeto, pois eles serão apagados em alguns tipos de deploy. Use um serviço como Amazon S3 ou uma pasta separada no servidor com permissões de escrita.
Conclusão
Fazer o deploy de uma aplicação Django usando Gunicorn e Nginx é a base para qualquer projeto web profissional. Embora a configuração inicial possa parecer complexa devido aos múltiplos serviços envolvidos, essa estrutura oferece a estabilidade necessária para que sua aplicação suporte centenas (ou milhares) de usuários simultâneos sem falhas.
Ao seguir este guia, você construiu uma arquitetura onde o Nginx protege e entrega conteúdo rápido, o Gunicorn gerencia a execução do código Python e o Django foca no que ele faz de melhor: fornecer funcionalidades robustas para o seu usuário final. Agora que seu site está no ar, o próximo passo é focar na otimização de performance e monitoramento constante!