Запуск сервера вручную - Uvicorn¶
Для запуска приложения FastAPI на удалённой серверной машине вам необходим программный сервер, поддерживающий протокол ASGI, такой как Uvicorn.
Существует три наиболее распространённые альтернативы:
- Uvicorn: высокопроизводительный ASGI сервер.
- Hypercorn: ASGI сервер, помимо прочего поддерживающий HTTP/2 и Trio.
- Daphne: ASGI сервер, созданный для Django Channels.
Сервер как машина и сервер как программа¶
В этих терминах есть некоторые различия и вам следует запомнить их. 💡
Слово "сервер" чаще всего используется в двух контекстах:
- удалённый или расположенный в "облаке" компьютер (физическая или виртуальная машина).
- программа, запущенная на таком компьютере (например, Uvicorn).
Просто запомните, если вам встретился термин "сервер", то обычно он подразумевает что-то из этих двух смыслов.
Когда имеют в виду именно удалённый компьютер, часто говорят просто сервер, но ещё его называют машина, ВМ (виртуальная машина), нода. Все эти термины обозначают одно и то же - удалённый компьютер, обычно под управлением Linux, на котором вы запускаете программы.
Установка программного сервера¶
Вы можете установить сервер, совместимый с протоколом ASGI, так:
- Uvicorn, очень быстрый ASGI сервер, основанный на библиотеках uvloop и httptools.
$ pip install "uvicorn[standard]"
---> 100%
Подсказка
С опцией standard
, Uvicorn будет устанавливаться и использоваться с некоторыми дополнительными рекомендованными зависимостями.
В них входит uvloop
, высокопроизводительная замена asyncio
, которая значительно ускоряет работу асинхронных программ.
- Hypercorn, ASGI сервер, поддерживающий протокол HTTP/2.
$ pip install hypercorn
---> 100%
...или какой-либо другой ASGI сервер.
Запуск серверной программы¶
Затем запустите ваше приложение так же, как было указано в руководстве ранее, но без опции --reload
:
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
$ hypercorn main:app --bind 0.0.0.0:80
Running on 0.0.0.0:8080 over http (CTRL + C to quit)
Предупреждение
Не забудьте удалить опцию --reload
, если ранее пользовались ею.
Включение опции --reload
требует дополнительных ресурсов, влияет на стабильность работы приложения и может повлечь прочие неприятности.
Она сильно помогает во время разработки, но не следует использовать её при реальной работе приложения.
Hypercorn с Trio¶
Starlette и FastAPI основаны на AnyIO, которая делает их совместимыми как с asyncio - стандартной библиотекой Python, так и с Trio.
Тем не менее Uvicorn совместим только с asyncio и обычно используется совместно с uvloop
, высокопроизводительной заменой asyncio
.
Но если вы хотите использовать Trio напрямую, то можете воспользоваться Hypercorn, так как они совместимы. ✨
Установка Hypercorn с Trio¶
Для начала, вам нужно установить Hypercorn с поддержкой Trio:
$ pip install "hypercorn[trio]"
---> 100%
Запуск с Trio¶
Далее запустите Hypercorn с опцией --worker-class
и аргументом trio
:
$ hypercorn main:app --worker-class trio
Hypercorn, в свою очередь, запустит ваше приложение использующее Trio.
Таким образом, вы сможете использовать Trio в своём приложении. Но лучше использовать AnyIO, для сохранения совместимости и с Trio, и с asyncio. 🎉
Концепции развёртывания¶
В вышеприведённых примерах серверные программы (например Uvicorn) запускали только один процесс, принимающий входящие запросы с любого IP (на это указывал аргумент 0.0.0.0
) на определённый порт (в примерах мы указывали порт 80
).
Это основная идея. Но возможно, вы озаботитесь добавлением дополнительных возможностей, таких как:
- Использование более безопасного протокола HTTPS
- Настройки запуска приложения
- Перезагрузка приложения
- Запуск нескольких экземпляров приложения
- Управление памятью
- Использование перечисленных функций перед запуском приложения.
Я расскажу вам больше о каждой из этих концепций в следующих главах, с конкретными примерами стратегий работы с ними. 🚀