Запуск сервера вручную¶
Используйте команду fastapi run
¶
Коротко: используйте fastapi run
, чтобы запустить ваше приложение FastAPI:
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server 🚀
Searching for package file structure from directories
with <font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
the following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C
to quit<b>)</b>
В большинстве случаев этого достаточно. 😎
Этой командой, например, можно запускать приложение FastAPI в контейнере, на сервере и т.д.
ASGI‑серверы¶
Давайте немного углубимся в детали.
FastAPI использует стандарт для построения Python‑веб‑фреймворков и серверов под названием ASGI. FastAPI — ASGI-веб‑фреймворк.
Главное, что вам нужно, чтобы запустить приложение FastAPI (или любое другое ASGI‑приложение) на удалённой серверной машине, — это программа ASGI‑сервера, такая как Uvicorn; именно он используется по умолчанию в команде fastapi
.
Есть несколько альтернатив, например:
- Uvicorn: высокопроизводительный ASGI‑сервер.
- Hypercorn: ASGI‑сервер, среди прочего совместимый с HTTP/2 и Trio.
- Daphne: ASGI‑сервер, созданный для Django Channels.
- Granian: HTTP‑сервер на Rust для Python‑приложений.
- NGINX Unit: NGINX Unit — лёгкая и многофункциональная среда выполнения веб‑приложений.
Сервер как машина и сервер как программа¶
Есть небольшой нюанс в терминологии, о котором стоит помнить. 💡
Слово «сервер» обычно используют и для обозначения удалённого/облачного компьютера (физической или виртуальной машины), и для программы, работающей на этой машине (например, Uvicorn).
Имейте в виду, что слово «сервер» в целом может означать любое из этих двух.
Когда речь идёт об удалённой машине, её зачастую называют сервер, а также машина, VM (виртуальная машина), нода. Всё это — варианты названия удалённой машины, обычно под управлением Linux, на которой вы запускаете программы.
Установка серверной программы¶
При установке FastAPI он поставляется с продакшн‑сервером Uvicorn, и вы можете запустить его командой fastapi run
.
Но вы также можете установить ASGI‑сервер вручную.
Создайте виртуальное окружение, активируйте его и затем установите серверное приложение.
Например, чтобы установить Uvicorn:
$ pip install "uvicorn[standard]"
---> 100%
Аналогично устанавливаются и другие ASGI‑серверы.
Совет
С добавлением standard
Uvicorn установит и будет использовать ряд рекомендованных дополнительных зависимостей.
В их числе uvloop
— высокопроизводительная замена asyncio
, дающая серьёзный прирост производительности при параллельной работе.
Если вы устанавливаете FastAPI, например так: pip install "fastapi[standard]"
, вы уже получаете и uvicorn[standard]
.
Запуск серверной программы¶
Если вы установили ASGI‑сервер вручную, обычно нужно передать строку импорта в специальном формате, чтобы он смог импортировать ваше приложение FastAPI:
$ 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)
Примечание
Команда uvicorn main:app
означает:
main
: файлmain.py
(Python‑«модуль»).app
: объект, созданный вmain.py
строкойapp = FastAPI()
.
Эквивалентно:
from main import app
У каждого альтернативного ASGI‑сервера будет похожая команда; подробнее см. в их документации.
Предупреждение
Uvicorn и другие серверы поддерживают опцию --reload
, полезную в период разработки.
Опция --reload
потребляет значительно больше ресурсов, менее стабильна и т.п.
Она сильно помогает во время разработки, но в продакшн её использовать не следует.
Концепции развёртывания¶
В этих примерах серверная программа (например, Uvicorn) запускает один процесс, слушающий все IP‑адреса (0.0.0.0
) на заранее заданном порту (например, 80
).
Это базовая идея. Но, вероятно, вам понадобится позаботиться и о некоторых дополнительных вещах, например:
- Безопасность — HTTPS
- Запуск при старте системы
- Перезапуски
- Репликация (количество запущенных процессов)
- Память
- Предварительные шаги перед запуском
В следующих главах я расскажу подробнее про каждую из этих концепций, о том, как о них думать, и приведу конкретные примеры со стратегиями, как с ними работать. 🚀