Tutoriais

Hospedando aplicações Python (Django/Flask) com Gunicorn

Hospedando aplicações Python (Django/Flask) com Gunicorn

O servidor de desenvolvimento do Django (runserver) e do Flask não são feitos para produção. O caminho padrão é: Gunicorn executando a aplicação, systemd mantendo-a no ar e Nginx na frente.

1. Prepare o sistema

sudo apt update
sudo apt install python3 python3-venv python3-pip nginx -y
sudo adduser --disabled-password --gecos "" app
sudo -iu app

2. Código e ambiente virtual

git clone https://github.com/sua-empresa/seu-projeto.git ~/projeto
cd ~/projeto
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install gunicorn

3. Configurações de produção

Django

No settings.py (ou via variáveis de ambiente):

DEBUG = False
ALLOWED_HOSTS = ["app.seudominio.com.br"]
STATIC_ROOT = BASE_DIR / "staticfiles"
CSRF_TRUSTED_ORIGINS = ["https://app.seudominio.com.br"]
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
python manage.py migrate
python manage.py collectstatic --noinput

Flask

Garanta que o objeto da aplicação esteja acessível (ex.: app em app.py) e que debug esteja desativado.

4. Teste o Gunicorn

# Django
gunicorn --bind 127.0.0.1:8000 projeto.wsgi:application
# Flask
gunicorn --bind 127.0.0.1:8000 app:app

Número de workers: uma referência comum é (2 × vCPUs) + 1.

5. Serviço systemd

Saia do usuário app e crie /etc/systemd/system/projeto.service:

[Unit]
Description=Gunicorn - Projeto
After=network.target

[Service]
User=app
Group=www-data
WorkingDirectory=/home/app/projeto
EnvironmentFile=/home/app/projeto/.env
ExecStart=/home/app/projeto/.venv/bin/gunicorn \
    --workers 3 \
    --bind unix:/run/projeto/gunicorn.sock \
    --umask 007 \
    projeto.wsgi:application
RuntimeDirectory=projeto
Restart=always

[Install]
WantedBy=multi-user.target

(Para Flask, troque projeto.wsgi:application por app:app.)

sudo systemctl daemon-reload
sudo systemctl enable --now projeto
sudo systemctl status projeto

6. Nginx

/etc/nginx/sites-available/projeto:

server {
    listen 80;
    server_name app.seudominio.com.br;

    client_max_body_size 20M;

    location /static/ {
        alias /home/app/projeto/staticfiles/;
    }

    location /media/ {
        alias /home/app/projeto/media/;
    }

    location / {
        proxy_pass http://unix:/run/projeto/gunicorn.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

O Nginx precisa ler os estáticos: ajuste as permissões da pasta pessoal (ex.: sudo chmod 710 /home/app e sudo usermod -aG app www-data) ou coloque estáticos em /var/www.

sudo ln -s /etc/nginx/sites-available/projeto /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d app.seudominio.com.br

7. Tarefas em segundo plano

Para filas (Celery, RQ), crie serviços systemd adicionais para os workers, usando Redis como broker.

8. Atualizações

sudo -iu app
cd ~/projeto && git pull
source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
exit
sudo systemctl restart projeto

Conclusão

Gunicorn + systemd + Nginx é uma combinação robusta e testada para Python em produção. Hospede sua aplicação em um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS