7.8 KiB
Запуск сервера вручную - Uvicorn
Для запуска приложения FastAPI на удалённой серверной машине вам необходим программный сервер, поддерживающий протокол ASGI, такой как Uvicorn.
Существует три наиболее распространённые альтернативы:
- Uvicorn: высокопроизводительный ASGI сервер.
- Hypercorn: ASGI сервер, помимо прочего поддерживающий HTTP/2 и Trio.
- Daphne: ASGI сервер, созданный для Django Channels.
Сервер как машина и сервер как программа
В этих терминах есть некоторые различия и вам следует запомнить их. 💡
Слово "сервер" чаще всего используется в двух контекстах:
- удалённый или расположенный в "облаке" компьютер (физическая или виртуальная машина).
- программа, запущенная на таком компьютере (например, Uvicorn).
Просто запомните, если вам встретился термин "сервер", то обычно он подразумевает что-то из этих двух смыслов.
Когда имеют в виду именно удалённый компьютер, часто говорят просто сервер, но ещё его называют машина, ВМ (виртуальная машина), нода. Все эти термины обозначают одно и то же - удалённый компьютер, обычно под управлением Linux, на котором вы запускаете программы.
Установка программного сервера
Вы можете установить сервер, совместимый с протоколом ASGI, так:
=== "Uvicorn"
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, очень быстрый ASGI сервер, основанный на библиотеках uvloop и httptools.
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
!!! tip "Подсказка"
С опцией `standard`, Uvicorn будет устанавливаться и использоваться с некоторыми дополнительными рекомендованными зависимостями.
В них входит `uvloop`, высокопроизводительная замена `asyncio`, которая значительно ускоряет работу асинхронных программ.
=== "Hypercorn"
* <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, ASGI сервер, поддерживающий протокол HTTP/2.
<div class="termy">
```console
$ pip install hypercorn
---> 100%
```
</div>
...или какой-либо другой ASGI сервер.
Запуск серверной программы
Затем запустите ваше приложение так же, как было указано в руководстве ранее, но без опции --reload
:
=== "Uvicorn"
<div class="termy">
```console
$ 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)
```
</div>
=== "Hypercorn"
<div class="termy">
```console
$ hypercorn main:app --bind 0.0.0.0:80
Running on 0.0.0.0:8080 over http (CTRL + C to quit)
```
</div>
!!! warning "Предупреждение"
Не забудьте удалить опцию `--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
- Настройки запуска приложения
- Перезагрузка приложения
- Запуск нескольких экземпляров приложения
- Управление памятью
- Использование перечисленных функций перед запуском приложения.
Я расскажу вам больше о каждой из этих концепций в следующих главах, с конкретными примерами стратегий работы с ними. 🚀