Переговоры по ALPN при выборе http/1.1 вместо h2
Я создал дроплет 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>
1 ответ
В большинстве дистрибутивов по-прежнему используется prefork MPM. (Если вам действительно не нужно использовать mod_php с действительно дрянным древним кодом, нет причин делать это больше в наше время.)
Поддержка HTTP/2 в Apache в сочетании с prefork MPM имеет столько ограничений, что на практике это не даст ни одного из преимуществ HTTP/2. Вероятно, поэтому при тестировании заголовки указывают HTTP/2 и ALPN, offering h2
поддержка, но дальнейшее тестирование показывает сбой.
Переключитесь на другой MPM, и вы должны получить HTTP/2 для фактической работы.