前言
因为业务需要,服务器需要支持http2,但因为服务器的系统比较老(ubuntu 16.04),自带的curl并不支持http2协议,因此需要升级curl,下面记录下在升级过程中遇到的问题。
如何确认curl支不支持http2?
方法一,执行curl --http2
命令访问一个网址,如果提示Unsupported protocol
,则代表不支持:
curl --http2 'https://www.google.com'
curl: (1) Unsupported protocol
方法二,执行curl --version
命令,如果Features里没有HTTP2
,则代表不支持:
curl --version
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
升级curl
安装http2相关依赖
sudo apt update
sudo apt-get install nghttp2 libnghttp2-dev libssl-dev
编译安装curl
wget https://curl.se/download/curl-7.75.0.tar.gz
tar -zxvf curl-7.75.0.tar.gz
cd curl-7.75.0/
./configure --with-nghttp2 --prefix=/usr/local --with-ssl
make && sudo make install
sudo ldconfig
上面步骤,我执行完configure命令后,界面的输出是这样的:
HTTP2处显示no
,当时就觉得不对劲,但我没有理会,继续make && make install
,安装完后,执行/usr/local/bin/curl --version
命令,发现果然还是不支持http2。
因为安装的是最新版的curl,所以怀着 “有没有可能是curl版本太新,系统版本太旧导致不兼容” 的疑心,重新下载了个老一点的7.66.0版本编译安装,在configure阶段看起来好像没问题了,HTTP2处会显示enabled了:
(执行configure后的界面输出)
本来以为成功了,谁知执行/usr/local/bin/curl --version
后,界面显示:
提示curl and libcurl versions do not match
,Features里也没有显示HTTP2
观察上方的curl版本和libcurl版本号,libcurl的版本(7.75.0)和curl的版本(7.66.0)不一致,所以提示了这个错误信息。
libcurl 7.75.0应该是刚才第一次安装curl时留下的,因为第一次安装的curl版本号也是7.75.0,那有没有方法把libcurl的版本切换到7.66.0呢?
因为新版的curl是安装到/usr/local目录的,于是到/usr/local/lib目录下瞧瞧,发现有两个libcurl.so.4.x
.0
还有个libcurl.so.4是软链接到libcurl.so.4.7.0的,根据文件的上一次更新时间观测,libcurl.so.4.7.0是安装curl 7.75.0时创建的,而libcurl.so.4.6.0是安装curl 7.66.0时创建的,猜测是不是只要把libcurl.so.4的软链接改为libcurl.so.4.6.0,就可以解决问题了呢?
于是改了软链接,再次执行/usr/local/bin/curl --version
,错误提示果然没有了,Features里也有HTTP2了:
访问谷歌也不会报Unsupported protocol
了
完)