Запуск FastAPI с помощью Uvicorn: настройка и деплой сервера
Основные способы запуска FastAPI через Uvicorn
Оптимальное решение: простая команда uvicorn
Самым эффективным способом запуска FastAPI-приложения является выполнение команды uvicorn main:app --host 0.0.0.0 --port 8000. Здесь main - имя файла (без расширения .py), а app - экземпляр FastAPI. Параметр --host 0.0.0.0 делает сервер доступным из сети, --port 8000 задаёт порт. После запуска приложение будет принимать запросы по адресу http://0.0.0.0:8000.
uvicorn main:app --host 0.0.0.0 --port 8000Python uvicorn fastapi (запуск fastapi с помощью uvicorn)
Эта команда подходит для большинства случаев локальной разработки и простого деплоя.
Как сделать автоматическую перезагрузку при изменении кода?
Для разработки удобно использовать флаг --reload. В этом случае Uvicorn будет отслеживать изменения в файлах проекта и перезапускать сервер автоматически.
uvicorn main:app --reloadПримечание: следует избегать использования --reload в production-среде, так как это снижает производительность.
Как изменить хост и порт для доступа извне?
Параметры --host и --port позволяют явно указать адрес и порт. Значение 0.0.0.0 открывает доступ для всех сетевых интерфейсов.
uvicorn main:app --host 0.0.0.0 --port 8080Как запустить приложение из Python-скрипта (не через командную строку)?
Можно использовать вызов uvicorn.run() внутри Python-кода. Это особенно удобно, когда нужно передавать параметры динамически или запускать несколько приложений.
from uvicorn import run
from main import app
if __name__ == "__main__":
run(app, host="0.0.0.0", port=8000, reload=True)Как объединить Uvicorn с Gunicorn для многопроцессорного запуска?
Gunicorn выступает менеджером процессов, а Uvicorn используется в качестве воркера. Это даёт возможность масштабировать приложение на несколько ядер CPU.
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000Ключ -w задаёт количество воркеров (процессов).
Как запустить FastAPI в Docker-контейнере?
В Dockerfile команда запуска указывается в инструкции CMD. Пример для production:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]Типичные ошибки и их решение
Ошибка: Address already in use - порт уже занят. Решение: сменить порт или завершить процесс, использующий его (kill в Linux, netstat -ano в Windows).
Ошибка: ModuleNotFoundError: No module named 'uvicorn' - не установлен Uvicorn. Решение: выполнить pip install uvicorn.
Ошибка: Can't connect to server - сервер не отвечает. Возможные причины: хост указан как 127.0.0.1 (только локальный доступ), брандмауэр блокирует порт, приложение не импортируется корректно. Проверить имя модуля и экземпляра FastAPI.
Расширенные примеры запуска Uvicorn с FastAPI
1. Запуск с отладкой и детальными логами
Флаг --log-level debug включает подробное логирование, а --access-log выводит информацию о каждом запросе.
uvicorn main:app --reload --log-level debug --access-logINFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [12345] using WatchFiles DEBUG: Loaded ASGI app in 0.002s INFO: Started server process [12346] INFO: Waiting for application startup. DEBUG: Application startup complete.
2. Ограничение перезагрузки конкретной директорией
Параметр --reload-dir указывает, за какой папкой следить. Это полезно, когда проект содержит статические файлы, изменения которых не требуют перезапуска.
uvicorn main:app --reload --reload-dir ./app3. Запуск с поддержкой HTTPS (SSL)
Для этого понадобятся файлы сертификата и ключа. Пример:
uvicorn main:app --ssl-keyfile ./key.pem --ssl-certfile ./cert.pem --host 0.0.0.0 --port 4434. Настройка таймаутов соединения и завершения
Параметр --timeout-keep-alive задаёт время удержания keep-alive соединения (по умолчанию 5 секунд). --timeout-graceful-shutdown - время на завершение текущих запросов при остановке.
uvicorn main:app --timeout-keep-alive 30 --timeout-graceful-shutdown 105. Многопроцессорный запуск с помощью --workers
Uvicorn может запускать несколько рабочих процессов без Gunicorn. Рекомендуется для сред с одним приложением.
uvicorn main:app --workers 4Важно: при использовании --workers не следует одновременно указывать --reload.
6. Запуск через python -m uvicorn
Эквивалентный вызов с использованием модуля Python:
python -m uvicorn main:app --host 0.0.0.07. Интеграция с Docker Compose
Файл docker-compose.yml позволяет задать переменные окружения и упростить деплой.
version: '3.8'
services:
fastapi-app:
build: .
ports:
- "8000:8000"
environment:
- UVICORN_HOST=0.0.0.0
- UVICORN_PORT=8000
command: uvicorn main:app --host 0.0.0.0 --port 80008. Запуск через uvicorn.run() с полным набором параметров
from uvicorn import run
from main import app
if __name__ == "__main__":
run(
"main:app",
host="0.0.0.0",
port=8000,
reload=True,
log_level="info",
workers=2,
ssl_keyfile="./key.pem",
ssl_certfile="./cert.pem"
)9. Запуск двух экземпляров на разных портах
Например, для A/B тестирования или разделения версий API:
uvicorn main:app --port 8000
uvicorn main:app --port 8001Два процесса Uvicorn, обслуживающие одно и то же приложение на разных портах.
10. Использование переменных окружения для конфигурации
Параметры можно считывать из окружения, что особенно полезно для контейнеризированных сред.
import os
from uvicorn import run
from main import app
if __name__ == "__main__":
host = os.getenv("UVICORN_HOST", "0.0.0.0")
port = int(os.getenv("UVICORN_PORT", "8000"))
run(app, host=host, port=port)Результат: приложение запускается с параметрами, заданными через переменные окружения.