Я создал каплю DigitalOcean с предустановкой «LAMP 18.04» и выполнил все обновления. Настроил новый виртуальный хост и использовал certbot для настройки HTTPS. Пока все работает нормально. Затем я попытался включить HTTP2:
a2enmod http2
Protocols h2 http/1.1
на виртуальный хост HTTPSОднако браузеры по-прежнему используют HTTP / 1.1 при подключении к сайту (с отключенным кешированием). При беге curl --http2 -v https://example.com
(домен запутан) печатается следующее:
* Connected to example.com (1.1.1.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
...
* SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
* ALPN, server accepted to use http/1.1
... And in headers:
< Upgrade: h2
< Connection: Upgrade
Более того, https://tools.keycdn.com/http2-test показывает следующее:
У меня вопрос - почему выбран http / 1.1? Кроме того, почему инструмент считает, что HTTP2 / ALPN отключен? Вот полная конфигурация VHost:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example/www
Protocols h2 http/1.1
ErrorLog ${APACHE_LOG_DIR}/example/error.log
CustomLog ${APACHE_LOG_DIR}/example/access.log combined
<IfModule mod_dir.c>
DirectoryIndex index.php index.pl index.cgi index.html index.xhtml index.htm
</IfModule>
<FilesMatch "^index\.html$">
Include no-cache.conf
</FilesMatch>
Include /etc/letsencrypt/options-ssl-apache.conf
ServerAlias www.example.com
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>
В большинстве дистрибутивов по-прежнему используется предварительная вилка. MPM. (Если вам действительно не нужно использовать mod_php с действительно дрянным древним кодом, нет причин делать это в наши дни.)
Поддержка HTTP / 2 в Apache в сочетании с prefork MPM поставляется с таким много ограничений что на практике он не предоставляет никаких преимуществ HTTP / 2. Наверное, поэтому при тестировании заголовки указывают HTTP / 2 и ALPN, offering h2
поддержка, но дальнейшее тестирование показывает неудачу.
Переключиться на другой MPM и вы должны заставить HTTP / 2 действительно работать.