web-dev-qa-db-ja.com

http2で構成されたNginxはHTTP / 2を配信しません

Nginxの設定に問題があります。 nginx 1.9.6にアップグレードしてhttp/2をテストしましたが、私のサーバーでは動作しません。

私はubuntu 14.04.2 LTSを使用しました

これはnginx -V出力です:

nginx version: nginx/1.9.6
built with OpenSSL 1.0.2d 9 Jul 2015
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-http_v2_module --with-stream --with-ipv6 --with-mail --with-mail_ssl_module --with-openssl=/build/nginx-GFP362/nginx-1.9.6/debian/openssl-1.0.2d --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-auth-pam --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-echo --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-upstream-fair --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-dav-ext-module --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-cache-purge

そして、これは私の仮想ホスト設定です:

server {
    listen         80;
    server_name    localhost;
    return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2; ## listen for ipv4; this line is default and implied

    root /var/www/rendez-vous;
    index index.phtml index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;
    ssl_certificate /etc/nginx/certificates/myeventsportal/server.crt;
    ssl_certificate_key /etc/nginx/certificates/myeventsportal/server.key;

/...

最新バージョンのChromeを使用して自分のサイトに移動すると、http/1.1でのみ提供されます。

33
throrin19

私は同じ問題に遭遇しましたが、なぜそれが起こるのか私は知っていると思います。 nginx 1.9.6はUbuntu 14.04のストックパッケージではないため、おそらく nginx PPA から取得しています。それは問題ありませんが、これらのパッケージは14.04のストックライブラリ、つまりOpenSSL 1.0.1fでビルドされています。残念ながら、そのバージョンのOpenSSLには、適切なHTTP/2ネゴシエーションに必要な RFC7301[〜#〜] alpn [〜#〜] サポートが含まれていません。現在非推奨のNPNのみをサポートしています。 ChromeはすでにNPNのサポートを削除しているため、ALPNなしでHTTP/2接続をネゴシエートすることはできません。一方、Firefox 41は引き続きNPNをサポートしており、 HTTP/2を使用してください。

このようにサーバーをテストできます-クライアントにOpenSSL 1.0.2dをインストールする必要があります(確認するにはopenssl versionを実行します):

ALPNを使用したテスト:

echo | openssl s_client -alpn h2 -connect yourserver.example.com:443 | grep ALPN

ALPNが機能している場合は、次のように表示されます。

ALPN protocol: h2

それ以外の場合は、次のようになります。

No ALPN negotiated

NPNでテストする:

echo | openssl s_client -nextprotoneg h2 -connect yourserver.example.com:443

それがうまくいけば、あなたは得るでしょう:

Next protocol: (1) h2
No ALPN negotiated

つまり、NPNを介したHTTP/2接続のネゴシエーションに成功しています。これがFirefoxの機能です。

これを解決するにはどうすればよいですか?私が見ることができる唯一の方法は、PPSからopensslの新しいビルドをインストールし(私はPHPには this one を使用し、opensslも含まれています)、それにリンクされた独自のnginxをビルドします。 nginx -Vを実行すると、既存のnginxビルドの構成パラメーターを見つけることができます。これを使用して、独自のバージョンをビルドできます。

更新:ChromeがNPNでHTTP/2をサポートしない理由はそれではないことを発見しましたそれはNPNをサポートしていません(ただし、いつか削除される予定です)が、chrome:// net-internals /#http2ページに示されているように、NPNでのh2を特にサポートしていません。

Chrome HTTP/2 info

51
Synchro

ショートバージョン

ESETアンチウイルスが、閲覧コンピューターでSSL/TLSフィルタリングがオンになっている場合にHTTP/2が機能しないことを発見しました。アンチウイルスがSSL/TLSをフィルタリングしていないことを確認します。


TLDRバージョン

私はポスターと同じ問題に遭遇しましたが、興味深いひねりを加えました。サーバー構成をnginx 1.12.1にアップグレードしました。 OpenSSL 1.0.2.gでコンパイルし、最初の検査でHTTP/2が機能しないという問題を「解決」しました。ブラウザで、サーバー証明書がLet’s Encryptによって検証されたことがわかりました。コンテンツもHTTP/2で提供されていました。

しばらくして、まったく同じページと同じリソースがHTTP/2で提供されなくなったことがわかりました。偶然にも、サイトはLet’s EncryptではなくEset?!!?!驚いたことに、新しいhttp2の問題はサーバー構成とはまったく関係がありませんでした。ローカルコンピューターのウイルス対策でSSL/TLSフィルターを有効にしていることが判明し、これが問題の原因でした。解決策は、アンチウイルスでSSL/TLSフィルタリングをオフにすることでした。いったんオフにしてコンピューターを再起動すると、HTTP/2が再び動作し、Let’s Encryptによって証明書が再度検証されました。

ESETでSSL/TLSをオフにする方法については、 http://support.eset.com/kb3126/?locale=en_US をご覧ください。

3
TryHarder

Synchroが彼の回答で述べているように、問題はほとんどのnginxパッケージがOpenSSL 1.0.2でビルドされていないことです。 ALPNのコンパイルには記号が必要 関連するOpenSSL開発ソースにのみ存在します。

公式のnginxディストリビューション を使用して、信頼できるものではなくxenialを選択してみてください。これは、Debian Jessieとjessie-backports OpenSSL 1.0.2で動作します-動作する可能性があります。ただし、これはサポートされていない構成であることに注意してください。再構築することが「正しい」答えです。

1
GreenReaper