# конспект · шаг 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.- Приоритеты потоков из первой редакции выкинуты, новая схема поддержана далеко не везде: порядок отдачи решает браузер.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий