2017-01-13 3 views
12

У меня есть сервер node.js, работающий за прокси-сервером nginx. node.js запускает сервер HTTP 1.1 (без SSL) на порту 3000. Оба они работают на одном сервере.HTTP2 с node.js за прокси nginx

Недавно я установил nginx для использования HTTP2 с SSL (h2). Похоже, что HTTP2 действительно включен и работает.

Тем не менее, я хочу знать, влияет ли использование прокси-соединения (nginx < -> node.js) на HTTP 1.1. То есть, я пропускаю преимущества HTTP2 с точки зрения скорости, потому что мое внутреннее соединение - HTTP 1.1?

ответ

15

В общем, самым большим непосредственным преимуществом 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 даже для этого соединения, возможно, это должно быть рассмотрено.

+1

Спасибо за подробный ответ. Ваши комментарии к «перевод» между протоколами и общей эффективности мультиплексирования в моей настройке были в основном тем, что я искал. – Shade

+0

Привет, не могли бы вы поделиться идеей о том, как реализовать внедрение сервера с помощью службы обратного прокси-сервера и бэкэнд-сервиса? Я попробовал nodejs с 'spdy' или собственный' http2', для обоих из них требуется, чтобы SSL работал (и похоже, что это критическое требование использовать http2 независимо от того, какой lib или платформу). Ну, у меня не возникла идея объединить обратный прокси-сервис с бэкэнд-сервисом, потому что, насколько я вижу, мы всегда используем SSL только в обратном прокси-сервисе. Однако бэкэнд-сервис говорит, что он тоже нужен. И я не могу согласиться с тем, что это отходы, чтобы сделать сквозное шифрование. – cyl19910101

+1

Ну, для начала Nginx не поддерживает Server Push, но, если использовать Apache, то может иметь HTTP/2 для клиента, а затем HTTP/1.1 для узла. Затем, чтобы внедрить сервер, вы просто добавляете заголовок 'link' из узла в ответ. Apache, увидит ответ, увидит этот заголовок ссылки и автоматически запросит ресурс и вытолкнет его клиенту. –

3

NGINX не поддерживает HTTP/2 в качестве клиента. Поскольку они работают на одном и том же сервере, и нет латентности или ограниченной пропускной способности, я не думаю, что это сильно изменило бы любой способ. Я бы удостоверился, что вы используете keepalives между nginx и node.js.

https://www.nginx.com/blog/tuning-nginx/#keepalive

2

Вы не теряете производительность в целом, поскольку Nginx соответствует запросу мультиплексирования браузер делает через HTTP/2 путем создания нескольких одновременных запросов к вашему узлу бэкэнду. (Одно из основных улучшений производительности HTTP/2 позволяет браузеру выполнять несколько одновременных запросов по одному и тому же соединению, тогда как в HTTP 1.1 возможен только один одновременный запрос на одно соединение, а браузеры также ограничивают количество подключений.)