使用http2配置的Nginx无法提供HTTP / 2


33

我的Nginx配置有问题。我已升级到nginx 1.9.6以测试http / 2,但在我的服务器上不起作用。

我用ubuntu 14.04.2 LTS

这是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

这是我的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;

/...

如果我使用最新版本的chrome浏览到我的网站,则只能通过http / 1.1进行投放。



您是否清除了浏览器缓存?从隐身窗口尝试。
JayMcTee

隐身窗口不变。我阅读了警告部分,唯一的部分是,ssl_prefer_server_ciphers但是我没有握手错误
throrin19

这是由于从Web服务器发送的标头导致的,因为您的Web服务器配置为发送HTTP / 2.0
Martin Barker

Answers:


50

我遇到了同样的问题,但我想我知道为什么会发生。nginx 1.9.6在Ubuntu 14.04上不是一个库存包,因此您可能是从nginx PPA获得的。很好,但是那些软件包是使用14.04版本的库存库(即OpenSSL 1.0.1f)构建的。不幸的是,该版本的OpenSSL不包含RFC7301 ALPN支持,而这是正确的HTTP / 2协商所必需的。它仅支持现已弃用的NPN。Chrome似乎已经删除了对NPN的支持,因此它无法在没有ALPN的情况下协商HTTP / 2连接。另一方面,Firefox 41仍具有NPN支持,您应该能够使用HTTP / 2。

您可以像这样测试服务器-您需要在客户端上安装OpenSSL 1.0.2d(运行openssl version以进行检查):

用ALPN测试:

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

如果ALPN正在运行,您应该看到:

ALPN protocol: h2

否则,您将获得:

No ALPN negotiated

使用NPN测试:

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

如果可行,您将获得:

Next protocol: (1) h2
No ALPN negotiated

这意味着它正在通过NPN成功协商HTTP / 2连接,而Firefox正是这样做的。

那么如何解决呢?我能看到的唯一方法是从PPA安装更高版本的openssl(我将用于PHP,其中也包含openssl),并构建与之链接的自己的nginx。您可以通过运行来找到现有nginx构建的配置参数nginx -V,并且应该能够使用它来构建自己的版本。

更新:我发现Chrome不支持NPN的HTTP / 2的原因不是它不支持NPN(尽管有时会被删除),而是它特别不支持h2与NPN,如chrome:// net-internals /#http2页面上所示:

Chrome HTTP / 2信息


我只是注意到您已经在运行openssl 1.0.2d-但是测试可能仍然有用。
同步2015年

我的nginx软件包使用最新的openssl版本进行编译,但是ubuntu 14.04具有过时的版本。如果我还记得的话,那是1.0.1f
throrin19

是的,那是我说的。
同步2015年

对于第一个命令,我遇到了一个错误unknown option -alpn,第二个命令运行正常
throrin19

2
在2016年底,现在的状况如何?我仍然看到nginx无法将文件作为HTTP2提供服务
vsync

3

简洁版本。

我发现在浏览计算机上打开SSL / TLS筛选后,ESET防病毒软件可以阻止HTTP / 2正常工作。检查以确保您的防病毒软件没有过滤SSL / TLS。


TLDR版本

我遇到了与海报相同的问题,但有一个有趣的转折。我将服务器配置升级到nginx 1.12.1。使用OpenSSL 1.0.2.g进行了编译,并在初步检查中“解决了” HTTP / 2无法正常工作的问题。在我的浏览器中,我可以看到服务器证书已由Let's Encrypt验证。内容也通过HTTP / 2提供。

一段时间后,我发现不再通过HTTP / 2提供相同的页面和相同的资源。巧合的是,该站点不再由Let's Encrypt验证,而是由Eset?!!?!验证。令我惊讶的是,新的http2问题与我的服务器配置完全无关。原来,我在本地计算机上的防病毒软件中启用了SSL / TLS过滤,这是造成此问题的原因。解决方案是关闭防病毒软件中的SSL / TLS过滤。一旦我将其关闭(并重新启动计算机),HTTP / 2再次起作用,并且证书再次由Let's Encrypt验证。

有关如何在ESET中关闭SSL / TLS的说明,请访问http://support.eset.com/kb3126/?locale=zh_CN


这就是我的问题。因为它在一种浏览器(没有经过防火墙过滤)中运行,但在任何其他浏览器中都无法工作,所以使我免于精神错乱
Dev

你是个超级天才。那是ESET,我花了4天的时间找到问题所在。我只是尝试了这个Linux世界中的一切可能。我简直不敢相信这是ESET,而我正在重击VPS。
Abdul Jabbar WebBestow


1

正如Synchro在回答中所说的那样,问题在于大多数nginx软件包不是使用OpenSSL 1.0.2构建的。编译ALPN要求仅在相关的OpenSSL开发源中存在符号

您可以尝试使用官方的nginx发行版,选择xenial而不是trusty。这对Debian Jessie和jessie-backports OpenSSL 1.0.2来说对我有效-可能对您有用。但是,请注意,它是不受支持的配置-重建它是“正确”的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.