nghttp2是一个实现IETF官方HTTP/2和HPACK头压缩算法的C库,但不限如此,在C库基础上,还实现了http2的客户端,服务器,代理服务器,以及压测工具。参见官网链接
http://www.nghttp2.org/
目前最新版本是1.24.0
https://github.com/nghttp2/nghttp2/releases
网上基本上都是在Ubuntu平台上安装nghttp2,比如,我按照下面的链接在Ubuntu 16.04.1 LTS上顺利安装了nghttp2
http://www.linuxidc.com/Linux/2016-01/127588.htm
安装之前的准备
升级Autoconf 2.63到2.69
http://blog.csdn.net/tao_627/article/details/77259591
升级GCC 4.4.7到4.9.2(通过devtoolset)
http://blog.csdn.net/tao_627/article/details/77260963
sudo yum -y groupinstall "Development Tools"
sudo yum -y install openssl-devel libxml2-devel libev-devel jemalloc-devel python-devel
wget https://c-ares.haxx.se/download/c-ares-1.12.0.tar.gz -O /tmp/c-ares.tar.gz
mkdir -p /tmp/c-ares
tar -zxvf /tmp/c-ares.tar.gz -C /tmp/c-ares --strip-components=1
cd /tmp/c-ares && ./configure --libdir=/usr/lib64
make
sudo make install
wget http://www.digip.org/jansson/releases/jansson-2.9.tar.gz -O /tmp/jansson.tar.gz
mkdir -p /tmp/jansson
tar -zxvf /tmp/jansson.tar.gz -C /tmp/jansson --strip-components=1
cd /tmp/jansson && ./configure --libdir=/usr/lib64
make
make check
sudo make install
下面编译nghttp2最新版
wget https://github.com/nghttp2/nghttp2/releases/download/v1.24.0/nghttp2-1.24.0.tar.bz2
tar jxvf nghttp2-1.24.0.tar.bz2
cd nghttp2-1.24.0
./configure
make
make install
这里只是安装的库,在/usr/local/lib/libnghttp2.so,头文件在/usr/local/include/nghttp2
更新动态库
vim /etc/ld.so.conf
添加‘/usr/local/lib’
更新配置文件,执行ldconfig
注意:nghttp2本身就是一个http2的巨大宝库,这里我们仅是简单用到它的动态库。有兴趣的可以继续研究它的其它应用。
下面将nghttp2添加进curl中,使curl带有HTTP2特性
从官网下载最新版curl源码
wget https://curl.haxx.se/download/curl-7.55.1.tar.bz2
tar jxvf curl-7.55.1.tar.bz2
cd curl-7.55.1
./configure --with-nghttp2=/usr/local --with-ssl
make
make install
必要时修改环境变量
echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf
ldconfig
更新动态库
遇到的问题
在源码编译curl时,执行configure命令遇到
checking run-time libs availability... failed
configure: error: one or more libs available at link-time are not available run-time. Libs used at link-time: -lnghttp2 -lssl -lcrypto -lssl -lcrypto -lz -lrt
解决方法:
刚才安装的动态库没有刷新到系统中,导致编译curl时没有找到
vim /etc/ld.so.conf
添加‘/usr/local/lib’
更新配置文件,执行ldconfig
查找下面的库是否已经找到
ldconfig -p | grep --color libnghttp2
验证
查看 curl 版本时会发布特性中会增加 HTTP2 功能支持。此时 –http2 参数就可以正常使用了:
我们再使用如下命令测试
curl --http2 -I https://nghttp2.org/
curl --http2 -vo test.out https://nghttp2.org/
我们可以看到详细的交互信息
参考文献
http://blog.csdn.net/freewebsys/article/details/59112145
https://wzyboy.im/post/1052.html
官网RFC
https://tools.ietf.org/html/rfc7540 HTTP/2
https://tools.ietf.org/html/rfc7541 HPACK
https://tools.ietf.org/html/rfc7838 HTTP Alternative Services
其它参考资料(由浅入深)
http://www.cnblogs.com/zlingh/p/5887143.html HTTP 2.0的那些事
https://bagder.gitbooks.io/http2-explained/zh/ http2讲解
High Performanc Browser Networking(Web性能权威指南) 第12章
https://hpbn.co/http2/ 电子书最新版本