1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 5 из 5

Конспект: HTTP/2

выжимка - её можно унести в заметки

Что HTTP/2 даёт, чего не чинит и как его правильно включить.

Что даёт

Мультиплексирование в одном соединении плюс сжатие заголовков. Лимит «шесть соединений на домен» исчезает.

Что после этого стало вредным

Приём эпохи HTTP/1.1 Почему теперь мешает
доменный шардинг (img1., img2.) каждый домен - лишнее рукопожатие
склейка в один бандл правка одной строки инвалидирует весь файл в кеше
инлайн base64 в CSS раздувает файл, который иначе лежал бы в кеше отдельно

Порядок работ: включил протокол → разобрал костыли → измерил. Иначе выигрыш скромный: протокол честно ускоряет то, что ему дали, а дали ему один двухмегабайтный бандл.

Как включать

listen 443 ssl;
http2 on;              # с 1.25.1 - директива, а не флаг в listen

Разница принципиальная: старый флаг listen 443 ssl http2; включал протокол на весь сокет (всем блокам порта), директива - только на свой server-блок.

Чего HTTP/2 не чинит

Одна потеря в TCP тормозит все потоки: ядро не отдаёт приложению ничего, что пришло после потерянного сегмента. Замер, 30 файлов, задержка 100 мс, семь прогонов:

сеть HTTP/1.1 x6 HTTP/2
чистая 821 мс 814 мс
потери 3% на стороне ответов медиана 1237 мс медиана 2021, хвост 5486

То есть на чистой сети выигрыша нет вовсе, а на потерях одно соединение проигрывает шести. Это head-of-line blocking транспорта, и лечит его QUIC.

Что нельзя передать по h2

заголовок ответ
connection, keep-alive, transfer-encoding, upgrade 400
te: trailers 200
te: gzip 400

Отсюда WebSocket живёт отдельным соединением HTTP/1.1 - в логах рядом с HTTP/2.0 всегда будут строки HTTP/1.1 от /ws/.

Ловушки джокера

  • Умолчание http2 off. Убрал устаревший флаг из listen и не написал директиву - протокол пропал молча, без предупреждений.
  • Флаг в listen не отменяется директивой. Проверено: http2 off; у соседнего блока на том же порту не выключает того, что включил флаг.
  • Через curl запрет хоп-хоп-заголовков не проверить - он выбрасывает такое поле сам, показывая его в своём выводе строкой >. Нужен настоящий h2-клиент.
  • http2_push мёртв (the "http2_push" directive is obsolete, ignored), замена - early_hints on из 1.29.0.
  • Приоритеты потоков из первой редакции выкинуты, новая схема поддержана далеко не везде: порядок отдачи решает браузер.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.