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.
ssl_prefer_server_ciphers
tetapi saya belum melakukan kesalahan jabat tanganJawaban:
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:
Jika ALPN berfungsi, Anda harus melihat:
jika tidak, Anda akan mendapatkan:
Tes dengan NPN:
Jika berhasil, Anda akan mendapatkan:
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 menjalankan
nginx -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:
sumber
unknown option -alpn
dan perintah kedua berfungsi dengan baikVersi 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
sumber
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".
sumber