Http2 ile yapılandırılmış Nginx, HTTP / 2 sunmuyor


33

Nginx yapılandırmamla ilgili bir sorunum var. Http / 2'yi test etmek için nginx 1.9.6'ya yükselttim ancak sunucumda çalışmıyor.

Ubuntu 14.04.2 LTS kullandım

Bu nginx -V çıkışıdır:

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

Ve bu benim vhost config'im:

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;

/...

Siteme en son krom sürümüyle gidersem, yalnızca http / 1.1 üzerinden sunulur.


1
Üzerinde uyarılar bölümünü kontrol ettiniz nginx.com/blog/nginx-1-9-5
Drifter104

Tarayıcı önbelleğini mi sildin? Bir Gizli Pencereden deneyin.
JayMcTee

Gizli Pencere hiçbir şeyi değiştirmez. Uyarı bölümünü okudum ve sadece bir kısmı ssl_prefer_server_ciphersvar ama el sıkışma hatası değil
throrin19

Bunun nedeni web sunucusundan gönderilen başlık Web sunucunuz HTTP / 2.0 göndermek üzere yapılandırılmış.
Martin Barker

Yanıtlar:


50

Ben de aynı problemle karşılaştım ama sanırım neden olduğunu biliyorum. nginx 1.9.6, Ubuntu 14.04 tarihinde hisse senedi paketi değildir, bu nedenle muhtemelen bir nginx PPA ürününden alıyorsunuz . Sorun değil, ancak bu paketler 14.04'ten itibaren açık kütüphanelerle hazırlanmıştır, yani OpenSSL 1.0.1f. Ne yazık ki, OpenSSL'nin bu sürümü, uygun HTTP / 2 anlaşması için gerekli olan RFC7301 ALPN desteğini içermiyor ; yalnızca artık kullanımdan kaldırılmış NPN'i destekliyor. Chrome, NPN desteğini zaten kaldırmış gibi görünüyor, bu yüzden ALPN olmadan bir HTTP / 2 bağlantısı üzerinde anlaşma sağlayamıyor. Firefox 41 ise yine de NPN desteğine sahip ve bununla birlikte HTTP / 2 kullanabilmelisin.

Sunucunuzu bu şekilde test edebilirsiniz - istemcinizde OpenSSL 1.0.2d kurulu olmalıdır ( openssl versionkontrol etmek için çalıştırın ):

ALPN ile test edin:

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

ALPN çalışıyorsa, şunu görmelisiniz:

ALPN protocol: h2

Aksi takdirde alırsınız:

No ALPN negotiated

NPN ile test edin:

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

Bu işe yararsa, alacaksınız:

Next protocol: (1) h2
No ALPN negotiated

Bu, Firefox’un yaptığı gibi, NPN üzerinden bir HTTP / 2 bağlantısı üzerinde başarılı bir şekilde pazarlık yaptığı anlamına gelir.

Peki bu nasıl çözülür? Görebildiğim tek yolu PPA (kullandığım gelen Openssl sonraki bir yapı kurmaktır bu bir de openssl içeren PHP, için) ve kendi nginx kendisine bağlı kurmak. Mevcut nginx derlemeniz için config paragraflarını çalıştırarak bulabilirsiniz ve nginx -Vkendi versiyonunuzu oluşturmak için bunu kullanabilmelisiniz.

Güncelleme : Chrome'un NPN ile HTTP / 2'yi desteklememesinin sebebinin NPN'i desteklememesi (bir noktada düşecek olsa da) olduğunu, ancak özellikle h2'yi desteklemediğini keşfettim. NPN, chrome: // net-internals / # http2 sayfasında gösterildiği gibi:

Chrome HTTP / 2 bilgisi


Şimdilik openssl 1.0.2d'yi çalıştırdığınızı fark ettim - ancak testler yine de yararlı olabilir.
Synchro

Nginx paketim en son openssl versiyonuyla derlendi fakat ubuntu 14.04 eski bir versiyona sahip. Hatırlarsam, 1.0.1f
throrin19 13

Evet, ben de öyle dedim.
Synchro

İlk komut için bir hata aldım unknown option -alpnve ikinci komut iyi çalışıyor
throrin19 14

2
2016'nın sonunda şu an bunun durumu nedir? Nginx'in HTTP2 olarak dosya sunmadığını hala görüyorum
vsync

3

Kısa versiyon.

ESET antivirüsünün, tarayıcı bilgisayarda SSL / TLS filtresi açıldığında HTTP / 2'nin çalışmasını engelleyebileceğini öğrendim. Virüsten koruma yazılımınızın SSL / TLS'yi filtrelemediğinden emin olun.


TLDR sürümü

Poster ile aynı problemle karşılaştım ama ilginç bir twist ile. Sunucu yapılandırmamı nginx 1.12.1'e yükselttim. OpenSSL 1.0.2.g ile derlendi ve ilk incelemede çalışmaması gereken HTTP / 2 sorununu “çözdü”. Tarayıcımda, sunucu sertifikasının Let's Encrypt tarafından doğrulandığını görebiliyordum. İçerik ayrıca HTTP / 2 ile sunuluyordu.

Bir süre sonra, aynı sayfanın ve aynı kaynakların artık HTTP / 2 üzerinden sunulmadığını öğrendim. Tesadüfen, site artık Let's Encrypt tarafından değil, Eset? !!?! Şaşkınlığa uğratmak için, yeni http2 sorununun sunucu yapılandırmamla hiçbir ilgisi yoktu. Yerel bilgisayarımdaki virüsten koruma yazılımımda filtre uygulayan SSL / TLS kullandığım ortaya çıktı ve bu da soruna yol açtı. Çözüm, antivirüs içerisindeki SSL / TLS filtrelemeyi kapatmaktı. Bir kere kapattım (ve bilgisayarı yeniden başlattım) HTTP / 2 tekrar çalıştı ve sertifika yine Let's Encrypt tarafından doğrulandı.

ESET’te SSL / TLS’nin nasıl kapatılacağı hakkındaki talimatlar için http://support.eset.com/kb3126/?locale=en_US adresini ziyaret edin.


Benim durumumda sorun buydu. Tek bir tarayıcıda (güvenlik duvarı tarafından filtrelenmemiş) çalıştığı için beni delilikten
Dev

Sen süper bir dahisin. ESET'di ve 4 günümü sorunu bulmak için harcadım. Bu Linux dünyasında mümkün olan her şeyi denedim. Sadece ESET olduğuna inanamıyorum ve VPS'imi kırıyordum.
Abdul Jabbar WebBestow


1

Synchro'nun cevabında dediği gibi, konu şu ki çoğu nginx paketi OpenSSL 1.0.2 ile oluşturulmadı. ALPN'in derlenmesi sadece ilgili OpenSSL geliştirme kaynağında bulunan semboller gerektirir .

Resmi nginx dağıtımını kullanmayı deneyebilirsiniz , güvenilir değil de xenial'i seçin. Bu benim için Debian Jessie ve Jessie-OpenSSL 1.0.2 desteğiyle çalışıyor - sizin için işe yarayabilir. Ancak, desteklenmeyen bir yapılandırma olduğunu unutmayın - yeniden inşa etmek "doğru" cevaptır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.