Чат PHP-разработчиков
Логические задачи
Новогодние акции
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 своих скрина. Первый визит:

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

Присоединяйтесь к нам в ВКонтакте и в Facebook, чтобы не пропустить новые уроки. А также вступайте в наш чат PHP-разработчиков в Telegram.
Об авторе
Generic placeholder image
Артём Ивашкевич
Занимаюсь программированием более трех лет, работаю над проектами с миллионной посещаемостью. В свободное время обучаю программированию на PHP других людей, потому что мне это нравится. Если вы интересуетесь темой IT и хотели бы стать разработчиком, рекомендую прочитать статью о том, как я стал программистом.
Читайте также
Комментарии (0)