# Запуск сервера вручную { #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
* Запуск при старте системы
* Перезапуски
* Репликация (количество запущенных процессов)
* Память
* Предварительные шаги перед запуском
В следующих главах я расскажу подробнее про каждую из этих концепций, о том, как о них думать, и приведу конкретные примеры со стратегиями, как с ними работать. 🚀