Apache. Документация на русском


Разделы:   1    2    3    4    5      6      7    8    9    10    11    12    13    14    15    16  

Раздел 6. Руководства, учебные пособия и инструкции

Пункты:   49    50    51    52    53    54    55      56    

 <         > 
  RU            EN  

Пункт 56. Руководство по HTTP/2

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

Протокол HTTP/2

HTTP/2 — это эволюция самого успешного в мире протокола прикладного уровня, HTTP. Основное внимание уделяется более эффективному использованию сетевых ресурсов. Это не меняет основ HTTP, семантики. Есть еще запросы, ответы, заголовки и все такое. Итак, если вы уже знаете HTTP/1, вы на 95% знаете и HTTP/2.

О HTTP/2 и о том, как он работает, написано много. Самым нормативным является, конечно же, его RFC 7540 (также доступный в более удобочитаемом формате, YMMV). Итак, там вы найдете гайки и болты.

Но, как и в случае с RFC, читать сначала не очень хорошо. Лучше сначала понять , что вещь хочет сделать, а затем прочитать RFC о том, как это делается. Намного лучше начать с http2, который объяснил Дэниел Стенберг, автор curl. Он также доступен на постоянно растущем списке языков!

Слишком долго, не читал: при чтении этого документа необходимо помнить о некоторых новых терминах и ошибках:

  • HTTP/2 — это бинарный протокол , в отличие от HTTP 1.1, который представляет собой обычный текст. Последний предназначен для чтения человеком (например, для прослушивания сетевого трафика), а первый — нет. Больше информации в официальном вопросе FAQ.
  • h2 — это HTTP/2 через TLS (согласование протокола через ALPN).
  • h2c — это HTTP/2 через TCP.
  • Кадр — это наименьшая единица связи в соединении HTTP/2, состоящая из заголовка и последовательности октетов переменной длины, структурированных в соответствии с типом фрейма . Больше информации в разделе официальной документации.
  • Поток это двунаправленный поток кадров в соединении HTTP/2. Соответствующая концепция в HTTP 1.1 — это обмен сообщениями запрос/ответ. Больше информации в разделе официальной документации.
  • HTTP/2 может запускать несколько потоков данных по одному и тому же TCP-соединению, избегая классического заголовка HTTP 1.1, заключающегося в блокировке медленных запросов, и избегая повторного создания TCP-соединений для каждого запроса/ответа (KeepAlive исправил проблему в HTTP 1.1, но не полностью ее не решить).

HTTP/2 в Apache httpd

Протокол HTTP/2 реализуется собственным модулем httpd, метко названным mod_http2. Он реализует полный набор функций, описанных в RFC 7540, и поддерживает HTTP/2 через открытый текст (http:), а также безопасные (https:) соединения. Открытый вариант называется ' h2c ', защищенный ' h2 '. Поскольку h2c он позволяет прямой режим и Upgrade: через начальный запрос HTTP/1.

Одной из особенностей HTTP/2, которая предлагает новые возможности для веб-разработчиков, является Server Push. См. этот раздел о том, как ваше веб-приложение может его использовать.

Собрать httpd с поддержкой HTTP/2

mod_http2 использует библиотеку nghttp2 в качестве основы для реализации. Для сборки вам необходимо установить в вашей системе mod_http2 как минимум версию 1.2.1 . libnghttp2

Когда вы ./configure используете исходное дерево Apache httpd, вам нужно указать его --enable-http2 в качестве дополнительного аргумента, чтобы запустить сборку модуля. Если вы libnghttp2 находитесь в необычном месте (независимо от того, что находится в вашей операционной системе), вы можете объявить его местоположение с помощью ' --with-nghttp2=<path> ' to configure .

Хотя это должно сработать для большинства, это люди, которые могут предпочесть статическую компоновку nghttp2 в этом модуле. Для таких вариант --enable-nghttp2-staticlib-deps есть. Это работает очень похоже на то, как статически связывают openssl с mod_ssl.

Говоря о SSL, вы должны знать, что большинство браузеров будут использовать HTTP/2 только для https: URL-адресов, поэтому вам нужен сервер с поддержкой SSL. Но не только это, вам понадобится библиотека SSL, поддерживающая расширение ALPN . Если вы используете библиотеку OpenSSL, вам потребуется как минимум версия 1.0.2.

Базовая конфигурация

Когда httpd у вас есть сборка, mod_http2 вам нужна базовая конфигурация, чтобы она стала активной. Первым делом, как и в случае с любым модулем Apache, его необходимо загрузить:

 LoadModule http2_module modules/mod_http2.so 

Вторая директива, которую вам нужно добавить в конфигурацию вашего сервера, это

 Протоколы h2 http/1.1 

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

 Протоколы h2 h2c http/1.1 

В зависимости от того, где вы поместите эту директиву, она влияет на все соединения или только на соединения с определенным виртуальным хостом. Вы можете вложить его, как в:

 Протоколы http/1.1
<Виртуальный хост...>
 Имя сервера test.example.org
 Протоколы h2 http/1.1
</ виртуальный хост> 

Это позволяет использовать только HTTP/1 для соединений, за исключением SSL-соединений, для test.example.org которых предлагается HTTP/2.

Выберите надежный SSLCipherSuite

Необходимо SSLCipherSuite настроить надежный набор шифров TLS. Текущая версия mod_http2 не применяет никаких шифров, но большинство клиентов делают это. Указание браузеру на h2 включенный сервер с неподходящим набором шифров заставит его просто отказаться и вернуться к HTTP 1.1. Это распространенная ошибка, которая возникает при настройке httpd для HTTP/2 в первый раз, поэтому помните об этом, чтобы избежать длительных сеансов отладки! Если вы хотите быть уверены в выборе набора шифров, избегайте тех, которые перечислены в черном списке HTTP/2 TLS.

Порядок упомянутых протоколов также имеет значение. По умолчанию первый протокол является наиболее предпочтительным. Когда клиент предлагает несколько вариантов, выбирается самый левый. В

 Протоколы http/1.1 h2 

наиболее предпочтительным протоколом является HTTP/1, и он всегда будет выбран, если только клиент не поддерживает только h2. Поскольку мы хотим говорить о HTTP/2 с клиентами, которые его поддерживают, лучший порядок таков:

 Протоколы h2 h2c http/1.1 

В заказе есть еще один нюанс: у клиента тоже есть свои предпочтения. Если вы хотите, вы можете настроить свой сервер для выбора наиболее предпочтительного для клиента протокола:

 ПротоколыЧестьЗаказать Выключить 

делает заказ, который вы написали в протоколах, неактуальным, и только заказ клиента будет решать.

И последнее: протоколы, которые вы настраиваете, не проверяются на правильность или орфографию. Можно упомянуть несуществующие протоколы, поэтому не нужно охранять Protocols никакими IfModule проверками.

Более подробные советы по настройке см. в разделе модулей о размерах и о том, как управлять несколькими хостами с одним и тем же сертификатом.

Клиенты

Почти все современные браузеры поддерживают HTTP/2, но только через соединения SSL: Firefox (v43), Chrome (v45), Safari (начиная с v9), iOS Safari (v9), Opera (v35), Chrome для Android (v49) и Интернет. Проводник (v11 в Windows10) (источник).

Другие клиенты, а также серверы перечислены в вики Реализации, среди них реализации для c, c++, common lisp, dart, erlang, haskell, java, nodejs, php, python, perl, ruby, rust, scala и swift.

Несколько небраузерных клиентских реализаций поддерживают HTTP/2 поверх открытого текста, h2c. Наиболее универсальным является завиток.

Полезные инструменты для отладки HTTP/2

Первый инструмент, о котором стоит упомянуть, это, конечно же, curl. Пожалуйста, убедитесь, что ваша версия поддерживает HTTP/2, проверив его Features :

 $ завиток -V
 curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
 Протоколы: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...]
 Возможности: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2
  

Заметки о домашнем пивоварении Mac OS

варить установить curl --with-openssl --with-nghttp2

А для действительно глубокой проверки wireshark.

В пакет nghttp2 также входят такие клиенты, как:

  • nghttp — полезен для визуализации фреймов HTTP/2 и лучшего понимания протокола.
  • h2load — полезно для стресс-тестирования вашего сервера.

Chrome предлагает подробные журналы HTTP/2 для своих подключений на специальной странице сетевых внутренних компонентов. Также существует интересное расширение для Chrome и Firefox, позволяющее визуализировать, когда ваш браузер использует HTTP/2.

Сервер Push

Протокол HTTP/2 позволяет серверу отправлять ответы клиенту, которого он никогда не запрашивал. Тон разговора такой: "вот запрос, который вы так и не отправили и ответ на него скоро придет..."

Но есть ограничения: клиент может отключить эту функцию, а сервер может только PUSH на запрос, пришедший от клиента.

Цель состоит в том, чтобы позволить серверу отправлять клиенту ресурсы, которые ему, скорее всего, потребуются: ресурс css или javascript, который принадлежит html-странице, запрошенной клиентом. Набор изображений, на который ссылается css и т. д.

Преимущество для клиента заключается в том, что он экономит время на отправку запроса, которое может варьироваться от нескольких миллисекунд до полсекунды, в зависимости от того, где на земном шаре оба находятся. Недостатком является то, что клиент может получить отправленные вещи, которые уже есть в его кеше. Конечно, HTTP/2 позволяет досрочно отменять такие запросы, но все равно ресурсы тратятся впустую.

Подводя итог: не существует единой хорошей стратегии, как наилучшим образом использовать эту функцию HTTP/2, и все все еще экспериментируют. Итак, как вы экспериментируете с этим в Apache httpd?

mod_http2 проверить заголовок ответа на наличие Link заголовков в определенном формате:

 Ссылка </xxx.css>;rel=preload, </xxx.js>; отн = предварительная загрузка 

Если соединение поддерживает PUSH, эти два ресурса будут отправлены клиенту. Как веб-разработчик, вы можете установить эти заголовки либо непосредственно в ответе вашего приложения, либо настроить сервер через

 <Расположение /xxx.html>
 Заголовок добавить ссылку "</xxx.css>;rel=preload"
 Заголовок добавить ссылку "</xxx.js>;rel=preload"
</местоположение> 

Если вы хотите использовать preload ссылки без запуска PUSH, вы можете использовать nopush параметр, как в

 Ссылка </xxx.css>;rel=preload;nopush 

или вы можете полностью отключить PUSH для своего сервера с помощью директивы

 H2Push Off 

И еще:

Модуль будет вести дневник того, что было PUSH для каждого соединения (в основном, хэши URL-адресов) и не будет PUSHировать один и тот же ресурс дважды. Когда соединение закрывается, эта информация сбрасывается.

Есть люди, которые думают о том, как клиент может сообщить серверу, что у него уже есть, чтобы можно было избежать PUSH для этих вещей, но сейчас все это очень экспериментально.

Другой экспериментальный проект, который был реализован, mod_http2 — это поле заголовка Accept-Push-Policy, где клиент может для каждого запроса определять, какие PUSH-сообщения он принимает.



 <         > 

Пункты:   49    50    51    52    53    54    55      56    

Рейтинг@Mail.ru