最近给三叶运维全站开启了 https,所以对这块关注比较多。昨天脑补的时候发现 http2.0 只支持 SSL 加密的网站,即 https。于是心血来潮,给三叶运维开启了 http 2.0,尝尝鲜。
查了下资料,发现 Nginx 不久前发布的 1.9.5 版本支持 http2.0,而 1.8.x 时代只是对 SPDY 进行了支持。一直用的 1.62 稳定版,此次为了测试 http2.0,直接进行了版本跳跃,升级到了 1.9.5 版本,下面简单的分享下部署分解。
Ps:特别说明的是,http2.0 只支持开启了 https 的网站,所以没开启 https 的网站就只能看看了!
一、编译 Nginx
编译 Nginx 是我博客老生常谈的问题,之前都不想赘述的内容,这次还是耐着性子说一下在已有 Nginx 的服务器上重新编译一个 Nginx 的做法。
①、下载 Nginx 最新版
目前 Nginx 最新版是今年 11 月份发布的 1.9.7 版本,反正 1.9+是没有稳定版,所以干脆弄个最新版:
1
2
|
cd /usr/local/src
wget http://nginx.org/download/nginx-1.9.7.tar.gz
|
话说 1.9+版本还支持 TCP 负载均衡呢,感兴趣的可以看下三叶运维之前的分享:
②、编译 Nginx
在已有环境下编译 Nginx,一般做法是先取得目前运行的 Nginx 的运行参数,然后在这个参数的基础上加上本次编译想新增的参数即可。所以,我们先执行 nginx -V 查看它的编译参数是什么:
1
2
3
4
5
|
[root@MyAlyServer src]# /usr/local/nginx/sbin/nginx -V
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --add-module=../ngx_cache_purge-2.3
|
可以看到三叶运维目前用的是 1.6.2 版本,当然也是淘宝定制过的 Tengine。
如果你发现参数里面也存在 --add-module=../xxx 这种使用相对路径的参数,就得注意了。你重新编译的时候得保证新的 Nginx 编译文件夹的相对路径存在对应的模块,否则请重新指定一个正确的路径,比如上面代码中出现的 ngx_cache_purge-2.3,否则会提示找不到路径啦!
既然知道了老的 Nginx 的编译参数,那么直接按照下面操作,解压、编译、平滑升级搞定 Nginx1.9x:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#解压
tar zxvf nginx-1.9.7.tar.gz
#进入源码目录
cd nginx-1.9.7
#编译,在已有Nginx编译参数前面加上 ./configure ,并在最后加一个激活 http 2.0 模块的参数
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --add-module=../ngx_cache_purge-2.3 --with-http_v2_module
#编译完成,如果没有报错(可以运行一下 echo $? 查看输出是不是 0 ),直接make,这里会需要几分钟左右。
make
#平滑升级,先移走现有的nginx 二进制文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
#然后复制新生成的Nginx二进制文件到sbin目录
cp objs/nginx /usr/local/nginx/sbin
#最后执行升级命令
make upgrade
#若有报错可以尝试使用如下命令重启下Nginx,当然如果是配置错误那就得另外检查了
killall -9 nginx && /usr/local/nginx/sbin/nginx
|
二、配置 http2.0
配置 Nginx 开启 http 2.0 特别简单,只要在 Nginx 配置文件中找到你要开启 http2.0 的域名 server 模块,然后将 listen 443 ssl;改成 listen 443 ssl http2; 即可。
比如,三叶运维之前的 Server 模块配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
server
{
listen 443 ssl;
ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
ssl_certificate_key /usr/local/nginx/ssl/zhangge.net.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
ssl_prefer_server_ciphers on;
server_name zhangge.net;
#以下内容略
|
直接改成:
1
2
3
4
5
6
7
8
9
10
11
|
server
{
listen 443 ssl http2; #加一个http2即可
ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
ssl_certificate_key /usr/local/nginx/ssl/zhangge.net.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;//SSL协议版本需新增TLSv1.1 TLSv1.2否则http2.0访问无法打开!
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
ssl_prefer_server_ciphers on;
server_name zhangge.net;
|
Tips:开启 http2.0 后,谷歌浏览器无法访问,显示如下信息?
无法显示此网页
ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
网址为 https://zhangge.net/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。
吐下苦水,三叶运维配置好 http2.0 之后,得知谷歌浏览器支持 http2.0,于是访问看了下,居然提示以上错误!关掉 http2 之后,又正常了!!搜遍了都没找到为什么!最终,鬼使神差的把 SSL 额外配置全部屏蔽,只剩下指定证书和 key 部分,发现居然好了?
后来发现 Nginx 官方给出的 SSL 中都用到了 TLSv1.2,而我的配置还停留在 TLSV1!
保存配置文件之后,重启或重载 Nginx 即可生效:/usr/local/nginx/sbin/nginx -s reload
三、测试 http2.0
配是配好了,到底有没有生效呢?还需要测试下才行。
①、在线测试[乌龙了]
直接访问 https://spdycheck.org/#你的域名 即可测试是否成功开启 http2.0:
比如访问:https://spdycheck.org/#zhangge.net,可以看到如下信息:
发现居然是 SPDY 有木有?想了半天为什么,才想起来我用了腾讯云的 CDN,这个 SPDY 肯定是腾讯云 CDN 为了优化 https 启用的!跟上文的操作没有半毛钱关系!所以,目前三叶运维虽然开启了 http2.0,但是走了 CDN 之后,就只有 SPDY 了,本次权当测试。。。
于是,试着搜了下 http2 check,没想到还真有!不过可惜功能不可用,测任何网站都是失败:
②、浏览器测试
看来要得到确切的结果,还得借助谷歌、火狐等浏览器了。
打开谷歌浏览器,先访问一下你的网站,比如访问下三叶运维
然后,在谷歌浏览器地址栏输入 chrome://net-internals/#http2 并回车,列表里面即为已支持 http2.0 的域名:
没错,开启成功!
进一步看一下 Nginx 日志,可以很明显的发现刚刚的访问是走的 http2.0 协议:
四、简单总结
上文仅仅是简单配置,http2.0 其实还有其他几个优化参数,感兴趣的朋友可以前往 Nginx 官方文档查看:http://nginx.org/en/docs/http/ngx_http_v2_module.html
http2.0 是下一代 http 协议,现在还没普及,而且大部分浏览器都不支持使用 http2.0 访问。只有少数浏览器,比如谷歌、火狐,貌似 IE10 也在蠢蠢欲动,具体行不行有待测试。所以,测试这个功能也只是抱着尝鲜和学习的目的。
对 http2.0 感兴趣,并希望了解 http2.0 优点特性的朋友,可以看下开源中国对 http2.0 的详细介绍。当然,网上还有很多对 HTTP1.0、SPDY 及 HTTP2.0 详细测试对比的技术文章,都可以很明显看出 http2.0 绝对是以后互联网的主流趋势!
开启 http2.0 的前提是你的网站已经支持了 https,所以开启 https 是第一步!
以下是相关文章:
不长不短,又是一篇折腾分享,希望你能用得上~