Nginx-Quic重新编译Nginx支持HTTP3 - 青蓝鱼的博客-没有bug的代码是不完美的
Nginx-Quic重新编译Nginx支持HTTP3
侧边栏壁纸
  • 累计撰写 26 篇文章
  • 累计收到 16 条评论

Nginx-Quic重新编译Nginx支持HTTP3

admin
2022-04-11 / 0 评论 / 250 阅读 / 正在检测是否收录...

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支持检测

以下是我的博客测试的结果,如果你按照上面的方法进行了配置的话,应该也是可以成功的。
http3

本文共 823 个字数,平均阅读时长 ≈ 3分钟
0

打赏

评论 (0)

取消