FastAPI num VPS: workers do uvicorn, cabeçalhos do proxy e um serviço que reinicia

O FastAPI fala ASGI, e o servidor que o corre é o uvicorn. Num VPS, a receita de produção tem quatro peças: o uvicorn com alguns processos, um serviço do systemd que o mantém vivo, o nginx à frente com HTTPS, e a aplicação a ouvir só em 127.0.0.1. O básico (correr com uvicorn main:app) já está em correr uma aplicação Flask ou FastAPI; aqui fica o que faz dele um serviço a sério.

Do teste ao serviço

1 Instale no ambiente virtual da aplicação: cd /home/appuser/api
python3 -m venv .venv
.venv/bin/pip install fastapi uvicorn
A documentação do uvicorn indica as variantes com extras, se precisar de mais velocidade; comece pelo simples.
2 Teste: .venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 2O --workers arranca vários processos. O 2 é um exemplo: cada processo gasta memória. Não use --reload em produção: é só para desenvolver.
3 Crie o serviço em /etc/systemd/system/minha-api.service:[Unit]
Description=Minha API
After=network.target

[Service]
User=appuser
WorkingDirectory=/home/appuser/api
EnvironmentFile=/home/appuser/api/.env
ExecStart=/home/appuser/api/.venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 2
Restart=on-failure

[Install]
WantedBy=multi-user.target
Depois: sudo systemctl daemon-reload e sudo systemctl enable --now minha-api.
4 Ponha o nginx à frente com os cabeçalhos que dizem à API quem é o visitante e se veio por HTTPS: proxy_set_header Host $host;, proxy_set_header X-Forwarded-For $remote_addr; e proxy_set_header X-Forwarded-Proto $scheme;. O resto do bloco está em nginx como proxy inverso.

Os detalhes que fazem diferença

Tema O que saber
Endereço do visitante Atrás do proxy, a API vê o IP do nginx. O uvicorn lê o X-Forwarded-For dos endereços que confia (--forwarded-allow-ips, por omissão só o próprio servidor, o que serve a um nginx local).
Documentação automática O FastAPI publica /docs e /redoc. Para uma API privada, desligue-os: FastAPI(docs_url=None, redoc_url=None).
Tarefas longas Um pedido que demora segura um processo. Para trabalho pesado, faça-o fora do pedido (uma fila), em vez de subir os workers.
Websockets O FastAPI suporta-os. Para o nginx, veja WebSockets num VPS.
Pedidos entre origens Se um site noutro domínio chama esta API: CORS.
Não exponha o uvicorn à Internet. Ouvir em 0.0.0.0 com a porta aberta na firewall salta o HTTPS e o proxy. Mantenha o 127.0.0.1 e deixe só o nginx público. Se a API não responde de fora, siga portas e firewall num VPS.
Crie uma rota de saúde (por exemplo /health que responde «ok») e use-a para saber se a API está viva: com curl, ou num serviço de monitorização. Se o serviço não arranca, journalctl -u minha-api -n 100 diz porquê. Num VPS não gerido, a manutenção é sua: até onde vai o nosso suporte.

Precisa de um servidor para a sua API? Veja os VPS.

Ver os servidores VPS

VEJA TAMBÉM

Correr Flask ou Django com gunicorn e systemd num VPS

Nginx como proxy inverso à frente de um contentor

Erro de CORS entre o seu front end e a sua API

PRODUTO RECOMENDADO

Servidor VPS com acesso root

Recursos só seus, o sistema que escolher, reinstalação quando quiser. desde 7.560,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?