怎样开启HTTP/3

HTTP/3 不再直接基于 TCP,而是基于运行在 UDP 之上的 QUIC 协议(Quick UDP Internet Connections)。HTTP/3 已经成为 W3C 推荐标准(RFC 9114),但在服务端与基础设施层面的普及仍在进行中,因此目前只有部分网站默认启用。让我们要尝尝鲜吧。

前置条件

HTTP/3基于UDP,并使用QUIC协议。目前 Spring Boot 官方尚未提供生产可用的 HTTP/3 服务端支持,因此通常需要通过 Nginx 等反向代理来启用 HTTP/3。虽然从Nginx 1.25开始,Nginx可以支持HTTP/3,但是现在官方发行包的Nginx都不一定带HTTP/3的编译参数。我们可以用下面的命令检查一下Nginx是否支持HTTP/3

nginx -V 2>&1 | grep "http_v3"

如果有--with-http_v3_module,那么当前nginx可以支持HTTP/3。

安装Nginx

以Alibaba Cloud Linux为例子,我们可以用下面几个方法去安装支持HTTP/3的Nginx

1. 直接安装发行版本(大几率不行)

我们可以先试试用dnf或者yum直接安装。因为当前Nginx发行版本一般不支持HTTP/3的module,所以只能说试试。

sudo dnf update
sudo dnf install nginx

或者

sudo yum update -y
sudo yum install nginx -y

用一开始的方法检查一下发行包支不支持HTTP/3

2. 使用Nginx自身的repo去安装

第二个快速方法就是利用Nginx自己的发行包去安装。

我们先配置nginx的yum repo:创建文件/etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Alibaba Cloud Linux release 3 (OpenAnolis Edition)是兼容CentOS 8的,所以可以用CentOS 8的package。

然后尝试用yum安装。

sudo yum install nginx -y

用一开始的方法检查一下发行包支不支持HTTP/3

3. 使用Nginx的源码安装(必定可以)

从源码编译是最复杂的方法,但是如果安装好了,是必定可以支持HTTP/3的。这里使用的是 Nginx mainline 版本(1.29.x),HTTP/3 相关特性主要在 mainline 中持续完善。

3.1 安装编译相关工具
sudo dnf install -y \
  gcc gcc-c++ make \
  libtool automake \
  pcre2 pcre2-devel \
  zlib zlib-devel \
  openssl openssl-devel \
  libatomic \
  git
3.2 下载并解压源码
cd /usr/local/src
wget https://nginx.org/download/nginx-1.29.4.tar.gz
tar zxvf nginx-1.29.4.tar.gz
cd nginx-1.29.4
3.3 配置并编译源码
make clean || true

./configure \
  --prefix=/usr/local/nginx-http3 \
  --sbin-path=/usr/local/nginx-http3/sbin/nginx \
  --conf-path=/usr/local/nginx-http3/conf/nginx.conf \
  --pid-path=/run/nginx.pid \
  --lock-path=/run/nginx.lock \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --user=nginx \
  --group=nginx \
  \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_v3_module \
  \
  --with-stream \
  --with-stream_ssl_module \
  --with-stream_ssl_preread_module \
  \
  --with-file-aio \
  --with-threads \
  \
  --with-compat


make \
  CFLAGS="-O2 -fstack-protector-strong -D_FORTIFY_SOURCE=2" \
  LDFLAGS="-Wl,-z,relro -Wl,-z,now -pie"

make install

为了不要覆盖原来的Nginx运行环境,编译的运行程序会放在/usr/local/nginx-http3/sbin/nginx

添加HTTP/3相关的Nginx配置

让我们从原来的/etc/nginx/nginx.conf创建一个新的/etc/nginx/nginx-http3.conf。主要的变动是在HTTPS的服务里面加上quic的配置,重用443端口,加上对应的headers并且启用TLSv1.3。

...
    server {
        listen       443 ssl;
        http2 on;

        listen       443 quic reuseport;
        quic_retry on;
        quic_gso on;
        add_header Alt-Svc 'h3=":443"; ma=31536000' always;
        add_header X-Protocol $server_protocol always;
        ssl_protocols TLSv1.2 TLSv1.3;
...

Alt-Svc 用于告知客户端该站点支持 HTTP/3,浏览器通常会在首次 HTTPS 访问后缓存并升级到 HTTP/3。

用新的Nginx检测一下我们新的配置文件:

/usr/local/nginx-http3/sbin/nginx -t -c /etc/nginx/nginx-http3.conf

测试Nginx HTTP/3

如果新的Nginx成功启动了,我们可以用支持HTTP/3的curl去检测网站是否支持HTTP/3。

/usr/local/bin/curl -I --http3 https://dns.alidns.com/         
HTTP/3 400 
content-type: text/plain; charset=utf-8
x-content-type-options: nosniff
date: Fri, 26 Dec 2025 12:57:54 GMT
content-length: 0
...

/usr/local/bin/curl -I --http3 https://www.youkuaiyun.com/ 
HTTP/1.1 200 OK
Date: Fri, 26 Dec 2025 12:56:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 710782
Connection: keep-alive
Server: WAF
...

如果 curl 在 --http3 模式下成功返回 HTTP/3 响应,说明服务端已正确启用 HTTP/3,但浏览器是否实际使用,还取决于客户端与网络环境。什么?你的curl不支持HTTP/3?好吧,这是另一个话题了。还是那句话,从源码编译curl是肯定可以开启HTTP/3的。

后记

QUIC 最早在 2013 年由 Google 提出,并在 2022 年完成 HTTP/3 的标准化。随着TLS1.3的推进和网络的优化,HTTP/3的作用个人感觉越来越重要:0RTT快速连接、默认加密、断点重连,这都是未来我们需要的功能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值