Nginx dikonfigurasi dengan http2 tidak memberikan HTTP / 2

33

Saya punya masalah dengan konfigurasi Nginx saya. Saya memutakhirkan ke nginx 1.9.6 untuk menguji http / 2 tetapi tidak bekerja di server saya.

Saya menggunakan ubuntu 14.04.2 LTS

Ini adalah output 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

Dan ini adalah konfigurasi vhost saya:

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;

/...

Jika saya menavigasi ke situs saya dengan versi chrome terbaru, itu hanya dilayani melalui http / 1.1.

throrin19
sumber
1
Sudahkah Anda memeriksa bagian peringatan di nginx.com/blog/nginx-1-9-5
Drifter104
Apakah Anda menghapus cache browser Anda? Coba dari Jendela Penyamaran.
JayMcTee
Jendela penyamaran tidak mengubah apa pun. Saya membaca bagian peringatan dan satu-satunya bagian adalah ssl_prefer_server_cipherstetapi saya belum melakukan kesalahan jabat tangan
throrin19
Hal ini disebabkan oleh tajuk yang dikirim dari server web adalah server web Anda dikonfigurasi untuk mengirim HTTP / 2.0
Martin Barker

Jawaban:

50

Saya baru saja mengalami masalah yang sama, tetapi saya rasa saya tahu mengapa itu terjadi. nginx 1.9.6 bukan paket stok di Ubuntu 14.04, jadi Anda mungkin mendapatkannya dari PPA nginx . Itu bagus, tetapi paket-paket itu dibangun dengan pustaka stok mulai 14,04, yang berarti OpenSSL 1.0.1f. Sayangnya, versi OpenSSL tidak mengandung dukungan RFC7301 ALPN yang diperlukan untuk negosiasi HTTP / 2 yang tepat; itu hanya mendukung NPN yang sekarang sudah tidak digunakan lagi. Sepertinya Chrome telah menghapus dukungan untuk NPN, sehingga tidak mampu menegosiasikan koneksi HTTP / 2 tanpa ALPN. Firefox 41 di sisi lain, masih memiliki dukungan NPN dan Anda harus dapat menggunakan HTTP / 2 dengan itu.

Anda dapat menguji server Anda seperti ini - Anda perlu menginstal OpenSSL 1.0.2d pada klien Anda (jalankan openssl version untuk memeriksa):

Tes dengan ALPN:

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

Jika ALPN berfungsi, Anda harus melihat:

ALPN protocol: h2

jika tidak, Anda akan mendapatkan:

No ALPN negotiated

Tes dengan NPN:

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

Jika berhasil, Anda akan mendapatkan:

Next protocol: (1) h2
No ALPN negotiated

Itu berarti bahwa itu berhasil menegosiasikan koneksi HTTP / 2 melalui NPN, yang dilakukan oleh Firefox.

Jadi bagaimana cara mengatasinya? Satu-satunya cara saya bisa melihat adalah menginstal build kemudian dari openssl dari PPA (saya menggunakan yang ini untuk PHP, yang juga mengandung openssl) dan membangun nginx Anda sendiri yang terhubung dengannya. Anda dapat menemukan konfigurasi params untuk build nginx yang ada dengan menjalankannginx -V , dan Anda harus bisa menggunakannya untuk membangun versi Anda sendiri.

Pembaruan : Saya telah menemukan bahwa alasan Chrome tidak mendukung HTTP / 2 dengan NPN bukan karena tidak mendukung NPN (meskipun itu akan turun di beberapa titik), tetapi secara khusus tidak mendukung h2 dengan NPN, seperti yang ditunjukkan pada halaman chrome: // net-internal / # http2:

Info Chrome HTTP / 2

Sinkron
sumber
Saya baru saja memperhatikan bahwa Anda sudah menjalankan openssl 1.0.2d - tetapi tes masih terbukti bermanfaat.
Sinkronisasi 3-15
Paket nginx saya dikompilasi dengan versi openssl terbaru tetapi ubuntu 14.04 memiliki versi yang sudah ketinggalan zaman. Jika saya ingat, itu adalah 1.0.1f
throrin19
Ya, itulah yang saya katakan.
Sinkronisasi 3-15
Untuk perintah pertama, saya mendapat kesalahan unknown option -alpndan perintah kedua berfungsi dengan baik
throrin19
2
Apa status ini sekarang, di ujung 2016? Saya masih melihat nginx tidak menyajikan file sebagai HTTP2
vsync
3

Versi pendek.

Saya menemukan bahwa antivirus ESET dapat mencegah HTTP / 2 bekerja ketika penyaringan SSL / TLS dihidupkan, di komputer penelusuran. Periksa untuk melihat bahwa antivirus Anda tidak memfilter SSL / TLS.


Versi TLDR

Saya mengalami masalah yang sama seperti poster, tetapi dengan twist yang menarik. Saya memutakhirkan konfigurasi server saya ke nginx 1.12.1. dikompilasi dengan OpenSSL 1.0.2.g dan pada inspeksi awal telah "memecahkan" masalah HTTP / 2 tidak berfungsi. Di browser saya, saya dapat melihat bahwa sertifikat server telah diverifikasi oleh Let's Encrypt. Konten juga dilayani dengan HTTP / 2.

Beberapa waktu kemudian, saya menemukan bahwa halaman yang sama dan sumber daya yang sama tidak lagi dilayani melalui HTTP / 2. Secara kebetulan, situs itu tidak lagi diverifikasi oleh Let's Encrypt, tetapi oleh Eset? !!?! Yang mengherankan saya, masalah http2 baru tidak ada hubungannya dengan konfigurasi server saya sama sekali. Ternyata saya mengaktifkan filter SSL / TLS di antivirus saya di komputer lokal saya dan ini yang menyebabkan masalah. Solusinya adalah mematikan pemfilteran SSL / TLS di antivirus. Setelah saya mematikannya (dan me-reboot komputer) HTTP / 2 berfungsi lagi dan sertifikat diverifikasi oleh Let's Encrypt lagi.

Untuk instruksi tentang cara mematikan SSL / TLS di ESET, lihat http://support.eset.com/kb3126/?locale=en_US

Berusaha lebih keras
sumber
Ini adalah masalah dalam kasus saya. Menyelamatkan saya dari kegilaan karena bekerja di satu browser (yang tidak difilter oleh firewall) tetapi tidak di yang lain
Dev
Anda seorang jenius super. Itu ESET dan saya telah menghabiskan 4 hari saya dalam menemukan masalah. Saya baru saja mencoba segala yang mungkin di dunia Linux ini. Saya tidak percaya itu ESET dan saya memalu VPS saya.
Abdul Jabbar WebBestow
1
Saya telah membuka tiket dukungan di forum.eset.com/topic/…
Abdul Jabbar WebBestow
1

Seperti yang dikatakan Synchro dalam jawabannya, masalahnya adalah kebanyakan paket nginx tidak dibangun dengan OpenSSL 1.0.2. Kompilasi ALPN hanya membutuhkan simbol yang ada di sumber pengembangan OpenSSL yang relevan.

Anda dapat mencoba menggunakan distribusi nginx resmi , memilih xenial daripada dipercaya. Ini bekerja untuk saya dengan Debian Jessie dan jessie-backports OpenSSL 1.0.2 - ini bisa bekerja untuk Anda. Namun, perlu diketahui bahwa ini adalah konfigurasi yang tidak didukung - membangun kembali itu adalah jawaban yang "benar".

GreenReaper
sumber