Другой веб-сервер ASGI, поддерживающий спецификации HTTP / 2 и HTTP / 3.
Я рассмотрел довольно много руководств по FastAPI, в которых серверы развертываются с помощью Uvicorn, быстродействующего веб-сервера ASGI. На момент написания этой статьи Uvicorn в настоящее время поддерживает только HTTP / 1.1 и WebSockets. Согласно официальной документации, поддержка HTTP / 2 запланирована, но пока нет оценки времени завершения.
HTTP / 2 является преемником старого HTTP / 1, который обеспечивает уменьшение задержки при сохранении той же семантики высокого уровня (методы, поля заголовков, коды состояния и т. Д.). Основанный на Википедии, он улучшает загрузку веб-страниц с помощью:
- Сжатие данных HTTP-заголовков
- HTTP / 2 Server Push
- Конвейерная обработка запросов
- исправление проблемы блокировки заголовка в HTTP 1.x
- Мультиплексирование нескольких запросов через одно TCP соединение
В этой статье рассматривается развертывание сервера 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 требует обязательных сертификатов во время развертывания.
Спасибо, что прочитали эту статью. Не стесняйтесь проверять мои другие статьи. Удачного дня!