В общем, самым большим непосредственным преимуществом HTTP/2 является увеличение скорости, предлагаемое multiplexing для соединений с браузером, которым часто мешает низкая латентность. Это также уменьшает необходимость (и дорогое) нескольких подключений, что позволяет работать с аналогичными преимуществами производительности в HTTP/1.1.
Для внутренних подключений (например, между веб-сервером, действующим как сервер обратного прокси-сервера и сервером приложений на заднем конце) латентность обычно очень-очень низкая, поэтому преимущества скорости HTTP/2 незначительны. Кроме того, каждый сервер приложений, как правило, уже является отдельным подключением, так что здесь нет никаких выигрышей.
Итак, вы получите больше всего вашего преимущества в производительности только от поддержки HTTP/2 на краю. Это довольно распространенная настройка - аналогично тому, как HTTPS часто заканчивается на балансировщике обратного прокси/нагрузки, а не проходит весь путь.
Однако существуют потенциальные преимущества для поддержки HTTP/2 на всем протяжении пути. Например, он позволяет удалять сервер из приложения. Также потенциальные выгоды от уменьшения размера пакета для этого последнего перескока из-за двоичной природы HTTP/2 и сжатия заголовка. Хотя, как и латентность, пропускная способность обычно не является проблемой для внутренних подключений, поэтому важность этого аргумента. Наконец, некоторые утверждают, что обратный прокси делает меньше работы, подключая HTTP/2 к соединению HTTP/2, чем к соединению HTTP/1.1, поскольку нет необходимости конвертировать один протокол в другой, хотя я скептически отношусь, если это даже заметны, так как они являются отдельными соединениями (если только они не действуют просто как TCP-проход через прокси). Итак, для меня главная причина для сквозного HTTP/2 - разрешить конечный сервер Push Push. See sbordet's answer to this question (and the discussion below it) для более подробной информации.
В настоящее время серверы по-прежнему добавляют поддержку, а использование push-сервера на сервере низкое (и все еще экспериментируется для определения наилучшей практики), я бы рекомендовал только иметь HTTP/2 в конечной точке.Nginx также на момент написания не поддерживает HTTP/2 для соединений ProxyPass (хотя Apache делает) и имеет no plans to add this, и они делают интересный момент о том, может ли одно соединение HTTP/2 вводить медленность (выделение мое) :
Поддерживается ли поддержка HTTP/2 proxy в ближайшем будущем?
Короткий ответ:
Нет, нет никаких планов.
Длинный ответ:
Существует почти не имеет смысла для его реализации, так как основной HTTP 2/польза является то, что она позволяет мультиплексирование много запросов в пределах одной связи, таким образом, [почти] снятии ограничений на количество из simalteneous запросов - и нет такого ограничения при разговоре с вашими собственными бэкэндами. Более того, при использовании HTTP/2 в качестве дополнительных компонентов могут возникнуть проблемы из-за использования одного TCP-соединения вместо из нескольких.
С другой стороны, при реализации протокола HTTP/2 и запроса мультиплексирование в рамках одного соединения в восходящем модуле будет потребует значительных изменений в восходящем модуле.
В связи с вышеизложенным, нет планов по внедрению поддержки HTTP/2 в восходящем модуле, по крайней мере, в обозримом будущем. Если вы все еще думаете, что разговор с бэкендами через HTTP/2 - это что-то необходимо - не стесняйтесь предоставлять исправления.
Наконец, следует также отметить, что, хотя браузеру требуется HTTPS для HTTP/2 (h2), большинство серверов не поддерживают и не могут поддерживать этот последний переход через HTTP (h2c). Поэтому нет необходимости в шифровании с конца до конца, если этого нет в узле Node (как это часто бывает). Хотя, в зависимости от того, где сервер backend сидит HTTPS даже для этого соединения, возможно, это должно быть рассмотрено.
Спасибо за подробный ответ. Ваши комментарии к «перевод» между протоколами и общей эффективности мультиплексирования в моей настройке были в основном тем, что я искал. – Shade
Привет, не могли бы вы поделиться идеей о том, как реализовать внедрение сервера с помощью службы обратного прокси-сервера и бэкэнд-сервиса? Я попробовал nodejs с 'spdy' или собственный' http2', для обоих из них требуется, чтобы SSL работал (и похоже, что это критическое требование использовать http2 независимо от того, какой lib или платформу). Ну, у меня не возникла идея объединить обратный прокси-сервис с бэкэнд-сервисом, потому что, насколько я вижу, мы всегда используем SSL только в обратном прокси-сервисе. Однако бэкэнд-сервис говорит, что он тоже нужен. И я не могу согласиться с тем, что это отходы, чтобы сделать сквозное шифрование. – cyl19910101
Ну, для начала Nginx не поддерживает Server Push, но, если использовать Apache, то может иметь HTTP/2 для клиента, а затем HTTP/1.1 для узла. Затем, чтобы внедрить сервер, вы просто добавляете заголовок 'link' из узла в ответ. Apache, увидит ответ, увидит этот заголовок ссылки и автоматически запросит ресурс и вытолкнет его клиенту. –