HTTP3协议
HTTP/3 的基础即谷歌多年探索的基于 UDP 的 QUIC 协议。与 TCP 相比,使用 UDP 可以提供更大的灵活性,并且可以使 QUIC 完全于用户空间中实现——对协议实现的更新不像 TCP 那样需要绑定到操作系统更新。使用 QUIC,可以简单地将 HTTP 级别的流映射到 QUIC 流的顶部,从而继承 HTTP/2 的所有优点,而不会产生队头阻塞。HTTP/3 虽仍处于草案状态,但很多用户已经跃跃欲试。
优势
HTTP/3 利用 QUIC 加速 HTTP 请求,QUIC 提供比 TCP 和 TLS 更高的加密和性能
QUIC 是一种默认加密的新传输协议,旨在加快 HTTP 传输速度以及使其更加安全
HTTP/3 基于 UDP,如果数据包丢失,只会中断一个流,而不会中断所有流,提高了同时获取多个对象的性能
支持 0-RTT,消除服务器的 TLS 确认,使后续连接的启动速度更快.
Nginx-Quic项目
Nginx-Quic项目是Nginx官方推出的,跟上面说的Cloudflare的quiche没有关系,只是在Nginx的主线(mainline)版本的基础上推出的实验性质的项目,根据Nginx官方文档的说法,这项目是quic的分支,目前Nginx的版本为最新的Nginx 1.19.6,以后可能会将HTTP3相关功能合并进主线。正因为是实验性质项目,所以官方也不推荐在正式环境使用,但是我一个小博客,怕啥,不差这一回当小白鼠了,毕竟折腾的过程才是最有意思的。
安装相关的依赖环境
为了实现QUIC,NGINX编译必须用到quiche的相关库及BoringSSL的库文件,BoringSSL编译需要CMake 3.0或更高版本 、 需要Perl 、GCC、Clang 、Go环境。
QUICHE需要 Rust 1.38或更高版本才能构建。
CMAKE
# 前往 https://cmake.org/files/ 选择最新版本下载
wget https://cmake.org/files/v3.21/cmake-3.21.0-rc2.tar.gz
tar xvzf cmake-3.21.0-rc2.tar.gz
cd cmake-3.21.0-rc2/
./bootstrap
make
make install
PERL
# 前往 https://www.cpan.org/src/ 选择最新版本下载
wget https://www.cpan.org/src/5.0/perl-5.34.0.tar.gz
tar -xzf perl-5.34.0.tar.gz
# 编译安装
cd perl-5.34.0
./Configure -des -Dprefix=/usr/mysf
make
make test
make install
# 建立新的软链接
mv /usr/bin/perl /usr/bin/perl.bak
ln -s /usr/mysf/bin/perl /usr/bin/perl
# 检查是否安装成功
perl -v
Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Golang
wget https://golang.org/dl/go1.17.1.linux-amd64.tar.gz
tar -zxvf go1.17.1.linux-amd64.tar.gz -C /usr/local
# 修改系统默认的go文件
ln -s /usr/local/go/bin/go /usr/bin/go
#环境变量
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/home/gopath
#环境变量请根据实际情况配置,如果没有特殊要求可以使用上方指令
BoringSSL
git clone --depth=1 https://github.com/google/boringssl.git
cd boringssl
mkdir build
cd build
cmake -GNinja ..
ninja
cd ../..
mkdir -p boringssl/.openssl/lib
cp boringssl/build/crypto/libcrypto.a boringssl/build/ssl/libssl.a boringssl/.openssl/lib
cd boringssl/.openssl
ln -s ../include .
cd ../..
编译Nginx-Quic
剩下的nginx的编译安装步骤就和正常的nginx编译安装基本一致,只是需要额外的参数来开启HTTP/3支持并使用Boringssl替代默认的Openssl
Nginx-Quic分支的官网是:hg.nginx.org/nginx-quic
由于仍在开发所以没有稳定版本,前往官网后找到左侧栏中的“tar”按钮,点击下载后重命名为 nginx-quic.tar.gz 后上传到服务器即可。
#假设你已经上传nginx-quic.tar.gz
tar -zxvf nginx-quic.tar.gz
cd nginx-quic
#请根据自身需求更改下列指令参数,下方只是一个最基础的版本
./auto/configure --prefix=/www/nginx --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-http_gzip_static_module --with-cc-opt="-I../boringssl/include" --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto"
#最后编译即可
make && make install
编写配置文件
以下是一个最基础的配置文件,请根据自己的需要进行更改
server {
listen 80;
listen 443 ssl http2;
listen 443 http3 quic reuseport;
# UDP listener for QUIC+HTTP/3
server_name blog.nannan.cool;
#以下为TLS配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:P-256:P-384;
ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:EECDH+CHACHA20:EECDH+AES128;
ssl_certificate /www/nginx/ssl/blog_nannan/certificate.pem;
ssl_certificate_key /www/nginx/ssl/blog_nannan/private.key;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# 该选项用于开启address validation,但是会和下方的0-RTT冲突
#quic_retry on;
# 开启 TLS 1.3 0-RTT
ssl_early_data on;
# 添加 Early-Data 头告知后端, 防止重放攻击
proxy_set_header Early-Data $ssl_early_data;
# 参考nginx官方目前支持的http3版本,我们添加对应的header
add_header Alt-Svc 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"';
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
}
测试:
当你修改完配置文件后,请重启你的Nginx服务,然后就可以前往 Geekflare 的 HTTP3 测试工具去测试你的网站啦!
https://www.http3check.net 网站提供了网站的HTTP/3支持检测
以下是我的博客测试的结果,如果你按照上面的方法进行了配置的话,应该也是可以成功的。
本文共 823 个字数,平均阅读时长 ≈ 3分钟
评论 (0)