科普文:软件架构Nginx系列之【Nginx 1.25.0支持HTTP/3:QUIC】

384 篇文章 1 订阅
345 篇文章 1 订阅

概叙

日前Nginx发布了主线版本 1.25.0,该版本引入了对QUIC 和HTTP/3协议的支持,Nginx正式跨入HTTP/3时代。从1.25.0开始,QUIC和HTTP/3在Linux二进制包中启用。

QUIC和HTTP/3支持是实验性的,需要用户酌情使用。

科普文:详解HTTP3.0协议和QUIC协议-CSDN博客

Nginx在编译时需要配置相应的SSL库,以确保能够支持HTTP3.0和HTTP2.0等基于HTTPS的协议。这些加密算法主要由OpenSSL提供。

另外,BoringSSL是谷歌创建的OpenSSL分支,专门用于支持TLS 1.3的UDP协议的0-RTT数据传输加密算法。BoringSSL的特点在于其与OpenSSL的高度兼容性和同步性,一些改进和特性会逐步融入到OpenSSL中。

Nginx从1.25版本开始正式支持QUIC和HTTP/3协议。

特别是从1.25.0版本开始,Linux环境下的Nginx二进制包就已经内建了QUIC和HTTP/3的支持。然而,这些新支持的协议目前仍处于实验性阶段,因此可能需要用户自行配置和编译Nginx以实现使用。

Nginx 自从 1.25.X 主线版开始就已经支持 HTTP/3 QUIC 了,这次 Nginx 1.26.0 算是进一步完善了 HTTP/3 QUIC,要在 Nginx1.26.0 里开启 HTTP/3 QUIC 支持,我们只需要升级到 Nginx 1.26.0 的时候加入--with-http_v3_module这个编译参数即可,像 LNMP 一键安装包、宝塔面板里都是如此。注意,默认升级 Nginx 1.26.0 是没有这个编译参数的,必须要手动添加这个参数。参加这个参数后编译升级 Nginx 过程会相对增加,所以大家耐心等待即可。

官方提供了三种SSL库供用户选择,具体可参见Nginx官方文档中的相关内容 https://nginx.org/en/docs/quic.html 在选择SSL库时,

如果用户希望充分利用QUIC和HTTP/3的特性,建议使用专门为这些协议设计的SSL库,如BoringSSL、LibreSSL或QuicTLS。

如果不使用这些专用的SSL库,Nginx将退回到使用OpenSSL的兼容层,可能会在某些功能上有所限制或无法实现完全的支持。

我这里使用BoringSSL来演示。

Nginx 1.25 安装

HTTP/3支持具体支持由ngx_http_v3_module模块提供。对于源码编译版本需要用户自行启用该模块:--with-http_v3_module   编译参数启用。

HTTP/3的支持需要底层SSL库提供编译和运行时支持,Nginx官方建议通过BoringSSL,LibreSSL或者QuicTLS来提供支持。OpenSSL虽然也可以支持,但是不兼容早期的数据。

编译安装BoringSSL

# 下载boringssl库
git clone --depth=1 https://github.com/google/boringssl.git

#安装相关依赖

apt-get update
apt-get install -y build-essential cmake
add-apt-repository ppa:longsleep/golang-backports
apt-get update
apt-get install -y openssl golang-go libpcre3 libpcre3-dev libssl-dev zlib1g-dev

#编译BoringSSL
cd boringssl && mkdir build && cd build && cmake .. && make && cd ../../

编译安装Nginx 1.25

截止到2024年1月,Nginx目前最新版本为1.25.3

#下载Nginx源码包
wget https://nginx.org/download/nginx-1.25.3.tar.gz
tar xvf nginx-1.25.3.tar.gz
useradd nginx -s /sbin/nologin -M


#编译安装nginx
./configure  --prefix=/usr/local/nginx \
    --with-debug \
    --with-http_v3_module \
    --with-http_v2_module \
    --with-cc-opt="-I../boringssl/include"    --with-ld-opt="-L../boringssl/build/ssl  -L../boringssl/build/crypto"

make && make install



#对QuicTLS配置:

./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I../quictls/build/include"
--with-ld-opt="-L../quictls/build/lib"

#或者LibreSSL:
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I../libressl/build/include"
--with-ld-opt="-L../libressl/build/lib"

配置后,使用make编译安装的。

检查Nginx模块

配置Nginx

# 配置文件中省略了部分默认内容。
user  nginx;
worker_processes  1;

events {
    worker_connections  65535;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $http3';
    access_log logs/access.log quic;

    
    server {
        listen       443 quic reuseport; 	# 启用 quic 协议
        listen       443 ssl; 				# 启用 http2 协议浏览器不支持 http3 时,可以选择 http2
        server_name  www.example.com;		

        ssl_protocols       TLSv1.3;  # QUIC requires TLS 1.3 #支持tls协议1.3
        ssl_certificate      /usr/local/nginx/ssl/www.example.com/cert.pem;
        ssl_certificate_key  /usr/local/nginx/ssl/www.example.com/cert.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        # 这个是告知客户端支持H3,需要这个才会访问到H3
        add_header Alt-Svc 'h3=":443"; ma=86400'; 
        # Alt-Svc 全称为 “Alternative-Service”,直译为“备选服务”。该头部列举了当前站点备选的访问方式列表,让服务器可以告诉客户端 “看,我在这个主机的这个端口用这个协议提供相同的服务”。一般用于在提供 “QUIC” 等新兴协议支持的同时,实现向下兼容
        location / {

            root   html;
            index  index.html index.htm;
        }
    }
}

listen指令中的ngx_http_core_module模块有一个新参数快它在指定端口上启用HTTP/3 over QUIC。

quic参数也可以指定重用端口参数以使其与多个worker一起正常工作。有关指令列表,详见 ngx_http_v3_module说明。

启用地址验证:

quic_retry on;

启用0-RTT:

ssl_early_data on;

启用GSO (通用分段卸载):

quic_gso on;

设定主机证书:

quic_host_key <filename>;

QUIC启用需要默认ssl_protocols指令指定为TLSv1.3协议。

默认情况下,GSO Linux特定优化被禁用。如果配置了相应的网络接口,请启用它支持GSO。

验证 HTTP3 生效

 启动nginx

验证HTTP3

由于目前浏览器对HTTP3.0/QUIC的支持性有限,可以使用 https://http3check.net/ 来验证站点启用HTTP3是否成功。

浏览器对 HTTP/3 QUIC 的支持情况,据明月自己实测手机端 Edge、国内 360 极速浏览器都是支持的,开启 HTTP/3 QUIC 后,首次载入网页可能会存在没有生效,但只要再次重新载入页面就会显示是 QUIC 了

LNMP 环境下 Nginx 1.26.0 开启 HTTP/3 QUIC 支持

这就是在手机端 Edge 上显示效果

LNMP 环境下 Nginx 1.26.0 开启 HTTP/3 QUIC 支持

这是 PC 端 360 极速浏览器上的现实效果

有站长说国内运营商不支持 HTTP/3 QUIC 或者说封杀 HTTP/3 QUIC,明月实测后发现并不是这样的,有些地区出现浏览器打开开启 HTTP/3 QUIC 支持的站点不显示“该连接使用 QUIC”的罪魁祸首其实是本地电脑的 DNS 缓存过于陈旧造成的(因为 HTTP/3 QUIC 需要 443 端口支持 UDP 协议,都是单独开启的,所以就要求 DNS 解析记录必须是及时更新的)。

浏览器开启 HTTP/3 QUIC 支持的方法

Google Chrome - 在浏览器上访问 chrome://flags/#enable-quic,找到”Experimental QUIC protocol”,并启用之(Enabled)。

Microsoft Edge - 在浏览器上访问 edge://flags/#enable-quic,找到”Experimental QUIC protocol”,并启用之(Enabled)。

Firefox - 在浏览器上访问 about:config,然后搜索”network.http.http3.enable”,并点击对应行末尾的切换图标,启用之(true)。

Safari - 最新版本的 Safari 已经自动支持 HTTP/3,无需任何额外配置。

对于使用了国内 CDN 的站点来说,这个 Nginx 里开启 HTTP/3 QUIC 后可能是没有效果的,因为还需要 CDN 层面的支持,国内支持 HTTP/3 QUIC 的好像只有七牛、又拍云,国外 CloudFlare 免费支持 HTTP/3 QUIC 开启的,并且只要 CDN 支持 HTTP/3 QUIC,源站开没开启 HTTP/3 QUIC 都是可以的,所以本文更多的是处于技术学习的范畴了,毕竟现在网站没有 CDN 的保护是不敢想象的,裸奔的服务器和网站在现在的国内互联网生态里太少见了。

故障排查

 如果配置的HTTP/3没有生效,或者出现其他问题,可以通过一下排查方法进行排查。

1、检查nginx是使用正确版本SSL底层库构建的,并且在运行时使用了正确的SSL库,可以nginx -V显示当前使用SSL库的相关运行参数。

2、确保客户端实际通过QUIC发送请求。建议从一个简单的控制台客户端开始。例如ngtcp2在尝试之前确保服务器配置正确使用可能对证书非常挑剔的真实浏览器。

3、构建nginx时启用调试支持的并检查调试日志。它应该包含有关连接及其失败原因的所有详细信息。所有相关消息都包含“quic“ 字首,可以很容易筛选出来。为了进行更深入的排查,可以启用额外的调试 使用以下宏:

NGX_QUIC_DEBUG_PACKETS, NGX_QUIC_DEBUG_FRAMES, NGX_QUIC_DEBUG_ALLOC, NGX_QUIC_DEBUG_CRYPTO.

./configure
--with-http_v3_module
--with-debug
--with-cc-opt="-DNGX_QUIC_DEBUG_PACKETS -DNGX_QUIC_DEBUG_CRYPTO"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-无-为-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值