Browse Source
Co-authored-by: Artem Golicyn <[email protected]> Co-authored-by: Sebastián Ramírez <[email protected]>pull/9501/head
committed by
GitHub
2 changed files with 151 additions and 0 deletions
@ -0,0 +1,150 @@ |
|||||
|
# Запуск сервера вручную - Uvicorn |
||||
|
|
||||
|
Для запуска приложения **FastAPI** на удалённой серверной машине Вам необходим программный сервер, поддерживающий протокол ASGI, такой как **Uvicorn**. |
||||
|
|
||||
|
Существует три наиболее распространённые альтернативы: |
||||
|
|
||||
|
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>: высокопроизводительный ASGI сервер. |
||||
|
* <a href="https://pgjones.gitlab.io/hypercorn/" class="external-link" target="_blank">Hypercorn</a>: ASGI сервер, помимо прочего поддерживающий HTTP/2 и Trio. |
||||
|
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: 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** основаны на <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>, которая делает их совместимыми как с <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a> - стандартной библиотекой Python, так и с <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a>. |
||||
|
|
||||
|
|
||||
|
Тем не менее Uvicorn совместим только с asyncio и обычно используется совместно с <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>, высокопроизводительной заменой `asyncio`. |
||||
|
|
||||
|
Но если Вы хотите использовать **Trio** напрямую, то можете воспользоваться **Hypercorn**, так как они совместимы. ✨ |
||||
|
|
||||
|
### Установка Hypercorn с Trio |
||||
|
|
||||
|
Для начала, Вам нужно установить Hypercorn с поддержкой Trio: |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ pip install "hypercorn[trio]" |
||||
|
---> 100% |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
### Запуск с Trio |
||||
|
|
||||
|
Далее запустите Hypercorn с опцией `--worker-class` и аргументом `trio`: |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ hypercorn main:app --worker-class trio |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
Hypercorn, в свою очередь, запустит Ваше приложение использующее Trio. |
||||
|
|
||||
|
Таким образом, Вы сможете использовать Trio в своём приложении. Но лучше использовать AnyIO, для сохранения совместимости и с Trio, и с asyncio. 🎉 |
||||
|
|
||||
|
## Концепции развёртывания |
||||
|
|
||||
|
В вышеприведённых примерах серверные программы (например Uvicorn) запускали только **один процесс**, принимающий входящие запросы с любого IP (на это указывал аргумент `0.0.0.0`) на определённый порт (в примерах мы указывали порт `80`). |
||||
|
|
||||
|
Это основная идея. Но возможно, Вы озаботитесь добавлением дополнительных возможностей, таких как: |
||||
|
|
||||
|
* Использование более безопасного протокола HTTPS |
||||
|
* Настройки запуска приложения |
||||
|
* Перезагрузка приложения |
||||
|
* Запуск нескольких экземпляров приложения |
||||
|
* Управление памятью |
||||
|
* Использование перечисленных функций перед запуском приложения. |
||||
|
|
||||
|
Я поведаю Вам больше о каждой из этих концепций в следующих главах, с конкретными примерами стратегий работы с ними. 🚀 |
Loading…
Reference in new issue