Как обновить сайт до http/2

внешний интерфейс HTTPS HTTP

Зачем переходить на http/2? Когда мы используем консоль Chrome для оценки веб-сайта, веб-сайты, отличные от http/2, будут предлагать следующее:

Это означает использовать http / 2. До этого я только слышал некоторые знакомства с http / 2, но http / 2 уже пришел. Самой большой особенностью http/2 является использование мультиплексирования: устанавливается только одно TCP-соединение с сервером того же домена, загружается несколько ресурсов, для передачи используются бинарные фреймы, а HTTP-заголовок одновременно сжимается. Использование http2 будет более эффективным, чем http/1.1, поэтому автор попытался обновить сайт блога.

1. Обновите до HTTP/2

Минимальная версия nginx должна быть 1.10.0, минимальная версия openssl — 1.0.2, а http/2 в основном поддерживает только https в реализации. Система у автора - centos 7, а nginx установленный с yum - 1.10.2.Возможна эта версия, но в системе openssl 1.0.1.Обновите openssl системы до 1.0.2, но все равно это невозможно. Обнаружено, что поскольку openssl, указанный nginx при компиляции, равен 1.0.1, он бесполезен даже при обновлении openssl системы, как показано на следующем рисунке:

Итак, как обновить?официальный сайт nginxПредусмотрено два метода, первый — обновить операционную систему, а второй — собрать новую версию nginx из исходного кода, мы используем второй метод. Последняя стабильная версия nginx — 1.12.1, выполните на сервере следующую команду:

wget http://nginx.org/download/nginx-1.12.1.tar.gz # 下载
tar -zxvf nginx-1.12.1.tar.gz # 解压
cd nginx-1.12.1
./configure # 确认系统环境,生成make文件
make # 编译
sudo make install #安装

При настройке можно брать за собой параметры.В параметрах можно использовать параметры оригинальной старой версии nginx, включая путь установки.Это можно получить, выполнив nginx -V, чтобы конфигурация нового nginx была такой же как старый nginx. Если configure выдает сообщение об отсутствии некоторых библиотек, установите их соответствующим образом.По сути, за библиотекой следует devel, например следующее приглашение:

./configure: error: the Google perftools module requires the Google perftools

library. You can either do not enable the module or install the library.

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

sudo yum install gperftools-devel

Версия openssl только что установленного nginx верна:

Затем добавьте конфигурацию nginx, исходное прослушивание https:

listen 443 ssl;

Теперь добавьте http2 после:

listen 443 ssl http2;

Затем выключите nginx и снова включите его (поскольку установлен новый nginx, его нужно выключить, а затем включить), а затем используйте браузер для доступа к исходному http1.1:

станет http2:

Одна деталь заключается в том, что HTTP/2 не называется 2.0, что сделано намеренно, потому что 1.x легко спутать, поэтому 2 не имеет младшего номера версии, поэтому приведенный выше дисплей Firefox на самом деле неверен.

Вся модель трансмиссии показана на рисунке ниже (изображение взято изnginx):

Nginx и клиент — это HTTP/2, а nginx и бизнес-служба — по-прежнему HTTP/1.1, поскольку служба nginx и бизнес-служба обычно находятся в одной и той же интрасети, и скорость обычно высокая, а соединение между nginx и клиентом невозможно. Контролируйте, если сам бизнес-сервис поддерживает HTTP/2, будет лучше.

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

Видно, что HTTP 2 не имеет большого улучшения трафика, а только уменьшает трафик на 4kB (1%), Давайте проанализируем причины ниже. Преимущество HTTP 2 также заключается в его мультиплексировании и так далее.

2. Преимущества HTTP/2

(1) Мультиплексирование

Значение мультиплексирования заключается в том, что по одному и тому же соединению можно передавать несколько ресурсов, что делает ненужными некоторые оптимизации, ранее сделанные в http 1.1, такие как:

а) Используя технологию изображения спрайтов, объедините несколько маленьких изображений в одно большое изображение, чтобы уменьшить количество запросов;

б) Объедините JS и CSS, чтобы уменьшить количество запросов.

Потому что в эпоху http 1.1 из-за необходимости устанавливать несколько TCP-соединений серверу нужно больше потоков для обработки запросов, и аналогично браузеру тоже нужно, поэтому браузер будет ограничивать количество одновременных запросов для одного и того же домена, и Chrome ограничен 6 , общее количество подключений 17, количество других браузеров колеблется, но почти одинаково, читатели могутэтот сайтПроверьте ограничения вашего браузера. Для практического сравнения http 1.1 будет ставить ресурсы в очередь для загрузки, как показано на следующем рисунке:

Но когда мы включаем http/2, количество практически не ограничено, как показано на следующем рисунке:

Вы обнаружите, что эти ресурсы загружаются одновременно, а ресурсы, загруженные позже, не нужно ставить в очередь. То есть теоретически пропускная способность может быть передана максимально быстро. Реальный эффект - на сайте блога автора.Я использовал страницу для повтора 5 раз.По сравнению со средним, время загрузки всего на 4% быстрее.Это не очень очевидно в моем примере, но это не значит, что HTTP 2 бесполезно.Если соединение между nginx и бизнес-сервисом также http/2, должно быть лучше.

Эта модель трансмиссии выглядит так, как показано на следующем рисунке (изображение изДокументация Google Developer):

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

(2) Сервер Push

В приведенных выше двух загружаемых изображениях вы можете видеть, что другие ресурсы не начнут загружаться до загрузки первого ресурса html, потому что они запускаются html.Например, тег img загрузит изображение, поэтому вам нужно дождаться html для загрузки и другие ресурсы могут быть загружены только после синтаксического анализа, а http2 позволяет службе сначала подталкивать к вам другие ресурсы, которые, вероятно, будут запрошены клиентом, не дожидаясь отправки запроса, что может улучшить общее скорость загрузки страницы. На официальном сайте nginx сказано, что Server Push в настоящее время не поддерживается, но вы можете загрузить пакет http2 Node.js и написать демо-версию, чтобы испытать его.Следующий код:

response.push('/img/banner.png');

(3) Сжатие заголовков и двоичное кодирование

Поскольку данные, передаваемые по https, зашифрованы, этот процесс невозможно наблюдать с помощью инструментов захвата пакетов, поэтому мы можем провести некоторый теоретический анализ.

Преимущество использования двоичной передачи в том, что она ближе к характеристикам памяти компьютера, есть некоторые обычные аналитические сложности, потоковая текстовая форма, например, анализ длины сообщения (Message Length) должен быть разделен на пять случаев, см.w3c, а при использовании бинарного метода такой проблемы нет. Следует отметить, что бинарная форма http/2 не меняет систему http/1.1, а только меняет формат передаваемого сообщения, как показано на следующем рисунке:

На изображении выше показаны два фрейма, фрейм заголовка и фрейм данных.

Сжатие заголовка пакета выглядит следующим образом, как показано на следующем рисунке:

Клиент отправляет два запроса, первый запрос имеет полный http-заголовок, а второй запрос имеет только поле пути, которое отличается, но на этот раз в заголовке нужно отправить только поле пути, Что ж, это значительно уменьшает количество отправки . Реализация этого требует, чтобы и клиент, и служба поддерживали таблицу заголовков. Упомянутое выше снижение трафика на 4 КБ, вероятно, является результатом этой экономии. Значимость этого по-прежнему велика, потому что иногда для динамического запроса может потребоваться отправить всего несколько байт данных, но при этом нужно отправить заголовок (500~800) из нескольких сотен байт.


Последний вопрос, насколько совместим HTTP/2? Как показывает Каниусе:

IE11 поддерживается только в Windows10, а браузеры, такие как Chrome/Safari/Firefox/Opera, поддерживают только http/2 из https.

Что делать, если браузер не поддерживает http/2? Его тоже можно открыть нормально, почему? Поскольку для установки https-соединения требуется рукопожатие, браузер или клиент отправит пакет Client Hello, в котором будет указано, поддерживает ли он http2, как показано на следующем рисунке:

nginx может решить, использовать ли http/2 в соответствии с информацией о рукопожатии, и использовать http/1.1, если клиент его не поддерживает. Здесь мы знаем, с одной стороны, почему браузеры должны использовать https и сервисы для поддержки ALPN.


Ссылаться на:

  1. Введение в HTTP/2 — Документация Google для разработчиков

  2. Why Everyone Should Be Moving To HTTP/2
  3. HTTP/2 Frequently Asked Questions

Расширение:

  1. Почему вы должны обновить свой сайт до HTTPS
  2. что происходит в первые несколько миллисекунд соединения https
  3. Веб-сокет и TCP/IP