Включаем HTTP/2 в Apache2 под ubuntu server

Опубликовано oioioooi - 08/01/2022 - 17:10

Данная статья описывает процесс включения поддержки протокола 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 (Протокол). Добавляем этот столбец если он отсутствует - щелкаем правой кнопкой мыши на любой столбец и выбираем из списка Протокол.

network-http2

Современная спецификация уже определяет 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

Теги