Nginx configurado com http2 não fornece HTTP / 2

29

Eu tenho um problema com a configuração do Nginx. Fiz o upgrade para o nginx 1.9.6 para testar o http / 2, mas ele não funciona no meu servidor.

Eu usei o ubuntu 14.04.2 LTS

Esta é a saída 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 esta é a minha configuração 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 eu navegar para o meu site com a versão mais recente do chrome, ele será veiculado somente por http / 1.1.

    
por throrin19 29.10.2015 / 11:56

4 respostas

48

Acabei de me deparar com o mesmo problema, mas acho que sei porque acontece. O nginx 1.9.6 não é um pacote padrão no Ubuntu 14.04, então você provavelmente está obtendo de um nginx PPA . Tudo bem, mas esses pacotes são construídos com as bibliotecas de ações do 14.04, que é o OpenSSL 1.0.1f. Infelizmente essa versão do OpenSSL não contém RFC7301 ALPN suporta o que é necessário para uma negociação HTTP / 2 adequada; suporta apenas o NPN agora obsoleto. Parece que o Chrome já removeu o suporte para NPN, por isso é incapaz de negociar uma conexão HTTP / 2 sem o ALPN. O Firefox 41, por outro lado, ainda tem suporte a NPN e você deve ser capaz de usar HTTP / 2 com isso.

Você pode testar seu servidor assim: você precisará do OpenSSL 1.0.2d instalado no seu cliente (execute openssl version para verificar):

Teste com ALPN:

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

Se o ALPN estiver funcionando, você deverá ver:

ALPN protocol: h2

caso contrário você terá:

No ALPN negotiated

Teste com NPN:

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

Se isso funcionar, você receberá:

Next protocol: (1) h2
No ALPN negotiated

Isso significa que ele está negociando com sucesso uma conexão HTTP / 2 via NPN, que é o que o Firefox faz.

Então, como resolver isso? A única maneira que posso ver é instalar uma versão posterior do openssl de um PPA (eu uso este para PHP, que também contém openssl) e construa seu próprio nginx vinculado a ele. Você pode encontrar os parâmetros de configuração para sua compilação nginx existente executando nginx -V , e você deve ser capaz de usar isso para construir sua própria versão.

Atualização : descobri que o motivo pelo qual o Chrome não suporta HTTP / 2 com NPN não é que ele não suporte NPN (embora ele seja descartado em algum momento), mas que especificamente não suporta h2 com NPN, como mostrado na página chrome: // net-internals / # http2:

    
por 03.11.2015 / 13:40
3

Versão resumida.

Descobri que o antivírus da ESET pode impedir que o HTTP / 2 funcione quando o filtro SSL / TLS está ativado, no computador de navegação. Verifique se o seu antivírus não está filtrando o SSL / TLS.

Versão do TLDR

Eu tive o mesmo problema que o pôster, mas com uma reviravolta interessante. Eu atualizei a configuração do meu servidor para o nginx 1.12.1. compilado com o OpenSSL 1.0.2.g e na inspeção inicial ele “resolveu” o problema do HTTP / 2 não funcionar. No meu navegador, percebi que o certificado do servidor foi verificado por Let's Encrypt. O conteúdo também estava sendo servido com HTTP / 2.

Algum tempo depois, descobri que a mesma página e os mesmos recursos não estavam mais sendo veiculados por HTTP / 2. Coincidentemente, o site deixou de ser verificado por Let's Encrypt, mas por Eset? !!?! Para minha surpresa, o novo problema do http2 não teve nada a ver com a configuração do meu servidor. Descobri que eu tinha filtragem SSL / TLS no meu antivírus no meu computador local e isso estava causando o problema. A solução foi desativar a filtragem SSL / TLS no antivírus. Depois que eu desliguei o computador (e reiniciei o computador), o HTTP / 2 funcionou novamente e o certificado foi verificado por Let's Encrypt novamente.

Para obter instruções sobre como desativar o SSL / TLS na ESET, consulte o link

    
por 12.09.2017 / 05:19
1

Como Synchro diz em sua resposta, o problema é que a maioria dos pacotes nginx não são construídos com o OpenSSL 1.0.2. A compilação de ALPN requer símbolos presentes apenas no desenvolvimento relevante do OpenSSL fonte.

Você pode tentar usar a distribuição nginx oficial , selecionando xenial em vez de fiel. Isso funciona para mim com Debian Jessie e jessie-backports OpenSSL 1.0.2 - pode funcionar para você. No entanto, esteja ciente de que é uma configuração não suportada - a reconstrução é a resposta "certa".

    
por 13.07.2016 / 01:13
-4

Tenho certeza de que o uso do HTTP não tem nada a ver com o nginx, mas com os servidores da web, se você estiver usando o apache2, eu recomendo que você leia este site. link

Ele tem todas as informações sobre a adoção de HTTP / 2 e mostra o que eu achei correto. O apache2 não suporta HTTP / 2 por padrão ainda e você precisa de um módulo para ele, então leia esse artigo e verifique se seu servidor web está configurado.

    
por 02.11.2015 / 18:18