昨天一个网友通过qq联系我,说按照我博客之前分享的http2配置教程不能生效,想请我帮忙看看。
经过测试,使用谷歌浏览器访问他的测试站点,确实没有开启http2,但他的配置和编译参数都正确的,这有点奇怪了。
不过昨天太忙就没有继续帮他分析,他只好将账号和密码都留言给了我。今天中午我抽空在他服务器重新编译测试了一把,才发现原来是这么一个梗!
他在编译nginx之前,使用的是yum安装的openssl,可能是他的yum源太陈旧,或者没配置epel导致yum安装的openssl版本过低!而他在编译nginx的时候并没有使用--with-openssl=dir的选项来静态编译,所以他编出来的nginx用的系统低版本的openssl,导致谷歌访问时并不会开启http2!
找了段专业解释如下:
chrome 在最近的更新中放弃了对 npn 的支持,如果想要继续在 chrome 上支持 http/2 ,则需要安装最新 1.0.2 版的 openssl,并且用 1.0.2 的 openssl 重新编译 nginx。
所以,解决方法就非常简单了,从openssld88尊龙官网手机app官网下载最新源码包,然后新增如下参数重新编译即可:
--with-openssl=源码包解压目录
比如:
./configure --prefix=/usr/local/nginx --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-openssl=/data/openssl-1.0.2c
当然,我们也可以先更新yum源,比如改用epel源,使用 yum update openssl 升级后重新编译。这里我个人建议使用源码静态编译。
重新编译安装后,再利用谷歌浏览器访问如下网址:
测试他的网站已经成功开启http2了:
事后突然想起,其实自己之前折腾网站的时候其实遇到过同样的问题,就因为没有记录导致重复造轮子。所以这次记录分享一下,权当是备忘吧!