我的Nginxconfiguration有问题。 我升级到nginx 1.9.6testinghttp / 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
这是我的虚拟主机configuration:
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; /...
如果我使用最新版本的浏览器导航到我的网站,则只能通过http / 1.1提供。
我刚刚遇到同样的问题,但我想我知道为什么会发生。 nginx 1.9.6不是Ubuntu 14.04上的一个股票包,所以你可能从一个nginx PPA中得到它。 这很好,但是这些软件包是用14.04版的库文件(也就是OpenSSL 1.0.1f)构build的。 不幸的是,OpenSSL版本不包含适当的HTTP / 2协商所需的RFC7301 ALPN支持; 它只支持现在弃用的NPN。 看起来Chrome已经取消了对NPN的支持,所以它不能在没有ALPN的情况下协商HTTP / 2连接。 另一方面,Firefox 41仍然支持NPN,你应该可以使用HTTP / 2。
你可以像这样testing你的服务器 – 你需要在你的客户端上安装OpenSSL 1.0.2d(运行openssl version
来检查):
用ALPNtesting:
echo | openssl s_client -alpn h2 -connect yourserver.example.com:443 | grep ALPN
如果ALPN正在工作,您应该看到:
ALPN protocol: h2
否则你会得到:
No ALPN negotiated
NPNtesting:
echo | openssl s_client -nextprotoneg h2 -connect yourserver.example.com:443
如果这样做,你会得到:
Next protocol: (1) h2 No ALPN negotiated
这意味着它正在通过NPN成功地协商HTTP / 2连接,而这正是Firefox所做的。
那么如何解决这个问题? 我能看到的唯一方法就是从PPA安装一个以后版本的openssl(我使用这个也包含openssl的PHP),然后构build你自己的链接到它的nginx。 你可以通过运行nginx -V
来find你现有的nginx版本的configuration参数,你应该可以使用它来构build你自己的版本。
更新 :我发现Chrome不支持NPN的HTTP / 2的原因并不是它不支持NPN(虽然它会在某些时候被丢弃),但是它并不支持h2 NPN,如chrome:// net-internals /#http2页面所示:
正如Synchro在他的回答中所说,问题在于大多数nginx包不是用OpenSSL 1.0.2构build的。 编译ALPN需要符号只出现在相关的OpenSSL开发源代码中。
你可以尝试使用官方的nginx发行版 ,selectxenial而不是trusty。 这对Debian Jessie和jessie-backports OpenSSL 1.0.2来说是有效的,它可能适用于你。 但是,请注意,这是一个不受支持的configuration – 重build它是“正确的”答案。
短版。
我发现ESET防病毒可以防止在浏览计算机上打开SSL / TLS筛选时HTTP / 2工作。 检查您的防病毒是否不过滤SSL / TLS。
TLDR版本
我碰到了和海报一样的问题,但有一个有趣的转折。 我升级了我的服务器configuration到nginx 1.12.1。 使用OpenSSL 1.0.2.g进行编译,并在初步检查中“解决了”HTTP / 2无法正常工作的问题。 在我的浏览器中,我可以看到服务器证书由Let's Encryptvalidation。 内容也被用于HTTP / 2。
过了一段时间,我发现HTTP / 2不再提供相同的页面和资源。 巧合的是,这个网站不再被Let's Encryptvalidation,而是被Eset?!!? 令我惊讶的是,新的http2问题与我的服务器configuration完全无关。 事实certificate,我的防病毒在我的本地计算机上有SSL / TLS筛选,这是造成这个问题。 解决scheme是closures防病毒中的SSL / TLS筛选。 一旦我closures了电脑(并重新启动计算机),HTTP / 2再次工作,证书再次由Let's Encryptvalidation。
有关如何closuresESET中的SSL / TLS的说明,请查看http://support.eset.com/kb3126/?locale=zh_CN
我确定HTTP的使用与nginx没有任何关系,但是如果你使用apache2,那么web服务器是自我的,我build议你阅读这个网站。 https://www.gatherdigital.co.uk/blog/how-to-setup-http-2-support/527
它具有有关HTTP / 2采用的所有信息,并显示我认为是正确的apache2默认不支持HTTP / 2,而您需要一个模块,因此请阅读该文章并检查您的Web服务器是否已configuration。