При анализе откликов на свою статью "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).
Спасибо всем, кто поучаствовал в опросе и в комментариях. Получилось познавательно, как минимум для меня.