Другой веб-сервер ASGI, поддерживающий спецификации HTTP / 2 и HTTP / 3.

Я рассмотрел довольно много руководств по FastAPI, в которых серверы развертываются с помощью Uvicorn, быстродействующего веб-сервера ASGI. На момент написания этой статьи Uvicorn в настоящее время поддерживает только HTTP / 1.1 и WebSockets. Согласно официальной документации, поддержка HTTP / 2 запланирована, но пока нет оценки времени завершения.

HTTP / 2 является преемником старого HTTP / 1, который обеспечивает уменьшение задержки при сохранении той же семантики высокого уровня (методы, поля заголовков, коды состояния и т. Д.). Основанный на Википедии, он улучшает загрузку веб-страниц с помощью:

В этой статье рассматривается развертывание сервера FastAPI для HTTP / 2 с использованием другого веб-сервера ASGI, называемого Hypercorn. К вашему сведению, Hypercorn - это

… Веб-сервер ASGI, основанный на библиотеках sans-io hyper, h11, h2 и wsproto и вдохновленный Gunicorn. Hypercorn поддерживает спецификации HTTP / 1, HTTP / 2, WebSockets (через HTTP / 1 и HTTP / 2), ASGI / 2 и ASGI / 3. Hypercorn может использовать типы рабочих asyncio, uvloop или trio.

Переходим к следующему разделу и приступаем к установке необходимых модулей.

Настраивать

Перед продолжением установки настоятельно рекомендуется создать виртуальную среду. Активируйте виртуальную среду и продолжите установку необходимых пакетов через pip install.

FastAPI

Выполните следующую команду, чтобы установить FastAPI:

pip install fastapi

Гиперкорн

Установите Hypercorn следующим образом:

pip install hypercorn

Реализация

В этом разделе вы научитесь писать простой скрипт FastAPI и запускать его с помощью Hypercorn.

Сервер FastAPI

Давайте создадим новый файл Python с именем myapp.py в том же рабочем каталоге со следующим кодом:

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
    return {"message": "Hello world!"}

Развертывание с Hypercorn

Затем выполните следующую команду в терминале, чтобы запустить сервер. По умолчанию он будет работать как localhost на порту 8000.

hypercorn myapp:app

Подобно Uvicorn, Hypercorn использует следующий синтаксис

hypercorn <module_name>:<variable_name>
  • module_name - имя модуля (имя файла)
  • variable_name - имя переменной, определенной для FastAPI

Привязка к определенному адресу

Однако конфигурация или доступные параметры сильно отличаются от Uvicorn. Например, вы должны использовать параметр bind для указания хоста и порта следующим образом:

# Hypercorn
hypercorn myapp:app --bind 0.0.0.0:8080
# Uvicorn
uvicorn myapp:app --host 0.0.0.0 --port 8080

Привязка к нескольким адресам

Фактически, вы можете привязать его к нескольким серверам и обслуживать их одновременно. Это чрезвычайно полезно, когда вам нужно обслуживать сервер как по IPv4, так и по IPv6. Например:

hypercorn myapp:app --bind "0.0.0.0:5000" --bind "[::]:5000"

Другие варианты конфигураций

Кроме того, вы также можете использовать следующие параметры при запуске Hypercorn в командной строке.

  • --access-logformat - Формат журнала для журнала доступа, см. Ведение журнала.
  • --access-logfile - Целевой регистратор для журналов доступа, используйте - для стандартного вывода.
  • --backlog —Максимальное количество ожидающих подключений.
  • --ca-certs - Путь к файлу сертификата ЦС SSL.
  • --certfile - Путь к файлу сертификата SSL.
  • --cipher - Шифры для использования при настройке SSL.
  • --debug — Включить режим отладки, то есть дополнительное ведение журнала и проверки.
  • --error-logfile --log-file — Целевое расположение журнала ошибок, используйте - для stderr.
  • --graceful-timeout - Время после SIGTERM или Ctrl-C ждать завершения любых оставшихся запросов (задач).
  • --keep-alive - секунды для поддержания активности неактивных соединений перед закрытием.
  • --keyfile - Путь к файлу ключей SSL.
  • --log-config - файл конфигурации ведения журнала Python.
  • --log-level - Уровень журнала (ошибок).
  • --pid - Место для записи PID (ID программы).
  • --reload —Включение автоматической перезагрузки при изменении кода.
  • --worker-class - Тип используемого воркера. Возможные варианты: asyncio, uvloop (требуется pip install hypercorn[uvloop]) и trio (требуется pip install hypercorn[trio]).
  • --workers —Количество рабочих для создания и использования.

Результат

Предполагая, что вы выполнили следующую команду:

hypercorn myapp:app

Когда вы запустите консоль, вы должны получить следующий вывод:

[2021-07-10 21:24:19 +0800] [5464] [INFO] Running on http://127.0.0.1:8000 (CTRL + C to quit)

Откройте браузер и перейдите по следующему URL-адресу, указанному в консоли:

http://localhost:8000/

Результат должен быть следующим:

{"message":"Hello world!"}

Однако сервер, указанный в заголовках ответа, - это hypercorn-h11, который относится к HTTP / 1.1.

В основном это связано с тем, что HTTP / 2 требует обязательного шифрования. Вы должны обслуживать его с сертификатами, даже если вы используете его как localhost.

Создать самоподписанный сертификат

Давайте создадим временный самозаверяющий сертификат с помощью RSA на 365 дней. Выполните следующую команду в командной строке:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

Если вы столкнулись с проблемой при чтении файла openssl.cnf следующим образом:

Can't open .../openssl.cnf for reading. No such file or directory

Это просто означает, что у него проблемы с поиском файла конфигурации. Если вы установили Git, который поставляется с openssl, просто укажите для него местоположение openssl.cnf с помощью параметра -config. Например:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -config "C:\Program Files\Git\usr\ssl\openssl.cfg"

Он сгенерирует два новых файла:

  • key.pem
  • cert.pem

Затем поместите оба файла в тот же каталог, что и myapp.py, и запустите его с помощью команд --keyfile и --certfile:

hypercorn --keyfile key.pem --certfile cert.pem myapp:app

В браузере перезагрузите страницу, но на этот раз используя https:

https://localhost:8000/

Должна появиться страница с предупреждением, указывающая, что (это нормально, если вы используете самозаверяющий сертификат):

localhost:8000 uses an invalid security certificate.
 
The certificate is not trusted because it is self-signed.

Примите риск и перейдите по запрошенному URL. Вы должны получить следующие заголовки ответа:

hypercorn-h2 указывает, что на сервере работает HTTP / 2. Для рабочего сервера рекомендуется использовать действующий сертификат. Вы можете использовать Let's Encrypt, чтобы получить бесплатные сертификаты для своих сайтов.

Заключение

Подведем итоги тому, что вы узнали сегодня.

Эта статья началась с краткого объяснения HTTP / 2. Он также охватывал поддержку HTTP / 2 для серверов Uvicorn и Hypercorn ASGI.

Затем он перешел к процессу установки через pip install.

Он продолжился стандартным шаблоном для сервера FastAPI и запуском его на локальном хосте. Кроме того, в нем также описаны конфигурации, доступные при развертывании сервера FastAPI с Hypercorn.

Это руководство также включало простой раздел о создании самозаверяющих сертификатов, поскольку HTTP / 2 требует обязательных сертификатов во время развертывания.

Спасибо, что прочитали эту статью. Не стесняйтесь проверять мои другие статьи. Удачного дня!

использованная литература

  1. FastAPI - Развернуть вручную
  2. Гиперкорн - Gitlab
  3. Гиперкорн - Документация
  4. HTTP2 - Википедия