Подготовлен (https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/) выпуск основной ветки высокопроизводительного HTTP-сервера nginx 1.13.9 (http://nginx.org/), в котором реализован (http://nginx.org/en/CHANGES) механизм Server Push (https://www.w3.org/TR/preload/#server-push-http-2) для протокола HTTP/2. Server Push предоставляет возможность отправки ресурсов от сервера к клиенту, не дожидаясь их явного запроса (например, подобным образом можно передавать файлы CSS, скрипты и изображения, которые необходимы для отрисовки страницы).
Для отправки push-запросов используется (https://jakearchibald.com/2017/h2-push-tougher-than-i-thought/) уже установленное клиентом соединение. Т.е. клиент подключается и запрашивает определённую страницу, после этого сервер на основании своих настроек или содержимого переданного клиентом заголовка Link сам инициирует передачу определённых ресурсов через уже установленное соединение HTTP/2, не дожидаясь запроса этих ресурсов от клиента. При этом клиент может отвергнуть попытку push-отправки, вернув флаг RST_STREAM.
Переданный через push-обращение контент сохраняется на стороне клиента в специальном кэше, ассоциированном с текущим HTTP/2-соединением. Когда в процессе обработки страницы клиент дойдёт до запроса связанных с ней ресурсов (css, js, картинки и т.п.), перед фактической отправкой каждого запроса, будет выполнена проверка в кэше. Если ресурс уже передан сервером и находится в кэше, то клиент загрузит этот ресурс из локального кэша не формируя внешний запрос к серверу. После закрытия соединения HTTP/2 содержимое кэша очищается.
При этом есть важные особенности: Глобальный кэш браузера имеет больший приоритет, чем кэш соединения HTTP/2, поэтому даже если push-запросом был передан более свежий ресурс, браузер продолжит использование ресурса из своего глобального кэша, если он не потерял актуальность (трафик потраченный на push-запрос будет потрачен в пустую). С другой стороны, так как одно HTTP/2 соединение может обслуживать загрузку разных страниц с одного хоста, то загруженные через push ресурсы могут совместно использоваться при загрузке разных страниц.
Для управления отправкой push-запросов в новом выпуске nginx реализованы директивы:
- "http2_push {uri} (https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2...)" для включения упреждающей отправки заданных ресурсов (например, "http2_push /main.css") в составе первого ответа, не дожидаясь их явного запроса. В URI допустимо использование переменных. В одном блоке конфигурации может быть задано несколько директив http2_push. Для обеспечения должного уровня защиты обрабатываются только относительные пути к ресурсу;
- "http2_push_preload (https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2...)" - данные о ресурсах, которые следует передавать через Server Push, определяются на основе анализа содержимого отправляемых клиентом HTTP-заголовков Link;
- "http2_max_concurrent_pushes (https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2...)" - максимально допустимое число одновременных push-запросов, сопровождающих ответ.
URL: https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/
Новость: http://www.opennet.ru/opennews/art.shtml?num=48109