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快速连接、默认加密、断点重连,这都是未来我们需要的功能。






