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

Modified on: Tue, 12 Nov 2019 06:20:02 +0800

我的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提供。

最佳答案

我遇到了同样的问题,但我想我知道为什么会这样。 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 -V找到现有nginx构建的配置参数,您应该可以使用它来构建自己的版本。

更新:我发现Chrome不支持NPN与NPN的原因并不是它不支持NPN(尽管它会在某些时候被删除),但它特别不支持带有NPN的h2,如chrome:// net-internals /#http2页面所示:

作者:,Synchro

相关问答

添加新评论