web-dev-qa-db-fra.com

Nginx configuré avec http2 ne fournit pas HTTP / 2

J'ai un problème avec ma configuration Nginx. J'ai mis à niveau vers nginx 1.9.6 pour tester http/2 mais cela ne fonctionne pas sur mon serveur.

J'ai utilisé ubuntu 14.04.2 LTS

Voici la sortie 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

Et voici ma configuration 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;

/...

Si je navigue sur mon site avec la dernière version de Chrome, il n'est servi que sur http/1.1.

33
throrin19

Je viens de rencontrer le même problème, mais je pense que je sais pourquoi cela se produit. nginx 1.9.6 n'est pas un paquet standard sur Ubuntu 14.04, donc vous l'obtenez probablement à partir d'un nginx PPA . C'est bien, mais ces packages sont construits avec les bibliothèques de stock à partir de 14.04, c'est-à-dire OpenSSL 1.0.1f. Malheureusement, cette version d'OpenSSL ne contient pas RFC7301 ALPN le support qui est nécessaire pour une négociation HTTP/2 appropriée; il ne prend en charge que le NPN désormais obsolète. Il semble que Chrome a déjà supprimé la prise en charge de NPN, il est donc incapable de négocier une connexion HTTP/2 sans ALPN. Firefox 41 d'autre part, a toujours la prise en charge NPN et vous devriez pouvoir utilisez HTTP/2 avec cela.

Vous pouvez tester votre serveur comme ceci - vous aurez besoin d'OpenSSL 1.0.2d installé sur votre client (exécutez openssl version vérifier):

Test avec ALPN:

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

Si ALPN fonctionne, vous devriez voir:

ALPN protocol: h2

sinon vous obtiendrez:

No ALPN negotiated

Test avec NPN:

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

Si cela fonctionne, vous obtiendrez:

Next protocol: (1) h2
No ALPN negotiated

Cela signifie qu'il négocie avec succès une connexion HTTP/2 via NPN, ce que fait Firefox.

Alors comment résoudre ça? La seule façon que je peux voir est d'installer une version ultérieure de openssl à partir d'un PPA (j'utilise celui-ci pour PHP, qui contient également openssl) et de construire votre propre nginx qui lui est lié. Vous pouvez trouver les paramètres de configuration pour votre build nginx existant en exécutant nginx -V, et vous devriez pouvoir l'utiliser pour créer votre propre version.

Mise à jour : J'ai découvert que la raison pour laquelle Chrome ne prend pas en charge HTTP/2 avec NPN n'est pas il ne prend pas en charge NPN (bien qu'il sera supprimé à un moment donné), mais qu'il ne prend pas spécifiquement en charge h2 avec NPN, comme indiqué sur la page chrome: // net-internals/# http2:

Chrome HTTP/2 info

51
Synchro

Version courte.

J'ai constaté que l'antivirus ESET peut empêcher HTTP/2 de fonctionner lorsque le filtrage SSL/TLS est activé, sur l'ordinateur parcourant. Vérifiez que votre antivirus ne filtre pas SSL/TLS.


Version TLDR

J'ai rencontré le même problème que l'affiche, mais avec une touche intéressante. J'ai mis à niveau ma configuration de serveur vers nginx 1.12.1. compilé avec OpenSSL 1.0.2.g et lors de l'inspection initiale, il avait "résolu" le problème de HTTP/2 ne fonctionnant pas. Dans mon navigateur, j'ai pu voir que le certificat du serveur avait été vérifié par Let's Encrypt. Le contenu était également diffusé avec HTTP/2.

Quelque temps plus tard, j'ai constaté que la même page et les mêmes ressources n'étaient plus servies via HTTP/2. Par coïncidence, le site n'était plus vérifié par Let's Encrypt, mais par Eset? !!?! À ma grande surprise, le nouveau problème http2 n'avait rien à voir avec la configuration de mon serveur. Il s'est avéré que j'avais un filtrage SSL/TLS dans mon antivirus sur mon ordinateur local et cela causait le problème. La solution était de désactiver le filtrage SSL/TLS dans l'antivirus. Une fois que je l'ai éteint (et redémarré l'ordinateur), HTTP/2 a de nouveau fonctionné et le certificat a été vérifié à nouveau par Let’s Encrypt.

Pour obtenir des instructions sur la façon de désactiver SSL/TLS dans ESET, consultez http://support.eset.com/kb3126/?locale=en_US

3
TryHarder

Comme Synchro le dit dans sa réponse, le problème est que la plupart des packages nginx ne sont pas construits avec OpenSSL 1.0.2. La compilation d'ALPN nécessite des symboles uniquement présent dans la source de développement OpenSSL pertinente.

Vous pouvez essayer d'utiliser la distribution officielle de nginx , en sélectionnant xenial plutôt que fidèle. Cela fonctionne pour moi avec Debian Jessie et jessie-backports OpenSSL 1.0.2 - cela peut fonctionner pour vous. Cependant, sachez qu'il s'agit d'une configuration non prise en charge - la reconstruire est la "bonne" réponse.

1
GreenReaper