web-dev-qa-db-ja.com

h2ではなくhttp / 1.1を選択するALPNネゴシエーション

「LAMP18.04」プリセットを使用してDigitalOceanドロップレットを作成し、すべての更新を行いました。新しい仮想ホストを構成し、certbotを使用してHTTPSを構成しました。これまでのところ、すべてが正常に機能していました。それから私はHTTP2を有効にしようとしました:

  • a2enmod http2
  • HTTPS仮想ホストにProtocols h2 http/1.1を追加しました

ただし、ブラウザはサイトに接続するときに引き続き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 は次のことを示しています。

screenshot from HTTP2 testing tool

私の質問は-なぜ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
Xymanek

ほとんどのディストリビューションは、デフォルトでプリフォークに設定されています [〜#〜] mpm [〜#〜] 。 (本当にくだらない古代のコードでmod_phpを使用する必要がない限り、この時代にはもう使用する理由はありません。)

プリフォークMPMと組み合わせたApacheでのHTTP/2サポートには、 多くの制限 が付属しているため、実際にはHTTP/2の利点はまったく提供されません。そのため、ヘッダーをテストするとHTTP/2とALPN, offering h2のサポートが示されますが、さらにテストすると失敗が示されます。

別のMPM に切り替えると、HTTP/2が実際に機能するようになります。

1
HBruijn