Раздел 6. Руководства, учебные пособия и инструкции RU EN Пункт 56. Руководство по HTTP/2 Это руководство по реализации HTTP/2 в Apache httpd. Эта функция готова к производству , и вы можете ожидать, что интерфейсы и директивы останутся согласованными в выпусках. Протокол HTTP/2HTTP/2 — это эволюция самого успешного в мире протокола прикладного уровня, HTTP. Основное внимание уделяется более эффективному использованию сетевых ресурсов. Это не меняет основ HTTP, семантики. Есть еще запросы, ответы, заголовки и все такое. Итак, если вы уже знаете HTTP/1, вы на 95% знаете и HTTP/2. О HTTP/2 и о том, как он работает, написано много. Самым нормативным является, конечно же, его RFC 7540 (также доступный в более удобочитаемом формате, YMMV). Итак, там вы найдете гайки и болты. Но, как и в случае с RFC, читать сначала не очень хорошо. Лучше сначала понять , что вещь хочет сделать, а затем прочитать RFC о том, как это делается. Намного лучше начать с http2, который объяснил Дэниел Стенберг, автор curl. Он также доступен на постоянно растущем списке языков! Слишком долго, не читал: при чтении этого документа необходимо помнить о некоторых новых терминах и ошибках:
HTTP/2 в Apache httpdПротокол HTTP/2 реализуется собственным модулем httpd, метко названным mod_http2. Он реализует полный набор функций, описанных в RFC 7540, и поддерживает HTTP/2 через открытый текст (http:), а также безопасные (https:) соединения. Открытый вариант называется ' Одной из особенностей HTTP/2, которая предлагает новые возможности для веб-разработчиков, является Server Push. См. этот раздел о том, как ваше веб-приложение может его использовать. Собрать httpd с поддержкой HTTP/2mod_http2 использует библиотеку nghttp2 в качестве основы для реализации. Для сборки вам необходимо установить в вашей системе Когда вы Хотя это должно сработать для большинства, это люди, которые могут предпочесть статическую компоновку Говоря о SSL, вы должны знать, что большинство браузеров будут использовать HTTP/2 только для Базовая конфигурацияКогда 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-соединений, для Выберите надежный SSLCipherSuiteНеобходимо Порядок упомянутых протоколов также имеет значение. По умолчанию первый протокол является наиболее предпочтительным. Когда клиент предлагает несколько вариантов, выбирается самый левый. В Протоколы http/1.1 h2 наиболее предпочтительным протоколом является HTTP/1, и он всегда будет выбран, если только клиент не поддерживает только h2. Поскольку мы хотим говорить о HTTP/2 с клиентами, которые его поддерживают, лучший порядок таков: Протоколы h2 h2c http/1.1 В заказе есть еще один нюанс: у клиента тоже есть свои предпочтения. Если вы хотите, вы можете настроить свой сервер для выбора наиболее предпочтительного для клиента протокола: ПротоколыЧестьЗаказать Выключить делает заказ, который вы написали в протоколах, неактуальным, и только заказ клиента будет решать. И последнее: протоколы, которые вы настраиваете, не проверяются на правильность или орфографию. Можно упомянуть несуществующие протоколы, поэтому не нужно охранять Более подробные советы по настройке см. в разделе модулей о размерах и о том, как управлять несколькими хостами с одним и тем же сертификатом. КлиентыПочти все современные браузеры поддерживают 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, проверив его $ завиток -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 также входят такие клиенты, как:
Chrome предлагает подробные журналы HTTP/2 для своих подключений на специальной странице сетевых внутренних компонентов. Также существует интересное расширение для Chrome и Firefox, позволяющее визуализировать, когда ваш браузер использует HTTP/2. Сервер PushПротокол HTTP/2 позволяет серверу отправлять ответы клиенту, которого он никогда не запрашивал. Тон разговора такой: "вот запрос, который вы так и не отправили и ответ на него скоро придет..." Но есть ограничения: клиент может отключить эту функцию, а сервер может только PUSH на запрос, пришедший от клиента. Цель состоит в том, чтобы позволить серверу отправлять клиенту ресурсы, которые ему, скорее всего, потребуются: ресурс css или javascript, который принадлежит html-странице, запрошенной клиентом. Набор изображений, на который ссылается css и т. д. Преимущество для клиента заключается в том, что он экономит время на отправку запроса, которое может варьироваться от нескольких миллисекунд до полсекунды, в зависимости от того, где на земном шаре оба находятся. Недостатком является то, что клиент может получить отправленные вещи, которые уже есть в его кеше. Конечно, HTTP/2 позволяет досрочно отменять такие запросы, но все равно ресурсы тратятся впустую. Подводя итог: не существует единой хорошей стратегии, как наилучшим образом использовать эту функцию HTTP/2, и все все еще экспериментируют. Итак, как вы экспериментируете с этим в Apache httpd? Ссылка </xxx.css>;rel=preload, </xxx.js>; отн = предварительная загрузка Если соединение поддерживает PUSH, эти два ресурса будут отправлены клиенту. Как веб-разработчик, вы можете установить эти заголовки либо непосредственно в ответе вашего приложения, либо настроить сервер через <Расположение /xxx.html> Заголовок добавить ссылку "</xxx.css>;rel=preload" Заголовок добавить ссылку "</xxx.js>;rel=preload" </местоположение> Если вы хотите использовать Ссылка </xxx.css>;rel=preload;nopush или вы можете полностью отключить PUSH для своего сервера с помощью директивы H2Push Off И еще: Модуль будет вести дневник того, что было PUSH для каждого соединения (в основном, хэши URL-адресов) и не будет PUSHировать один и тот же ресурс дважды. Когда соединение закрывается, эта информация сбрасывается. Есть люди, которые думают о том, как клиент может сообщить серверу, что у него уже есть, чтобы можно было избежать PUSH для этих вещей, но сейчас все это очень экспериментально. Другой экспериментальный проект, который был реализован, |