编译支持HTTP/2的cURL

Ubuntu 16.04的软件源所提供的curl不支持http/2。为支持http/2,需自行编译curl

为确保支持ALPN(如不支持则无法与一个现代的http服务器协商至http/2),使用OpenSSL作为SSL库。
OpenSSL要使用1.0.2或1.1.0(1.1.1_dev)版本,否则不支持ALPN

通过软件源安装curl时,它的其他依赖也被安装,且路径已在/etc/ld.so.conf中,无论编译时还是运行时都可找到并调用。故无需对其他依赖的库做任何处理


curl通过libnghttp2库来支持http/2,而许多软件源不提供这个包,故须先编译nghttp2。这在前文有提及。此次的应用仅需要libnghttp2库,而不需要那四个Application,故将编译参数改为:

./configure --prefix=/opt/nghttp2 LDFLAGS="-Wl,--rpath=/opt/nghttp2"

另注:截至文章发表,nghttp2的最新版本为1.31.0,建议使用最新版本

本例中,OpenSSL 1.1.0g则安装至/opt/openssl-1.1.0g


// 下载并解压curl源码
$ wget https://github.com/curl/curl/releases/download/curl-7_58_0/curl-7.58.0.tar.gz
$ tar zxvf curl-7.58.0.tar.gz
$ cd curl-7.58.0/

// 设置编译参数
$ ./configure --prefix=/opt/curl \
--with-ssl=/opt/openssl-1.1.0g \
--with nghttp2=/opt/nghttp2 \
LDFLAGS="-Wl,--rpath=/opt/openssl-1.1.0g/lib:/opt/nghttp2/lib"

// 编译安装(根据系统性能,合理设置N的值)
$ make -jN
# make install

若得到类似如下输出(***第一行中有nghttp2/{版本号}且Features中有HTTP2***),则说明自行编译的curl能支持http/2

$ /opt/curl/bin/curl -V
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.8 brotli/1.0.0 libssh2/1.5.0 nghttp2/1.31.0
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz brotli TLS-SRP HTTP2 UnixSockets HTTPS-proxy

注:我编译的curl中还包含其他的库,如brotli,故输出内容或不完全相同。