让 curl 支持 HTTP/2 协议

发表于2016-12-23   8903次阅读

curl 是常用的 web 调试工具。在 7.43.0 版本(包括 libcurl)以后就开始支持 HTTP/2 协议。目前多数平台的 curl 版本比较低,还不支持 HTTP/2协议,文本讲解如何对 curl 进行升级。

可以通过如下命令查看 curl 是否支持 HTTP/2 协议:

$ curl -V

curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets

如果没有出现 http2 的字样,就表示不支持,需要重新安装。

安装

Linux 下安装

我的 CentOS 7 的 yum 源最新的 curl 只到 7.29.0,所以需要重新安装。

安装依赖环境

# yum -y install libev libev-devel zlib zlib-devel openssl openssl-devel git

下载 nghttp2 (http2 的 C 语言库) 并编译安装

# cd /var/tmp
# git clone https://github.com/tatsuhiro-t/nghttp2.git
# cd nghttp2
# autoreconf -i
# automake
# autoconf
# ./configure
# make
# make install

修改库文件路径

# echo '/usr/local/lib' > /etc/ld.so.conf.d/custom-libs.conf
# ldconfig
# ldconfig -p| grep libnghttp2
 libnghttp2.so.14 (libc6,x86-64) => /usr/local/lib/libnghttp2.so.14
 libnghttp2.so (libc6,x86-64) => /usr/local/lib/libnghttp2.so

源码安装 curl 最新版

# cd /var/tmp
# git clone https://github.com/bagder/curl.git
# cd curl
# ./buildconf
# ./configure --with-nghttp2=/usr/local

Check it.
  HTTP2 support:    enabled (nghttp2)

# make 
# make install

以上内参考自 《cURL with HTTP/2》

Mac 下安装

Mac 下用 brew 安装比较简洁

先删除就版本

$ brew install curl 

安装新版本,要追加 --with-nghttp2 选项

$ brew install curl --with-nghttp2

以上内容参考自《Using cURL with HTTP/2 on Mac OS X》

校验

curl -V
curl 7.48.0 (x86_64-apple-darwin15.4.0) libcurl/7.48.0 OpenSSL/1.0.2g zlib/1.2.5 nghttp2/1.9.1
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets 

HTTP2 字样,表示安装成功。

$ curl -I --http2 https://http2.akamai.com/demo