Uvicorn – ASGI-сервер для FastAPI и Django

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Что такое Uvicorn

Uvicorn — это легковесный, высокопроизводительный ASGI-сервер, написанный на Python, предназначенный для запуска асинхронных веб-приложений. Он поддерживает современные протоколы и используется в сочетании с FastAPI, Starlette, Django ASGI и другими фреймворками. В основе Uvicorn лежит библиотека uvloop, обеспечивающая высокую скорость обработки запросов.


Отличия ASGI от WSGI

Параметр WSGI (старый стандарт) ASGI (новый стандарт)
Поддержка async Нет Да
WebSocket Нет Да
HTTP/2 Ограниченно Да
Примеры Flask, Django (по умолчанию) FastAPI, Starlette, Django 3+

ASGI (Asynchronous Server Gateway Interface) — это стандарт для асинхронных приложений, позволяющий обрабатывать HTTP-запросы, WebSocket и фоновые задачи.


Ключевые особенности Uvicorn

  • Высокая производительность благодаря uvloop и httptools

  • Поддержка HTTP/1.1, WebSocket, HTTP/2 (через Hypercorn)

  • Совместимость с ASGI 3.0

  • Поддержка автоматического перезапуска

  • Простой CLI-интерфейс

  • Возможность запуска в многопоточном режиме (--workers)

  • Отличная интеграция с Docker


Установка и запуск Uvicorn

bash
pip install uvicorn

Минимальный пример:

bash
uvicorn main:app --reload

Где main.py содержит:

python
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Привет от Uvicorn"}

Использование Uvicorn с FastAPI

Uvicorn — рекомендуемый сервер для FastAPI:

bash
uvicorn main:app --host 0.0.0.0 --port 8000

Параметр --reload используется для разработки. В продакшене его нужно отключать.


Использование Uvicorn с Django через daphne или channels

С Django 3.0+ можно использовать ASGI-приложение:

bash
pip install uvicorn channels

В asgi.py:

python
import os from django.core.asgi import get_asgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') application = get_asgi_application()

Запуск:

bash
uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000

Конфигурация запуска и параметры командной строки

Полный список:

bash
uvicorn main:app \ --host 0.0.0.0 \ --port 8000 \ --reload \ --workers 4 \ --proxy-headers \ --log-level info

Запуск Uvicorn с автоперезапуском и debug

bash
uvicorn main:app --reload --debug

--reload автоматически перезапускает сервер при изменении кода.


Работа с многопоточностью и workers

Параметр --workers запускает несколько процессов сервера:

bash
uvicorn main:app --workers 4

Рекомендуется для продакшена, особенно на многопроцессорных системах.


Поддержка HTTP/2, WebSocket и keep-alive

  • WebSocket поддерживается напрямую через ASGI

  • Для HTTP/2 требуется использовать hypercorn или nginx как TLS reverse proxy

  • Keep-alive соединения включены по умолчанию


Использование Uvicorn за reverse proxy (Nginx, Traefik)

Пример конфигурации Nginx:

nginx
location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }

Интеграция с Docker

Dockerfile:

dockerfile
FROM python:3.10-slim WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Запуск:

bash
docker build -t myapp . docker run -p 8000:8000 myapp

Производительность и сравнение с Gunicorn

Сервер Асинхронность Скорость Поддержка WebSocket
Gunicorn Нет Средняя Нет
Uvicorn Да Высокая Да
Hypercorn Да Высокая Да + HTTP/2

Gunicorn используется с uvicorn.workers.UvicornWorker для поддержки ASGI:

bash
gunicorn main:app -k uvicorn.workers.UvicornWorker

Развёртывание Uvicorn в продакшене

Рекомендуемые параметры:

bash
uvicorn main:app \ --host 0.0.0.0 \ --port 8000 \ --workers 4 \ --proxy-headers \ --log-level info

Используйте systemd или supervisor для автозапуска на сервере.


Примеры практического применения

  • Запуск FastAPI-серверов

  • ASGI-приложения с WebSocket

  • Роутинг API микросервисов

  • Бэкенды реального времени

  • Сервера, встроенные в Docker-контейнеры


Часто задаваемые вопросы

Что такое Uvicorn?

ASGI-сервер на Python, предназначенный для высокопроизводительных асинхронных веб-приложений.

Чем отличается от Gunicorn?

Uvicorn — асинхронный ASGI-сервер, Gunicorn — синхронный WSGI-сервер.

Можно ли использовать Uvicorn с Django?

Да, начиная с Django 3.0+, через get_asgi_application().

Поддерживает ли Uvicorn WebSocket?

Да, полностью.

Какой сервер лучше для FastAPI?

Uvicorn — рекомендуемый сервер для FastAPI по умолчанию.

Полный справочник по ключевым функциям и модулям библиотеки Uvicorn для Python

Основной запуск сервера

Команда Описание
uvicorn app:app Запускает приложение app из модуля app.py.
uvicorn app:app --reload Автоматическая перезагрузка при изменениях (для разработки).
uvicorn app:app --port 8080 Задает кастомный порт.
uvicorn app:app --host 0.0.0.0 Делает сервер доступным извне.
uvicorn app:app --workers 4 Запуск в многопроцессорном режиме (вместе с --loop asyncio).
bash
uvicorn main:app --reload --port 8001 --host 0.0.0.0

Варианты запуска (параметры CLI)

Аргумент Описание
--reload Перезагрузка при изменении файлов (только в dev-режиме).
--port, --host Установка порта и хоста.
--workers Количество процессов (для production).
--loop Событийный цикл (asyncio, uvloop).
--http HTTP-протокол (auto, httptools, h11).
--log-level Уровень логирования (info, debug, error).
--proxy-headers Принимать заголовки от обратного прокси (X-Forwarded-For).
--ssl-keyfile, --ssl-certfile SSL для HTTPS.

Запуск из Python-скрипта

Компонент Описание
uvicorn.run(app, host=..., port=...) Программа запуска Uvicorn из кода.
python
import uvicorn from myapp import app if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)

Использование с различными фреймворками

Фреймворк Подключение
FastAPI app = FastAPI() — запускается напрямую.
Starlette app = Starlette() — нативная поддержка.
Sanic (ASGI) app = Sanic(...).asgi_app
Quart Совместим, но может требовать дополнительной настройки.
Django (через Django Channels) Django Channels предоставляет ASGI-приложение.
Any ASGI 3.0 совместимое приложение Можно использовать напрямую.

Логирование

Опция Описание
--log-level Уровни: critical, error, warning, info, debug, trace.
--log-config Пользовательский конфиг в формате .json или .yaml.

SSL / HTTPS

Аргумент Описание
--ssl-keyfile Путь к приватному ключу SSL.
--ssl-certfile Путь к публичному сертификату.
bash
uvicorn app:app --host 0.0.0.0 --port 443 \ --ssl-keyfile=key.pem \ --ssl-certfile=cert.pem

Использование в production

Подход Описание
gunicorn -k uvicorn.workers.UvicornWorker app:app Запуск через Gunicorn с несколькими воркерами.
--workers Параллелизм через встроенный multiprocessing.
Обратный прокси (например, Nginx) Рекомендуется для продакшена (балансировка, HTTPS, CORS и пр.).

Поддерживаемые протоколы и опции

Поддержка Описание
HTTP/1.1 По умолчанию.
WebSocket Встроенная поддержка.
HTTP/2 Через Hypercorn (не нативно).
ASGI 3.0 Поддержка спецификации.

Пример минимального FastAPI-приложения с Uvicorn

python
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Uvicorn + FastAPI работает!"}
bash
uvicorn main:app --reload

Полезные команды

Команда Описание
uvicorn --help Показывает все опции.
uvicorn --reload-dir ./src Следить за определенной директорией.
uvicorn app:app --factory Для приложений, экспортируемых как функции (например, create_app()).

Заключение: Uvicorn как основа ASGI-приложений

Uvicorn — это современный и производительный сервер для запуска асинхронных веб-приложений. Он идеально сочетается с FastAPI, Django ASGI и другими фреймворками, позволяя легко обрабатывать HTTP, WebSocket и фоновые задачи. Благодаря простоте запуска, поддержке современных стандартов и высокой скорости, Uvicorn стал стандартом для продакшен-развёртывания ASGI-приложений на Python.