9.5 KiB
Запуск сервера вручну
Використайте команду 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 web framework-ів і серверів під назвою ASGI. FastAPI — це ASGI web framework.
Головне, що вам потрібно, щоб запустити застосунок FastAPI (або будь-який інший ASGI-застосунок) на віддаленій серверній машині — це програма ASGI-сервера, наприклад Uvicorn. Саме її fastapi використовує за замовчуванням.
Є кілька альтернатив, зокрема:
- Uvicorn: високопродуктивний ASGI-сервер.
- Hypercorn: ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей.
- Daphne: ASGI-сервер, створений для Django Channels.
- Granian: Rust HTTP-сервер для Python-застосунків.
- NGINX Unit: NGINX Unit — легковагове та універсальне середовище виконання web-застосунків.
Серверна машина та серверна програма
Є невеликий нюанс із назвами, який варто пам’ятати. 💡
Слово «server» часто використовують і для віддаленого/хмарного комп’ютера (фізичної або віртуальної машини), і для програми, що працює на цій машині (наприклад, Uvicorn).
Просто майте на увазі: коли загалом читаєте «server», це може означати одну з цих двох речей.
Коли йдеться про віддалену машину, її часто називають server, а також machine, VM (virtual machine), node. Усе це означає певний тип віддаленої машини, зазвичай під Linux, на якій ви запускаєте програми.
Встановіть серверну програму
Коли ви встановлюєте FastAPI, разом із ним встановлюється production server — Uvicorn, і ви можете запустити його командою fastapi run.
Але ви також можете встановити ASGI-сервер вручну.
Переконайтеся, що ви створили віртуальне середовище{.internal-link target=_blank}, активували його, і тоді можете встановити серверний застосунок.
Наприклад, щоб встановити Uvicorn:
$ pip install "uvicorn[standard]"
---> 100%
Подібний процес застосовується і для будь-якої іншої програми ASGI-сервера.
/// tip | Порада
Додаючи standard, Uvicorn встановить і використовуватиме деякі рекомендовані додаткові залежності.
Зокрема uvloop — високопродуктивну повністю сумісну заміну для asyncio, що дає значний приріст продуктивності паралельного виконання.
Коли ви встановлюєте FastAPI командою на кшталт pip install "fastapi[standard]", ви також уже отримуєте uvicorn[standard].
///
Запустіть серверну програму
Якщо ви встановили ASGI-сервер вручну, зазвичай потрібно передати рядок імпорту (import string) у спеціальному форматі, щоб він імпортував ваш 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)
/// note | Примітка
Команда uvicorn main:app означає:
main: файлmain.py(Python «module»).app: об’єкт, створений всерединіmain.pyрядкомapp = FastAPI().
Це еквівалентно:
from main import app
///
Кожна альтернативна програма ASGI-сервера матиме подібну команду, докладніше дивіться у відповідній документації.
/// warning | Попередження
Uvicorn та інші сервери підтримують опцію --reload, яка корисна під час розробки.
Опція --reload споживає значно більше ресурсів, є менш стабільною тощо.
Вона дуже допомагає під час розробки, але не слід використовувати її в production.
///
Концепції деплою
Ці приклади запускають серверну програму (наприклад, Uvicorn), стартуючи один процес, що слухає всі IP-адреси (0.0.0.0) на наперед визначеному порту (наприклад, 80).
Це базова ідея. Але, ймовірно, вам також потрібно буде подбати про додаткові речі, як-от:
- Безпека — HTTPS
- Запуск при старті системи
- Перезапуски
- Реплікація (кількість запущених процесів)
- Пам’ять
- Попередні кроки перед запуском
У наступних розділах я розповім більше про кожне з цих понять: як про них думати та наведу конкретні приклади зі стратегіями, як із цим працювати. 🚀