HTTP/2 (изначально HTTP/2.0) — вторая крупная версия сетевого протокола HTTP, используемая для доступа к World Wide Web. HTTP/2 является первой новой версией HTTP с версии HTTP 1.1, которая была стандартизирована в 1999.
Отличия HTTP/2 от HTTP 1.1
Протокол HTTP/2 является бинарным. По сравнению с предыдущим стандартом изменены способы разбития данных на фрагменты и транспортирования их между сервером и клиентом.
В HTTP/2 сервер имеет право послать то содержимое, которое еще не было запрошено клиентом. Это позволит серверу сразу выслать дополнительные файлы, которые потребуются браузеру для отображения страниц, без необходимости анализа браузером основной страницы и запрашивания необходимых дополнений.
Также часть улучшений получена (в первом черновике HTTP/2, который представлял собой копию спецификации SPDY) за счет мультиплексирования запросов и ответов для преодоления проблемы «head-of-line blocking» протоколов HTTP 1; сжатия передаваемых заголовков и введения явной приоритизации запросов.
Небольшая книга на русском языке полностью посвящённая HTTP/2: https://bagder.gitbooks.io/http2-explained/content/ru/
Процесс включения поддержки HTTP/2 в Apache на Arch Linux достаточно прост. Предполагается, что веб-сервер у вас уже установлен. Установите необходимую зависимость:
pacman -S nghttp2
Далее откройте файл
vim /etc/httpd/conf/httpd.conf
найдите и раскомментируйте в нём строчку:
LoadModule http2_module modules/mod_http2.so
Если вы хотите включить HTTP/2 для всего сервера (для всех виртуальных хостов), то в этот же файл /etc/httpd/conf/httpd.conf добавьте строку:
Protocols h2 h2c http/1.1
h2 означает включение протокола HTTP/2 работающего только через HTTPS, h2c означает включение протокола HTTP/2 работающего только через HTTP, а http/1.1 означает поддержку HTTP 1.1.
Также можно сделать настройки для отдельных виртуальных хостов:
Protocols http/1.1 <VirtualHost ...> ServerName test.example.org Protocols h2 http/1.1 </VirtualHost>
Перезапустите сервер, чтобы изменения вступили в силу:
systemctl restart httpd.service systemctl status httpd.service
Для проверки можно воспользоваться онлайн-сервисом https://tools.keycdn.com/http2-test
Или с помощью curl:
curl -vso /dev/null https://suip.biz
Если сервер поддерживает HTTP/2, то там должны быть примерно такие строки:
* Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * TCP_NODELAY set * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
Или
curl --http2 -I -v https://suip.biz 2>&1 | grep 'server accepted to use'
Должно быть показано:
ALPN, server accepted to use h2
Решение проблемы с ошибкой «mpm module (prefork.c) is not supported by mod_http2.»
Если вы следовали данной инструкции, но у вас по каким-либо причинам не работает HTTP/2, то для выяснения проблемы включите ведение журнала для модуля http2_module. Для этого в конфигурационный файл Apache (/etc/httpd/conf/httpd.conf) добавьте строки:
<IfModule http2_module> LogLevel http2:info </IfModule>
Чтобы изменения вступили в силу, перезапустите веб-сервер:
sudo systemctl restart httpd.service
Посмотрите журнал ошибок (путь до файла /var/log/httpd/error_log у вас может быть другим):
cat /var/log/httpd/error_log | grep -i 'http2'
Пример ошибки:
[http2:warn] [pid 27833] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.
Перевод: mpm модуль (prefork.c) не поддерживается модулем mod_http2. Модуль mpm определяет, как вещи обрабатываются на вашем сервере. HTTP/2 имеет больше требований в этом отношении, и выбранный в настоящий момент mpm просто не будет делать. Это консультативное предупреждение. Ваш сервер продолжит работу, но протокол HTTP/2 будет неактивным.
Эта проблема возникла с Apache 2.4.27, Apache MPM (Multi-Processing Module) prefork больше не поддерживает HTTP/2.
Для исправления этой проблемы, выберите другой MPM: event или worker. Рекомендуют выбирать event prefork.
Если вы используете PHP, то весьма вероятно, что PHP интегрирован в Apache через модуль mod_php, который требует prefork MPM. Если вы переключитесь с preform MPM, то вам нужно использовать PHP как FastCGI. Как переключиться на php-fpm показано далее.
Подразумевается, что вы установили веб-сервер по этой инструкции, в противном случае, исходные настройки и пути до некоторых файлов могут отличаться от ваших.
Нужно начать с установки пакета php-fpm:
sudo pacman -S php-fpm
Создайте файл /etc/httpd/conf/extra/php-fpm.conf:
sudo vim /etc/httpd/conf/extra/php-fpm.conf
И скопируйте туда:
DirectoryIndex index.php index.html
<FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/" </FilesMatch>
Откройте конфигурационный файл Apache (/etc/httpd/conf/httpd.conf), вам нужно найти строку
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
и закомментировать её, чтобы получилось:
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Теперь найдите строку
#LoadModule mpm_event_module modules/mod_mpm_event.so
и раскомментируйте её, чтобы получилось:
LoadModule mpm_event_module modules/mod_mpm_event.so
Теперь найдите строку
LoadModule proxy_module modules/mod_proxy.so
и раскомментируйте её, если она закомментирована.
Найдите строку
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
и раскомментируйте её, если она закомментирована.
Найдите строку
LoadModule setenvif_module modules/mod_setenvif.so
и раскомментируйте её, если она закомментирована.
Сохраните и закройте этот файл.
Удалить файл /etc/httpd/conf/mods-enabled/php.conf, если он есть:
sudo rm /etc/httpd/conf/mods-enabled/php.conf
Создайте символьную ссылку, для активации php-fpm.conf:
ln -s /etc/httpd/conf/extra/php-fpm.conf /etc/httpd/conf/mods-enabled/php-fpm.conf
Запустите модуль php-fpm.service:
sudo systemctl restart php-fpm.service
Проверьте его статус:
systemctl status php-fpm.service
Если всё нормально, то добавьте его в автозагрузку:
sudo systemctl enable php-fpm.service
Чтобы изменения вступили в силу, перезапустите веб-сервер:
sudo systemctl restart httpd.service
Близкие статьи
- Установка LAMP (Linux, Apache, MySQL/MariaDB, PHP8 и phpMyAdmin) в Arch Linux / BlackArch (100%)
- Установка ownCloud в Arch Linux / BlackArch (100%)
- Как установить Varnish в Arch Linux — кэширование для Apache (100%)
- Как настроить Python в качестве CGI модуля в Apache на Arch Linux (Manjaro, BlackArch) (86%)
- Настройка SSH в BlackArch (64.1%)
- LEMP (Nginx, PHP, MariaDB/MySQL и phpMyAdmin) в Arch Linux: установка, создание виртуальных хостов, защита паролем папок, включение SSL (RANDOM - 64.1%)