09.10.2016   3436
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 своих скрина. Первый визит:

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

Присоединяйтесь к нам в Twitter, ВКонтакте, Facebook и Google+, а также вступайте в наш чат в Telegram, чтобы не пропустить новые уроки и быть в курсе последних новостей из мира веб-разработки.