You are here: Home » Без рубрики » Включение HTTP/2 в Apache на Arch Linux

Включение HTTP/2 в Apache на Arch Linux

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

11

Или с помощью 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *