Frage Nginx, das mit HTTP2 konfiguriert wurde, liefert HTTP / 2 nicht


Ich habe ein Problem mit meiner Nginx-Konfiguration. Ich habe auf nginx 1.9.6 aktualisiert, um http / 2 zu testen, aber auf meinem Server funktioniert es nicht.

Ich benutzte Ubuntu 14.04.2 LTS

Dies ist die nginx -V-Ausgabe:

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

Und das ist meine vhost config:

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;

/...

Wenn ich mit der neuesten Chrome-Version zu meiner Website navigiere, wird sie nur über http / 1.1 bereitgestellt.


28
2017-10-29 10:56


Ursprung


Haben Sie den Abschnitt mit den Einschränkungen gelesen? nginx.com/blog/nginx-1-9-5 - Drifter104
Haben Sie Ihren Browser-Cache gelöscht? Versuchen Sie es mit einem Inkognito-Fenster. - JayMcTee
Das Inkognito-Fenster ändert nichts. Ich lese den Vorbehalt Abschnitt und der einzige Teil ist der ssl_prefer_server_ciphers aber ich habe keinen Handshake-Fehler - throrin19
Dies wird durch den vom Webserver gesendeten Header verursacht, wenn Ihr Webserver zum Senden von HTTP / 2.0 konfiguriert ist - Martin Barker


Antworten:


Ich bin gerade auf das gleiche Problem gestoßen, aber ich denke, ich weiß, warum es passiert. nginx 1.9.6 ist kein Paket auf Ubuntu 14.04, also bekommst du es wahrscheinlich von einem nginx PPA. Das ist in Ordnung, aber diese Pakete werden mit den Archivbibliotheken von 14.04 erstellt, also OpenSSL 1.0.1f. Leider enthält diese Version von OpenSSL nicht RFC7301  ALPN Unterstützung, die für eine ordnungsgemäße HTTP / 2-Verhandlung benötigt wird; Es unterstützt nur den jetzt veralteten NPN. Es sieht so aus, als ob Chrome die Unterstützung für NPN bereits entfernt hat, sodass es keine HTTP / 2-Verbindung ohne ALPN aushandeln kann. Firefox 41 dagegen hat immer noch NPN-Unterstützung und Sie sollten HTTP / 2 damit verwenden können.

Sie können Ihren Server so testen - Sie müssen OpenSSL 1.0.2d auf Ihrem Client installiert haben (run openssl version überprüfen):

Test mit ALPN:

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

Wenn ALPN funktioniert, sollten Sie sehen:

ALPN protocol: h2

sonst bekommst du:

No ALPN negotiated

Test mit NPN:

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

Wenn das funktioniert, erhalten Sie:

Next protocol: (1) h2
No ALPN negotiated

Das bedeutet, dass es erfolgreich eine HTTP / 2-Verbindung über NPN aushandelt, was Firefox auch tut.

Also, wie löst man das? Der einzige Weg, den ich sehen kann, ist, einen späteren Build von openssl von einem PPA zu installieren (ich benutze dieses für PHP, das auch openssl enthält) und bauen Sie Ihr eigenes nginx damit verbunden auf. Sie können die Config-Parameter für Ihr bestehendes nginx-Build finden, indem Sie laufen nginx -Vund Sie sollten damit in der Lage sein, Ihre eigene Version zu erstellen.

Aktualisieren: Ich habe herausgefunden, dass der Grund, warum Chrome HTTP / 2 nicht mit NPN unterstützt, nicht darin besteht, dass es NPN nicht unterstützt (obwohl es irgendwann fallen gelassen wird), aber dass es h2 mit NPN nicht unterstützt , wie auf der chrome: // net-internals / # http2 Seite gezeigt:

Chrome HTTP/2 info


48
2017-11-03 12:40



Mir ist gerade aufgefallen, dass du openssl 1.0.2d bereits startest - aber die Tests können sich noch als nützlich erweisen. - Synchro
Mein Nginx-Paket ist mit der neuesten Openssl-Version kompiliert, aber Ubuntu 14.04 hat eine veraltete Version. Wenn ich mich erinnere, ist es die 1.0.1f - throrin19
Ja, das habe ich gesagt. - Synchro
Für den ersten Befehl habe ich einen Fehler bekommen unknown option -alpn und der zweite Befehl funktioniert gut - throrin19
Wie steht es jetzt, am Rande des Jahres 2016? Ich sehe immer noch, dass Nginx keine Dateien als HTTP2 bereitstellt - vsync


Kurze Version. 

Ich habe festgestellt, dass ESET Antivirus verhindern kann, dass HTTP / 2 funktioniert, wenn die SSL / TLS-Filterung auf dem Browsercomputer aktiviert ist. Überprüfen Sie, ob Ihr Antivirenprogramm das SSL / TLS nicht filtert.


TLDR-Version

Ich stieß auf das gleiche Problem wie das Poster, aber mit einer interessanten Wendung. Ich habe meine Serverkonfiguration auf nginx 1.12.1 aktualisiert. kompiliert mit OpenSSL 1.0.2.g und bei der ersten Inspektion hatte es das Problem von HTTP / 2 nicht "funktioniert". In meinem Browser konnte ich sehen, dass das Serverzertifikat von Let's Encrypt verifiziert wurde. Der Inhalt wurde auch mit HTTP / 2 geliefert.

Einige Zeit später stellte ich fest, dass dieselbe Seite und dieselben Ressourcen nicht mehr über HTTP / 2 bereitgestellt wurden. Zufälligerweise wurde die Seite nicht mehr von Let's Encrypt verifiziert, sondern von Eset? !!?! Zu meinem Erstaunen hatte das neue http2-Problem überhaupt nichts mit meiner Serverkonfiguration zu tun. Es stellte sich heraus, dass ich in meinem Antivirenprogramm auf meinem lokalen Computer die SSL / TLS-Filterung aktiviert hatte, wodurch das Problem verursacht wurde. Die Lösung bestand darin, die SSL / TLS-Filterung im Virenschutzprogramm zu deaktivieren. Sobald ich es ausgeschaltet hatte (und den Computer neu gestartet hatte), funktionierte HTTP / 2 wieder und das Zertifikat wurde erneut von Let's Encrypt verifiziert.

Anweisungen zum Deaktivieren von SSL / TLS in ESET finden Sie unter Auschecken http://support.eset.com/kb3126/?locale=de_DE


2
2017-09-12 03:19



Das war das Problem in meinem Fall. Rettete mich vor Wahnsinn, da es in einem Browser arbeitete (der nicht von Firewall gefiltert wurde), aber nicht in anderen - Dev


Wie Synchro in seiner Antwort sagt, ist das Problem, dass die meisten Nginx-Pakete nicht mit OpenSSL 1.0.2 erstellt werden. Die Zusammenstellung von ALPN erfordert Symbole nur in der entsprechenden OpenSSL-Entwicklungsquelle vorhanden.

Sie könnten versuchen, die offizielle Nginx-VerteilungWählen Sie xenial statt trusty. Das funktioniert bei mir mit Debian Jessie und Jessie-Backports OpenSSL 1.0.2 - es kann für dich funktionieren. Beachten Sie jedoch, dass es sich um eine nicht unterstützte Konfiguration handelt - die Wiederherstellung ist die richtige Antwort.


1
2017-07-12 23:13





Ich bin sicher, dass die Verwendung von HTTP nichts mit Nginx zu tun hat, sondern die Webserver selbst. Wenn Sie apache2 benutzen, würde ich Ihnen empfehlen, diese Seite zu lesen. https://www.gatherdigital.co.uk/blog/how-to-setup-http-2-support/527

Es enthält alle Informationen zur HTTP / 2-Einführung und zeigt, was ich für richtig hielt. Apache2 unterstützt standardmäßig noch nicht HTTP / 2 und Sie benötigen ein Modul dafür. Lesen Sie diesen Artikel und überprüfen Sie, ob Ihr Webserver konfiguriert ist.


-4
2017-11-02 17:18



Ich denke du hast das Problem nicht gelesen - throrin19
Ich habe Ihnen alle Informationen für ngix zur Verfügung gestellt, nichts darüber, wie Ihr Webserver konfiguriert ist. Schalten Sie ngix von localhost aus und verbinden Sie sich mit Ihrem Webserver auf localhost und sehen Sie, ob HTTP / 2 verwendet wird, wenn Ihr Server http / 2 nicht bedient - Martin Barker