# Запуск сервера вручную { #run-a-server-manually } ## Используйте команду `fastapi run` { #use-the-fastapi-run-command } Коротко: используйте `fastapi run`, чтобы запустить ваше приложение FastAPI:
```console $ fastapi run main.py FastAPI Starting production server 🚀 Searching for package file structure from directories with __init__.py files Importing from /home/user/code/awesomeapp module 🐍 main.py code Importing the FastAPI app object from the module with the following code: from main import app app Using import string: main:app server Server started at http://0.0.0.0:8000 server Documentation at http://0.0.0.0:8000/docs Logs: INFO Started server process [2306215] INFO Waiting for application startup. INFO Application startup complete. INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) ```
В большинстве случаев этого достаточно. 😎 Этой командой, например, можно запускать приложение **FastAPI** в контейнере, на сервере и т.д. ## ASGI‑серверы { #asgi-servers } Давайте немного углубимся в детали. 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 — лёгкая и многофункциональная среда выполнения веб‑приложений. ## Сервер как машина и сервер как программа { #server-machine-and-server-program } Есть небольшой нюанс в терминологии, о котором стоит помнить. 💡 Слово «сервер» обычно используют и для обозначения удалённого/облачного компьютера (физической или виртуальной машины), и для программы, работающей на этой машине (например, Uvicorn). Имейте в виду, что слово «сервер» в целом может означать любое из этих двух. Когда речь идёт об удалённой машине, её зачастую называют **сервер**, а также **машина**, **VM** (виртуальная машина), **нода**. Всё это — варианты названия удалённой машины, обычно под управлением Linux, на которой вы запускаете программы. ## Установка серверной программы { #install-the-server-program } При установке FastAPI он поставляется с продакшн‑сервером Uvicorn, и вы можете запустить его командой `fastapi run`. Но вы также можете установить ASGI‑сервер вручную. Создайте [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активируйте его и затем установите серверное приложение. Например, чтобы установить Uvicorn:
```console $ pip install "uvicorn[standard]" ---> 100% ```
Аналогично устанавливаются и другие ASGI‑серверы. /// tip | Совет С добавлением `standard` Uvicorn установит и будет использовать ряд рекомендованных дополнительных зависимостей. В их числе `uvloop` — высокопроизводительная замена `asyncio`, дающая серьёзный прирост производительности при параллельной работе. Если вы устанавливаете FastAPI, например так: `pip install "fastapi[standard]"`, вы уже получаете и `uvicorn[standard]`. /// ## Запуск серверной программы { #run-the-server-program } Если вы установили ASGI‑сервер вручную, обычно нужно передать строку импорта в специальном формате, чтобы он смог импортировать ваше приложение FastAPI:
```console $ uvicorn main:app --host 0.0.0.0 --port 80 INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```
/// note | Примечание Команда `uvicorn main:app` означает: * `main`: файл `main.py` (Python‑«модуль»). * `app`: объект, созданный в `main.py` строкой `app = FastAPI()`. Эквивалентно: ```Python from main import app ``` /// У каждого альтернативного ASGI‑сервера будет похожая команда; подробнее см. в их документации. /// warning | Предупреждение Uvicorn и другие серверы поддерживают опцию `--reload`, полезную в период разработки. Опция `--reload` потребляет значительно больше ресурсов, менее стабильна и т.п. Она сильно помогает во время **разработки**, но в **продакшн** её использовать **не следует**. /// ## Концепции развёртывания { #deployment-concepts } В этих примерах серверная программа (например, Uvicorn) запускает **один процесс**, слушающий все IP‑адреса (`0.0.0.0`) на заранее заданном порту (например, `80`). Это базовая идея. Но, вероятно, вам понадобится позаботиться и о некоторых дополнительных вещах, например: * Безопасность — HTTPS * Запуск при старте системы * Перезапуски * Репликация (количество запущенных процессов) * Память * Предварительные шаги перед запуском В следующих главах я расскажу подробнее про каждую из этих концепций, о том, как о них думать, и приведу конкретные примеры со стратегиями, как с ними работать. 🚀