Выпуск nginx 1.13.9 c поддержкой технологии HTTP/2 Server Push Печать
20.02.18 17:39

Подготовлен выпуск основной ветки высокопроизводительного HTTP-сервера nginx 1.13.9, в котором реализован механизм Server Push для протокола HTTP/2. Server Push предоставляет возможность отправки ресурсов от сервера к клиенту, не дожидаясь их явного запроса (например, подобным образом можно передавать файлы CSS, скрипты и изображения, которые необходимы для отрисовки страницы).

Для отправки push-запросов используется уже установленное клиентом соединение. Т.е. клиент подключается и запрашивает определённую страницу, после этого сервер на основании своих настроек или содержимого переданного клиентом заголовка Link сам инициирует передачу определённых ресурсов через уже установленное соединение HTTP/2, не дожидаясь запроса этих ресурсов от клиента. При этом клиент может отвергнуть попытку push-отправки, вернув флаг RST_STREAM.

Переданный через push-обращение контент сохраняется на стороне клиента в специальном кэше, ассоциированном с текущим HTTP/2-соединением. Когда в процессе обработки страницы клиент дойдёт до запроса связанных с ней ресурсов (css, js, картинки и т.п.), перед фактической отправкой каждого запроса, будет выполнена проверка в кэше. Если ресурс уже передан сервером и находится в кэше, то клиент загрузит этот ресурс из локального кэша не формируя внешний запрос к серверу. После закрытия соединения HTTP/2 содержимое кэша очищается.

При этом есть важные особенности: Глобальный кэш браузера имеет больший приоритет, чем кэш соединения HTTP/2, поэтому даже если push-запросом был передан более свежий ресурс, браузер продолжит использование ресурса из своего глобального кэша, если он не потерял актуальность (т.е. трафик будет потрачен впустую). С другой стороны, так как одно HTTP/2 соединение может обслуживать загрузку разных страниц с одного хоста, то загруженные через push ресурсы могут совместно использоваться при загрузке разных страниц.

Для управления отправкой push-запросов в новом выпуске nginx реализованы директивы:

  • "http2_push {uri}" для включения упреждающей отправки заданных ресурсов (например, "http2_push /main.css") в составе первого ответа, не дожидаясь их явного запроса. В URI допустимо использование переменных. В одном блоке конфигурации может быть задано несколько директив http2_push. Для обеспечения должного уровня защиты обрабатываются только относительные пути к ресурсу;
  • "http2_push_preload" - данные о ресурсах, которые следует передавать через Server Push, определяются на основе анализа содержимого отправляемых клиентом HTTP-заголовков Link;
  • "http2_max_concurrent_pushes" - максимально допустимое число одновременных push-запросов, сопровождающих ответ.

Кроме поддержки Server Push в nginx 1.13.9 исправлена ошибка, из-за которой в логах могли появляться сообщения "header already sent" при использовании кэша. Устранён крах (segmentation fault) рабочего процесса, который мог произойти если при использовании директивы 'ssl_verify_client' в виртуальном сервере не был указан SSL-сертификат. Внесены исправления в модули ngx_http_v2_module и ngx_http_dav_module.

Read more http://www.opennet.ru/opennews/art.shtml?num=48109