前段时间开始, 公司各项业务开始陆续接入 http2, 关于 http2 的优点与所适用的场景网上有很多的文档可以查阅, 这里我主要是总结分享一下如何从 0 到 1 搭建 http2 服务.
这里先说明一下, 要完成 http2 的请求需要客户端和服务端同时支持, 如下表格可以看出, 只要客户端或服务端任意一端不支持 http2, 都会自动降级到 http1.1:
一, 以下为客户端 (各浏览器) 支持情况:
目前除了 Opera Mini 以及 UC Browser for Android 以外, 其他浏览器支持情况还算不错, 可是这些支持 http2 的浏览器也是有条件的, 可以看到下图中下面的 1,2,4, 主要是 2 和 4: 必须是 https 以及服务端要支持 ALPN(应用层协议协商); 详细一点的服务端要求, 请看下面.
二, 以下为服务端要求:
google 开发 SPDY 时提出了 NPN(下一代协议协商), 但随着 SPDY 被 HTTP/2 取代, google 渐渐放弃了 NPN, 而改为 ALPN(应用层协议协商); 从 chrome51 开始就移除了对 NPN 的支持, 只保留了支持 ALPN(因此服务端必须要支持 ALPN)
1)OpenSSL 需要>=1.0.2 的版本, 因为也只有 1.0.2 或以上版本的 OpenSSL 才支持 ALPN, 而遗憾的是一般的 Linux 默认内置的 OpenSSL(<1.0.2)都是不支持 ALPN 的;
2)nginx 需要>= 1.9.5, 但据说在 nginx 1.9.15 ~ 1.10.x 有 POST bug, 然后在 1.11.0 才修复了这个 BUG(详情请参阅: https://imququ.com/post/nginx-http2-post-bug.html )
三, 让网站支持 HTTP/2:
好的, 上面一和二说明了服务端与客户端的要求, 只要满足了这些要求, 就可以顺利搭建 http2 的服务;
1, 升级服务端:
1)升级 OpenSSL
下载 openssl 1.1.0(https://www.openssl.org/source/openssl-1.1.0c.tar.gz)
解压:
[root@static-mwrhc ~]# tar -zvxf openssl-1.1.0c.tar.gz
安装:
- [root@static-mwrhc ~]# cd openssl-1.1.0c
- [root@static-mwrhc openssl-1.1.0c]# ./config shared zlib
- [root@static-mwrhc openssl-1.1.0c]# make
- [root@static-mwrhc openssl-1.1.0c]# make install
备份原有的 openssl:
- [root@static-mwrhc openssl-1.1.0c]# mv /usr/bin/openssl /usr/bin/openssl.back
- [root@static-mwrhc openssl-1.1.0c]# mv /usr/include/openssl /usr/include/openssl.back
建立软链:
- [root@static-mwrhc openssl-1.1.0c]# ln -s /usr/local/bin/openssl /usr/bin/openssl
- [root@static-mwrhc openssl-1.1.0c]# ln -s /usr/local/include/openssl /usr/include/openssl
配置动态连接库:
- [root@static-mwrhc openssl-1.1.0c]# echo "/usr/local/lib64/">> /etc/ld.so.conf
- [root@static-mwrhc openssl-1.1.0c]# ldconfig
升级完成, 查看 openssl 版本:
[root@static-mwrhc openssl-1.1.0c]# openssl version
OpenSSL 1.1.0c 10 Nov 2016
2)安装新版 Nginx
安装 pcre 的 devel 依赖包:
[root@static-mwrhc nginx-1.13.9]# yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
下载 nginx-1.13.9.tar.gz(http://nginx.org/download/nginx-1.13.9.tar.gz)并解压:
[root@static-mwrhc ~]# tar -zvxf nginx-1.13.9.tar.gz
编绎:
- [root@static-mwrhc ~]# cd nginx-1.13.9
- [root@static-mwrhc nginx-1.13.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_gzip_static_module --with-pcre --with-stream --with-openssl=/root/openssl-1.1.0c[openssl 的源码路径]
- [root@static-mwrhc nginx-1.13.9]# make
如果出现以下错误:
- cc: /root/openssl-1.1.0c/lib/libssl.a: No such file or directory
- cc: /root/openssl-1.1.0c/lib/libcrypto.a: No such file or directory
- make[1]: *** [objs/nginx] Error 1
- make[1]: Leaving directory `/root/nginx-1.13.9'
- make: *** [build] Error 2
则:
- [root@static-mwrhc nginx-1.13.9]# ln -s /usr/local/lib64/libssl.a /root/openssl-1.1.0c/lib/libssl.a
- [root@static-mwrhc nginx-1.13.9]# ln -s /usr/local/lib64/libcrypto.a /root/openssl-1.1.0c/lib/libcrypto.a
然后再次执行:
- [root@static-mwrhc nginx-1.13.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_gzip_static_module --with-pcre --with-stream --with-openssl=/root/openssl-1.1.0c[openssl 的源码路径]
- [root@static-mwrhc nginx-1.13.9]# make
安装:
[root@static-mwrhc nginx-1.13.9]# make install
安装完成, 查看安装信息:
- [root@static-mwrhc nginx-1.13.9]# /usr/local/nginx/sbin/nginx -V
- nginx version: nginx/1.13.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.1.0c 10 Nov 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_gzip_static_module --with-pcre --with-stream --with-openssl=/root/openssl-1.1.0c
3)配置 Nginx
- server {
- listen 443 ssl http2;
- server_name h2.static.com;
root /apps/dat/web/working/h2.static.com;
- index index.html;
- #SSL 配置
- ssl on;
- ssl_certificate /usr/local/nginx/conf.d/server.crt;
- ssl_certificate_key /usr/local/nginx/conf.d/server.key;
- }
2, 访问站点(成功):
四, 前端调试工具:
1, 新版 chrome 支持 HTTP/2, 如果想做启动 HTTP2 的前后对比, 可以退出 chrome 浏览器后, 使用如下命令启动 Chrome, 就可以禁用 http2, 这样就会自动降级成 HTTP/1.1:
以 mac 为例, 使用命令行工具, 找到 chrome 的安装位置, 然后:/Applications/Google Chrome.app/Contents/MacOS/Google Chrome --disable-http2
2, 抓包:
目前 feddler 不支持 http2, 使用 feddler 进行抓包, 浏览器会自动降级为 http1.1
而 charles 支持 http2
来源: https://www.cnblogs.com/xueming/p/web_support_http2.html