Flask com Gunicorn e Nginx na VPS: como colocar a sua API Python no ar

Tempo de leitura: 3 minutos

O servidor de desenvolvimento do Flask é ótimo para testar, mas não foi feito para produção. Para deixar a sua API no ar de verdade, o combo clássico é Flask com Gunicorn, controlado pelo systemd e atrás do Nginx. Dá para montar tudo em poucos minutos.

Aplicações Python rodam bem em qualquer VPS Linux com recursos garantidos. Se você ainda não tem onde rodar isso, a Cloud VPS Brasil já entrega o servidor pronto.

A arquitetura

  • Flask: o seu código.
  • Gunicorn: servidor de aplicação que roda vários workers do seu código.
  • systemd: mantém o Gunicorn ligado, reinicia em caso de falha e sobe junto com o servidor.
  • Nginx: recebe as visitas, entrega o HTTPS e repassa para o Gunicorn.

Passo 1: preparar o ambiente

sudo apt update
sudo apt install python3-venv python3-pip nginx -y
sudo mkdir -p /opt/meuapp && cd /opt/meuapp
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn

Passo 2: criar a aplicação

Crie o arquivo /opt/meuapp/app.py:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/")
def inicio():
    return jsonify(status="ok", mensagem="API no ar")

Teste direto com o Gunicorn:

gunicorn --workers 3 --bind 127.0.0.1:8000 app:app

Para testar sem abrir porta, use um túnel SSH (ssh -L 8000:127.0.0.1:8000 usuario@IP_DA_VPS) e abra http://127.0.0.1:8000 no navegador do seu computador: deve aparecer o JSON. Pare o teste no servidor com Ctrl+C.

Passo 3: criar o serviço no systemd

Crie um usuário sem login para rodar o app e dê a ele a pasta:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin meuapp
sudo chown -R meuapp:meuapp /opt/meuapp

Crie /etc/systemd/system/meuapp.service:

[Unit]
Description=Minha API Flask (Gunicorn)
After=network.target

[Service]
User=meuapp
Group=meuapp
WorkingDirectory=/opt/meuapp
ExecStart=/opt/meuapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 app:app
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Ative e inicie:

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

Para entender melhor os comandos, veja Systemctl na VPS Linux.

Passo 4: configurar o Nginx como proxy reverso

Crie /etc/nginx/sites-available/meuapp:

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

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

Ative, teste e recarregue:

sudo ln -s /etc/nginx/sites-available/meuapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Mais detalhes em Nginx como Proxy Reverso na VPS. Para o HTTPS, use o Certbot.

Quantos workers usar

Uma regra comum é (2 x núcleos de CPU) + 1. Numa VPS de 2 núcleos, 5 workers. Se a sua aplicação usa muita memória, reduza.

Como ver os logs

sudo journalctl -u meuapp -f

Erros comuns

  1. 502 Bad Gateway: o Gunicorn não está rodando ou a porta está errada. Veja systemctl status meuapp.
  2. Permissão negada: confira o dono da pasta e o usuário do serviço.
  3. Mudou o código e nada mudou: reinicie com sudo systemctl restart meuapp.

Sua API Python numa VPS estável

O código fica no ar o tempo todo quando o servidor também fica. Na Cloud VPS Brasil você conta com Intel Xeon Gold, SSD NVMe, baixa latência, tráfego ilimitado, preço fixo em reais e suporte humano via WhatsApp e ticket. Fale com a equipe pelo WhatsApp e escolha o plano ideal para o seu projeto.