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: