Данная статья описывает процесс включения поддержки протокола HTTP/2 в Apache2 при отдаче ресурсов веб-приложения.
HTTP/2 пришел на замену HTTP/1.1, который позволяет запрашивать несколько ресурсов в рамках одного запроса. В предыдущей версии - HTTP/1.1. - каждый ресурс (css стили, картинки, скрипты) загружаются как результат отдельного запроса на сервер. Т.о. каждый ресурс загружается через свой запрос и количество запросов которое браузер способен отправить на веб-сервер в определенный момент времени ограничено. Если количество запросов велико, создается очередь из этих запросов и их обработка происходит один за другим.
HTTP/2 решает это ограничение, используся принцип потока. В рамках потока устанавливается двунаправленое общение. Через одно соединение, таких потоков может быть установлено несколько что в своб очередь позволяет передавать несколько ресурсов единовременно. Это приводит к простому факту, что ресурсы загружаются асинхронно (в параллели) что существенно ускоряет загрузку страницы в целом. Это в корне отличается от устаревшего варианта HTTP/1.1 где каждое соединение соотвествует одной паре запрос/ответ.
Все современные браузеры имеют поддержку HTTP/2, поэтому нет смысла не использовать его: https://caniuse.com/?search=http2
Все современные веб-серверы так-же имеют подержку HTTP/2, однако эта статья нацелена на Apache2.
Чтобы включить HTTP/2, следует включить соответствующий модуль:
$ sudo a2enmod http2
Теперь, нужно отредактировать файл конфигурации и задать правило общения по HTTP/2:
Protocols h2 h2c http/1.1
Данная директива может быть применена глобально, в apache2.conf файле, либо для отдельного виртуального хоста, внутри соответствующего <VirtualHost> блока.
Разберем саму директиву:
- h2 - собственно сам HTTP/2 протокол, соединение происходит посредством TLS;
- h2c - HTTP/2 протокол, используемый вне браузера, соединение происходит посредством TCP;
- http/1.1 - предыдущий http/1.1 вариант;
Протоколы обрабатываются слева-направо, т.о. в первую очередь будет попытка установить соединение по протоколу h2.
Основная разница между h2 и h2c в цели использования - h2 используется браузерами. Сайт, доступный по https, создает подключение исключительно через TLS, шифруя весь трафик. h2c - позволяет использовать https в чистом, незашифрованном, виде. Это дает возможность использовать http клиенты, такие как curl.
Перезагружаем apache2:
$ sudo /etc/init.d/apache2 restart
Чтобы проверить что браузер общается в веб-сервером посредством HTTP/2, открывает инструменты разработчика (жмем F12), переходит на вкладку Network (Сеть) и обращаем внимание на колонку Protocol (Протокол). Добавляем этот столбец если он отсутствует - щелкаем правой кнопкой мыши на любой столбец и выбираем из списка Протокол.
Современная спецификация уже определяет HTTP3, но он не поддерживается Apache2 на данный момент. Поддержка браузеров так-же пока является частичной: https://caniuse.com/?search=http3
Если сервер так-же обрабатывает PHP посредством Apache2, это обычно достигается модулем apache2 - mod_php. Такой вариант обработки PHP файлов, в силу своих особенностей, не будет работать через HTTP/2 (подробнее об этом можно узнать, познакомившись с вариантами Apache2 MPM). Простыми словами, модуль не работает по асинхронному принципу, поэтому следует перейти на подход PHP-FPM - такой вариант обработки динамических страниц имеет куда больше плюсов.
Для подробностей, следует пройтись по официальной документации (на англ. языке): https://httpd.apache.org/docs/2.4/howto/http2.html