Чат Telegram
Группа ВКонтакте
http/2 server push - пушаем только при первом посещении

http/2 server push - пушаем только при первом посещении

В своей прошлой статье я показал реализацию http/2 server push. Однако, nghttp2 не умеет определять наличие кэша на клиенте и в приведенном примере, независимо от того, имеется ли у клиента файл, мы его пушали. Таким образом, для повторных соединений передавалось больше трафика, чем до того, как мы включили server push.

Для того, чтобы это исправить, было решено идентифицировать повторные заходы посетителей и резать заголовки «link» до передачи nghttpx. Для идентификации повторного захода решено было использовать Cookie с именем http2pushed.
Для реализации этого механизма для своего сайта я использовал Varnish, так как он у меня используется после бэкенда-nginx`а для кэширования. В директиве sub vcl_deliver добавил строки:

    # Проверяем, установлена ли кука. 
    if (req.http.Cookie ~ "http2pushed") {
        # Если да, режем все заголовки "link", передаваемые с бэкенда
        unset resp.http.link;
    } else {
        # Иначе пропускаем заголовки в неизменном виде и добавляем куку клиенту
        set resp.http.Set-Cookie = "http2pushed=true;";
    }

После чего сервер будет пушать файлы только в первый раз. К сожалению, WebPagetest не поддерживает Cookie, в связи с этим не получится сделать сравнения из дата-центра.
Приложу только 2 своих скрина. Первый визит:

Повторный заход (рефреш страницы):

loader
Об авторе проекта
Артём Ивашкевич
Артём Ивашкевич
Занимаюсь программированием более трех лет. В свободное время обучаю программированию на PHP других людей, потому что мне это нравится. Если вы интересуетесь темой IT и хотели бы стать разработчиком, рекомендую прочитать статью о том, как я стал программистом.
Комментарии (0)
Новый комментарий


Логические задачи с собеседований