Что такое 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
Минимальный пример:
Где main.py
содержит:
Использование Uvicorn с FastAPI
Uvicorn — рекомендуемый сервер для FastAPI:
Параметр --reload
используется для разработки. В продакшене его нужно отключать.
Использование Uvicorn с Django через daphne или channels
С Django 3.0+ можно использовать ASGI-приложение:
В asgi.py
:
Запуск:
Конфигурация запуска и параметры командной строки
Полный список:
Запуск Uvicorn с автоперезапуском и debug
--reload
автоматически перезапускает сервер при изменении кода.
Работа с многопоточностью и workers
Параметр --workers
запускает несколько процессов сервера:
Рекомендуется для продакшена, особенно на многопроцессорных системах.
Поддержка HTTP/2, WebSocket и keep-alive
-
WebSocket поддерживается напрямую через ASGI
-
Для HTTP/2 требуется использовать
hypercorn
или nginx как TLS reverse proxy -
Keep-alive соединения включены по умолчанию
Использование Uvicorn за reverse proxy (Nginx, Traefik)
Пример конфигурации Nginx:
Интеграция с Docker
Dockerfile
:
Запуск:
Производительность и сравнение с Gunicorn
Сервер | Асинхронность | Скорость | Поддержка WebSocket |
---|---|---|---|
Gunicorn | Нет | Средняя | Нет |
Uvicorn | Да | Высокая | Да |
Hypercorn | Да | Высокая | Да + HTTP/2 |
Gunicorn используется с uvicorn.workers.UvicornWorker
для поддержки ASGI:
Развёртывание Uvicorn в продакшене
Рекомендуемые параметры:
Используйте 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 ). |
Варианты запуска (параметры 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 из кода. |
Использование с различными фреймворками
Фреймворк | Подключение |
---|---|
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 |
Путь к публичному сертификату. |
Использование в 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
Полезные команды
Команда | Описание |
---|---|
uvicorn --help |
Показывает все опции. |
uvicorn --reload-dir ./src |
Следить за определенной директорией. |
uvicorn app:app --factory |
Для приложений, экспортируемых как функции (например, create_app() ). |
Заключение: Uvicorn как основа ASGI-приложений
Uvicorn — это современный и производительный сервер для запуска асинхронных веб-приложений. Он идеально сочетается с FastAPI, Django ASGI и другими фреймворками, позволяя легко обрабатывать HTTP, WebSocket и фоновые задачи. Благодаря простоте запуска, поддержке современных стандартов и высокой скорости, Uvicorn стал стандартом для продакшен-развёртывания ASGI-приложений на Python.