Pull to refresh

А какие версии HTTP поддерживают ваши nodejs-приложения?

Reading time3 min
Views2.2K

При анализе откликов на свою статью "HTTP/1 и HTTP/2 сервера на nodejs" пришёл к выводу, что поддержка версии HTTP/2 в настоящее время в nodejs-приложениях находится в этакой суперпозиции: с одной стороны http2-библиотека nodejs позволяет без проблем использовать HTTP/2 в своих приложениях, с другой - наиболее популярный web-сервер (express) до сих пор нативно не поддерживает HTTP/2, а другие популярные web-сервера (koa, hapi) требуют от разработчика дополнительно кодирования для работы с HTTP/2:

const http2 = require('http2');
const Koa = require('koa');
const app = new Koa();
http2.createServer(options, app.callback());

То есть, поддержка HTTP/2 есть, но не похоже, что она сильно используется.

В фокусе моих интересов на данный момент находятся Progressive Web Applications. Такие приложения в принципе не работают без шифрования трафика (http), им обязательно нужен https. Современные браузеры поддерживают HTTPS на базе HTTP/2 - с этим проблем нет. Проблема в том, что современные браузеры не поддерживают HTTP/2 без HTTPS. Для production-режима, само собой, нужно получать сертификат, подписанный доверенным центром сертификации. А что делать разработчикам или тестировщикам? В данной ситуации логично использовать HTTP/1.1 (если только ваше приложение не завязано на функционал, присущий только HTTP/2 - как Server Push, и ваше приложение в принципе может работать без шифрования, например - не использует service worker). А возможен ещё вариант, когда ваше приложение находится в "безопасной среде" и ему не нужно шифрование, а вот HTTP/2 наоборот может быть полезным (приложение за прокси сервером в виде nginx или микросервис с которым общаются другие микросервисы).

Итого, я считаю, что современные web-приложения общего назначения должы иметь возможность работать и по HTTP/1.1, и по HTTP/2, в зависимости от конфигурации стартовых параметров, но мне кажется, что в реальности дело обстоит несколько иначе. Что HTTP/2 в nodejs-приложениях распространён куда меньше, чем принято считать.

Прошу коллег, которые имеют отношение к разработке web-прложений в nodejs ответить на вопрос, вынесенный в заголовок публикации.

Спасибо за участие в опросе.

Post Scriptum

Результаты опроса явным образом показывают, что значение HTTP/2 для web-приложений на nodejs лично мной было сильно переоценено. Так половина ответивших предпочитают вообще не заморачиваться тем, какую версию HTTP поддерживает их приложение, а 20% ответили, что их полностью устраивает HTTP/1.1. То есть, в той или иной степени какое-то значение HTTP/2 для своих web-приложений придают лишь 30% опрошенных.

Я попытался понять, с чем связана низкая популярность HTTP/2 для node-приложений. Первой неожиданностью стало то, что nginx не поддерживает HTTP/2 в upstream. То есть, если мы ставим наше web-приложение за nginx и прокидываем клиентские запросы через него, то от клиента до nginx запросы идут по HTTP/2, а вот от nginx к нашему web-приложению - только по HTTP/1.1. Исключение - если наше приложение поддерживает gRPC. В этом случае от nginx к нашему приложению запросы идут по HTTP/2, потому что gRPC по HTTP/1.1 не работает.

Я предпочитаю apache, т.к. у него есть возможность "динамической" конфигурации для отдельных каталогов (приложений) через .htaccess. И apache, в отличие от nginx, умеет проксировать запросы на HTTP/2. А я считал, что nginx умеет практически всё то же самое, что и apache, только быстрее. Вот поэтому я очень удивился, что nginx HTTP/2 в upstream не умеет. Более того Google AppEngine тоже проксирует запросы только в HTTP/1.1.

С учётом того, что nginx обслуживает порядка 33% всех сайтов, а "прятать" своё web-приложение за реверс-прокси считается настолько "классической архитектурой", что альтернативные варианты всерьёз могут рассматриваться только студентами с незавершённым образованием (спасибо коллеге @FSA за потраченный коммент, я оценил) , ситуация с низкой популярностью HTTP/2 в среде web-приложений становится вполне понятной. Я полагаю, что проксирование HTTP(S)/2 (клиент) в HTTP/1.1 (приложение) среди web-серверов скорее правило, а исключением является способность apache'а проксировать HTTP(S)/2 в HTTP/2.

В то же время меня позабавила вот эта картинка:

На ней Node.js выделены в отдельный тип web-серверов. А это значит, что архитектура, когда web-приложение на базе nodejs смотрит напрямую в web не такая уж "студентческая". Более того, если смотреть на надписи по оси Y, на них стоят высоконагруженные сайты (used by high traffic sites), правда этот тип серверов пока ещё не сильно популярен (used by fewer sites по оси X).

Спасибо всем, кто поучаствовал в опросе и в комментариях. Получилось познавательно, как минимум для меня.

Only registered users can participate in poll. Log in, please.
Какие версии HTTP поддерживают ваши nodejs-приложения?
9.38% обе версии — и HTTP/1.1, и HTTP/2, в зависимости от потребностей;3
21.88% сейчас используется только HTTP/1.1, но в планах использовать также и HTTP/2;7
18.75% не вижу смысла в использовании HTTP/2, мне хватает возможностей HTTP/1.1;6
3.13% не вижу смысла в использовании HTTP/1.1, все уже давно поддерживают HTTP/2;1
15.63% используется сторонний npm-пакет (express, koa, hapi, ...), вот какая версия там есть, такая и в приложении;5
31.25% вообще не вижу смысла беспокоиться по поводу версии HTTP;10
32 users voted. 9 users abstained.
Tags:
Hubs:
Total votes 8: ↑1 and ↓7-6
Comments8

Articles