Nginx configurato con http2 non fornisce HTTP / 2


33

Ho un problema con la mia configurazione Nginx. Ho eseguito l'aggiornamento a nginx 1.9.6 per testare http / 2 ma non funziona sul mio server.

Ho usato Ubuntu 14.04.2 LTS

Questo è l'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

E questa è la mia configurazione del vhost:

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;

/...

Se accedo al mio sito con l'ultima versione di Chrome, viene offerto solo su http / 1.1.


1
Hai controllato la sezione avvertimenti su nginx.com/blog/nginx-1-9-5
— Drifter104

Hai cancellato la cache del browser? Prova da una finestra di navigazione in incognito.
— JayMcTee,

La finestra in incognito non cambia nulla. Ho letto la sezione di avvertimento e l'unica parte è il ssl_prefer_server_ciphersma non ho errore di stretta di mano
— throrin19

Ciò è causato dall'intestazione inviata dal server Web è il tuo server Web configurato per inviare HTTP / 2.0
— Martin Barker,

Risposte:


50

Ho appena incontrato lo stesso problema, ma penso di sapere perché succede. nginx 1.9.6 non è un pacchetto stock su Ubuntu 14.04, quindi probabilmente lo si ottiene da un PPA nginx . Va bene, ma quei pacchetti sono costruiti con le librerie di magazzino dal 14.04, vale a dire OpenSSL 1.0.1f. Sfortunatamente quella versione di OpenSSL non contiene il supporto ALPN RFC7301 necessario per una corretta negoziazione HTTP / 2; supporta solo l'NPN ora deprecato. Sembra che Chrome abbia già rimosso il supporto per NPN, quindi non è in grado di negoziare una connessione HTTP / 2 senza ALPN. Firefox 41 d'altra parte, ha ancora il supporto NPN e dovresti essere in grado di usare HTTP / 2 con quello.

Puoi testare il tuo server in questo modo - avrai bisogno di OpenSSL 1.0.2d installato sul tuo client (esegui openssl versionper verificare):

Test con ALPN:

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

Se ALPN funziona, dovresti vedere:

ALPN protocol: h2

altrimenti otterrai:

No ALPN negotiated

Test con NPN:

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

Se funziona, otterrai:

Next protocol: (1) h2
No ALPN negotiated

Ciò significa che sta negoziando con successo una connessione HTTP / 2 tramite NPN, che è ciò che fa Firefox.

Quindi come risolverlo? L'unico modo in cui posso vedere è installare una build successiva di openssl da un PPA (io uso questa per PHP, che contiene anche openssl) e creare la tua nginx collegata ad essa. Puoi trovare i parametri di configurazione per la tua build nginx esistente eseguendo nginx -Ve dovresti essere in grado di usarla per creare la tua versione.

Aggiornamento : ho scoperto che il motivo per cui Chrome non supporta HTTP / 2 con NPN non è che non supporta NPN (anche se verrà abbandonato a un certo punto), ma che in particolare non supporta h2 con NPN, come mostrato nella pagina chrome: // net-internals / # http2:

Informazioni HTTP / 2 di Chrome


Ho appena notato che stai già eseguendo openssl 1.0.2d - ma i test potrebbero ancora rivelarsi utili.
— Synchro,

Il mio pacchetto nginx è compilato con l'ultima versione di openssl ma Ubuntu 14.04 ha una versione obsoleta. Se ricordo, è 1.0.1f
— throrin19,

Sì, è quello che ho detto.
— Synchro,

Per il primo comando, ho ricevuto un errore unknown option -alpne il secondo comando funziona
— correttamente

2
Qual è lo stato di questo adesso, ai margini del 2016? Vedo ancora nginx che non pubblica file come HTTP2
— vsync il

3

Versione breve.

Ho scoperto che l'antivirus ESET può impedire il funzionamento di HTTP / 2 quando il filtro SSL / TLS è attivato sul computer di navigazione. Verifica che l'antivirus non stia filtrando SSL / TLS.


Versione TLDR

Ho riscontrato lo stesso problema del poster, ma con una svolta interessante. Ho aggiornato la configurazione del mio server a nginx 1.12.1. compilato con OpenSSL 1.0.2.g e durante l'ispezione iniziale aveva "risolto" il problema di HTTP / 2 non funzionante. Nel mio browser, ho potuto vedere che il certificato del server è stato verificato da Let's Encrypt. Anche il contenuto veniva offerto con HTTP / 2.

Qualche tempo dopo, ho scoperto che la stessa pagina e le stesse risorse non venivano più offerte su HTTP / 2. Per coincidenza, il sito non è stato più verificato da Let's Encrypt, ma da Eset? !!?! Con mia grande sorpresa, il nuovo problema http2 non aveva assolutamente nulla a che fare con la configurazione del mio server. Si è scoperto che avevo il filtro SSL / TLS attivato nel mio antivirus sul mio computer locale e questo stava causando il problema. La soluzione era disattivare il filtro SSL / TLS nell'antivirus. Una volta spento (e riavviato il computer) HTTP / 2 ha funzionato di nuovo e il certificato è stato nuovamente verificato da Let's Encrypt.

Per istruzioni su come disattivare SSL / TLS in ESET, consultare http://support.eset.com/kb3126/?locale=en_US


Questo era il problema nel mio caso. Mi ha salvato dalla follia in quanto funzionava in un browser (che non era filtrato dal firewall) ma non in nessun altro
— Dev

Sei un super genio. Era ESET e avevo trascorso i miei 4 giorni a trovare il problema. Ho appena provato tutto il possibile in questo mondo di Linux. Non riesco proprio a credere che fosse ESET e stavo martellando il mio VPS.
— Abdul Jabbar WebBestow,

1
Ho aperto un ticket di supporto su forum.eset.com/topic/…
— Abdul Jabbar WebBestow il

1

Come dice Synchro nella sua risposta, il problema è che la maggior parte dei pacchetti nginx non sono compilati con OpenSSL 1.0.2. La compilazione di ALPN richiede simboli presenti solo nella fonte di sviluppo OpenSSL pertinente.

Potresti provare a usare la distribuzione ufficiale di nginx , selezionando xenial piuttosto che fidato. Questo funziona per me con Debian Jessie e jessie-backports OpenSSL 1.0.2 - potrebbe funzionare per te. Tuttavia, tieni presente che si tratta di una configurazione non supportata: ricostruirla è la risposta "giusta".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.