MAATRIX / Блог / VPS для FastAPI: uvicorn и gunicorn workers

VPS для FastAPI: uvicorn и gunicorn workers

Блог MAATRIX · 2026-07-07

FastAPI — асинхронный фреймворк на ASGI. Для production его запускают через uvicorn, а для использования всех ядер — под gunicorn с uvicorn-воркерами. Разберём деплой, systemd, nginx и подбор числа воркеров.

ASGI, uvicorn и gunicorn

['FastAPI построен на ASGI — асинхронном стандарте, который позволяет эффективно обслуживать множество одновременных соединений. Запускает приложение ASGI-сервер, чаще всего uvicorn.', 'Один процесс uvicorn использует одно ядро. Чтобы задействовать все ядра, uvicorn запускают как воркеры под управлением gunicorn: gunicorn держит пул процессов, каждый из которых — асинхронный uvicorn-воркер.', '
  • uvicorn — быстрый ASGI-сервер.
  • gunicorn + UvicornWorker — несколько ядер под нагрузкой.
  • async — много соединений при малом числе процессов.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для FastAPI

Установка и окружение

['Создаём виртуальное окружение и ставим FastAPI со связкой серверов.', '
sudo apt update\nsudo apt install -y python3 python3-venv python3-pip nginx\nsudo mkdir -p /opt/fastapi && cd /opt/fastapi\npython3 -m venv venv\nsource venv/bin/activate\npip install fastapi "uvicorn[standard]" gunicorn
', 'Минимальное приложение для проверки:', '
# main.py\nfrom fastapi import FastAPI\napp = FastAPI()\n\n@app.get("/")\ndef root():\n    return {"status": "ok"}
']

Проверка через uvicorn

['Перед настройкой systemd убедитесь, что приложение поднимается. Для production не используйте флаг --reload.', '
uvicorn main:app --host 127.0.0.1 --port 8000\ncurl http://127.0.0.1:8000/
', 'Одиночный uvicorn годится для теста, но на боевой нагрузке лучше запускать его воркерами под gunicorn. Если у вас Python 3.11+ и не нужен gunicorn, свежие версии uvicorn умеют сами разводить несколько воркеров флагом --workers, но менеджер процессов gunicorn всё же надёжнее для graceful-рестартов.', '
uvicorn main:app --host 127.0.0.1 --port 8000 --workers 4
']

gunicorn с uvicorn-воркерами под systemd

['Ключевой класс воркера — uvicorn.workers.UvicornWorker. Число воркеров подбирают по ядрам: разумный старт — 2 × ядра + 1.', '
[Unit]\nDescription=FastAPI via gunicorn\nAfter=network.target\n\n[Service]\nUser=appuser\nWorkingDirectory=/opt/fastapi\nExecStart=/opt/fastapi/venv/bin/gunicorn main:app \\\n    --workers 4 \\\n    --worker-class uvicorn.workers.UvicornWorker \\\n    --bind unix:/opt/fastapi/fastapi.sock\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=multi-user.target
', '
sudo systemctl daemon-reload\nsudo systemctl enable --now fastapi\njournalctl -u fastapi -f
', 'Если приложение выполняет тяжёлые синхронные операции — обращение к внешнему API или CPU-bound вычисления, — выносите их из основного event loop через run_in_executor или отдельную очередь задач. Иначе один медленный вызов заблокирует весь асинхронный воркер и уронит пропускную способность.']

nginx и TLS

['nginx проксирует запросы в сокет. Для FastAPI важно пробросить заголовки и включить keepalive для производительности.', '
server {\n    listen 80;\n    server_name api.example.com;\n    location / {\n        proxy_pass http://unix:/opt/fastapi/fastapi.sock;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}
', '
sudo nginx -t && sudo systemctl reload nginx\nsudo apt install -y certbot python3-certbot-nginx\nsudo certbot --nginx -d api.example.com
']

Подбор воркеров, железо и ошибки

['Число воркеров стоит соотносить с ядрами и характером нагрузки: для CPU-bound задач больше процессов, для I/O-bound хватает async в одном воркере. AMD EPYC + NVMe у MAATRIX дают высокую производительность на ядро — а значит меньше воркеров при той же пропускной способности. Тарифы от $8/мес, локации UK/США и оплата из России (карта РФ, СБП, крипта, MAAT) удобны для API-сервисов.', '
  • --reload на проде — лишний рестарт и утечки, флаг только для разработки.
  • Обычный воркер вместо UvicornWorker — gunicorn не поймёт ASGI-приложение.
  • Слишком много воркеров — конкуренция за CPU и рост потребления RAM.
  • Блокирующий код в async — один медленный вызов тормозит весь event loop.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для FastAPI

Частые вопросы

uvicorn или gunicorn для FastAPI?

Для одного ядра достаточно uvicorn. Чтобы использовать все ядра на production, запускайте uvicorn-воркеры под gunicorn с классом UvicornWorker.

Сколько воркеров задать?

Стартовая формула 2 × ядра + 1, но для I/O-bound API часто хватает меньшего числа за счёт асинхронности. Тестируйте под реальной нагрузкой.

Можно ли обойтись без nginx?

Технически да, но nginx даёт TLS, отдачу статики, защиту и балансировку. На production его почти всегда ставят перед приложением.