VPS для FastAPI: uvicorn и gunicorn workers
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 его почти всегда ставят перед приложением.