预期版本: curl-8.4.0/curl-8.10.1
依赖版本: openssl-3.3.2/nghttp2-1.62.1/nghttp3-1.5.0
参考文档:
https://curl.se/docs/http3.html
根据官方文档和Curl的版本更新记录来看, 8.4.0 版本想通过openssl的方案支持http3是不可行的。
版本更新记录: https://curl.se/changes.html
8.6.0 版本才支持openssl-3.2用QUIC实现HTTP3:
8.6.0 版本修改HTTP3.md文件更新Diff:
从这里可以看出来,直到8.6.0版本curl库才支持了openssl+nghttp3的QUIC方案。
8.9.0 版本将QUIC的要求提高到了3.3版本:
- quic: openssl quic, cmake and doc version update to 3.3.0
- quic: require at least OpenSSL 3.3 for QUIC
8.10.0 版本修复了openssl关于quic的内存泄露:
8.10.1 版本修改了CMake编译时关于openssl的行为:
依赖环境
1 |
sudo yum install -y autoconf automake libtool pkg-config |
编译 Openssl-3.3.2:
编译 nghttp2-1.62.1:
CMake编译,只编译nghttp2,不需要动态库,只需要静态库。
1 2 3 4 5 6 7 8 9 10 11 |
wget https://github.com/ngtcp2/nghttp2/releases/download/v1.62.1/nghttp2-1.62.1.tar.gz tar -xzf nghttp2-1.62.1.tar.gz && cd nghttp2-1.62.1 mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/nghttp2-1.62.1 \ -DENABLE_LIB_ONLY=ON \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_STATIC_LIBS=ON make sudo make install |
增加一个nghttp2指向nghttp2-1.62.1的链接
1 2 |
cd /usr/local/ ln -s nghttp2-1.62.1 nghttp2 |
增加一个lib指向lib64的链接,否则curl会无法找到nghttp2。
1 2 |
cd /usr/local/nghttp2/ ln -s lib64 lib |
编译 nghttp3-1.5.0:
根据文档,http3需要依赖 nghttp3,文档里没有写需要编译ngtcp2。
同样只需要静态库, 不需要动态库。
1 2 3 4 5 6 7 8 9 10 |
wget https://github.com/ngtcp2/nghttp3/releases/download/v1.5.0/nghttp3-1.5.0.tar.gz tar -xzf nghttp3-1.5.0.tar.gz && cd nghttp3-1.5.0 autoreconf -i ./configure --prefix=/usr/local/nghttp3-1.5.0 \ --enable-lib-only \ --enable-shared=no make sudo make install |
增加一个nghttp3指向nghttp3-1.5.0的链接
1 2 |
cd /usr/local/ ln -s nghttp3-1.5.0 nghttp3 |
编译 ngtcp2-1.7.0:
我删掉了这里的编译方案。
因为预期的方案是采用 openssl+nghttp3 支持QUIC。
需要 8.10.1 及以后的版本才能实现。
编译Curl
编译 Curl-8.4.0:
8.4.0版本的编译只考虑http2,只编译静态库。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
wget https://github.com/curl/curl/releases/download/curl-8_4_0/curl-8.4.0.tar.gz tar -xzf curl-8.4.0.tar.gz && cd curl-8.4.0 autoreconf -fi LDFLAGS="-Wl,-rpath,/usr/local/openssl/lib" \ ./configure --prefix=/usr/local/curl-8.4.0 \ --with-openssl=/usr/local/openssl \ --with-nghttp2=/usr/local/nghttp2 \ --disable-shared make sudo make install |
编译 Curl-8.10.1:
8.10.1版本的编译考虑http2/http3, 只编译静态库。
这里还禁用了psl库, 该库主要提升了应用程序在处理域名、Cookie 和相关网络请求时的安全性和准确性。(我们用不上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
wget https://github.com/curl/curl/releases/download/curl-8_10_1/curl-8.10.1.tar.gz tar -xzf curl-8.10.1.tar.gz && cd curl-8.10.1 autoreconf -fi LDFLAGS="-Wl,-rpath,/usr/local/openssl/lib" \ ./configure --prefix=/usr/local/curl-8.10.1 \ --with-openssl=/usr/local/openssl \ --with-nghttp2=/usr/local/nghttp2 \ --with-nghttp3=/usr/local/nghttp3 \ --with-openssl-quic \ --disable-shared \ --without-libpsl # configure 结果 HTTP1: enabled (internal) HTTP2: enabled (nghttp2) HTTP3: enabled (openssl + nghttp3) make sudo make install |
环境配置:
通过软连接的方式将 curl 指向需要的 curl版本,这里为了测试http3, 我使用的是8.10.1版本。
1 2 |
cd /usr/local/ ln -s curl-8.10.1 curl |
修改环境变量,将以下内容添加到 ~/.bashrc
或 /etc/profile
中:
1 2 |
# curl export PATH=/usr/local/curl/bin:$PATH |
安装完毕
测试:
使用--noproxy '*'
是为了关闭代理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[root@algo-test-01 ~]# curl --noproxy '*' -I --http2 https://www.example.com HTTP/2 200 accept-ranges: bytes age: 550265 cache-control: max-age=604800 content-type: text/html; charset=UTF-8 date: Wed, 25 Sep 2024 05:22:19 GMT etag: "3147526947+gzip" expires: Wed, 02 Oct 2024 05:22:19 GMT last-modified: Thu, 17 Oct 2019 07:18:26 GMT server: ECAcc (sac/2543) x-cache: HIT content-length: 1256 [root@algo-test-01 ~]# curl --noproxy '*' -I --http3 https://www.example.com HTTP/3 200 content-encoding: gzip accept-ranges: bytes age: 470354 cache-control: max-age=604800 content-type: text/html; charset=UTF-8 date: Wed, 25 Sep 2024 05:22:24 GMT etag: "3147526947+gzip" expires: Wed, 02 Oct 2024 05:22:24 GMT last-modified: Thu, 17 Oct 2019 07:18:26 GMT server: ECAcc (sac/256B) x-cache: HIT content-length: 648 |
…