下面的方案保证:
- 你现有的 HTTPS(HTTP/2)站点 0 中断、0 配置改动(证书、虚拟主机、反向代理、Header、HSTS、OCSP 等全部保持)。
- 仅需 给 Nginx 再挂一个 「QUIC/HTTP3 前端」——让 UDP/443 由 gost 监听,gost 把 QUIC 流解密后,走本地回环以普通 HTTP/2 回源到 Nginx 的 443 端口。
- 日后可随时
systemctl disable --now gost
秒级回滚。
一、整体流量路径
浏览器 ──QUIC/UDP 443──▶ gost ──HTTP/2 TCP 127.0.0.1:443──▶ Nginx(现有)
└─ fallback TCP/443 ────▶ Nginx(现有) (兼容非 HTTP/3 客户端)
- 对外 443 端口同时监听 TCP+UDP,UDP 由 gost 占,TCP 仍由 Nginx 占,互不冲突。
- gost 只做 「QUIC→TCP」 的卸载,不碰证书、不碰域名、不碰业务配置。
二、操作步骤
1. 确认内核 & 防火墙
# 内核 5.9+ 即可,Quic-Go 已内置
uname -r
# 放行 UDP/443
ufw allow 443/udp
# 云厂商安全组同样放行 UDP/443
2. 安装 gost v3(单文件,30 秒)
curl -fsSL https://github.com/go-gost/gost/raw/master/install.sh | bash
# 二进制路径 /usr/local/bin/gost
3. 新建 gost 配置(/etc/gost/quic.yaml)
# 只监听 UDP/443,做 QUIC-offload
log:
level: info
services:
- name: quic-offload
addr: :443
handler:
type: relay # 四层转发,不解析七层
listener:
type: quic
tls:
cert: /etc/letsencrypt/live/<your.domain>/fullchain.pem
key: /etc/letsencrypt/live/<your.domain>/privkey.pem
alpn: ["h3"] # 仅 QUIC,ALPN=h3
forwarder:
nodes:
- name: nginx-loop
addr: 127.0.0.1:443 # 回源到本机 Nginx 的 TCP/443
说明
relay
模式:gost 只负责把 QUIC 流映射成 TCP 流,不会二次加解密,也不改 SNI/ALPN。- 证书路径直接复用你已有的 let』s encrypt 证书,gost 支持 inotify 自动热更新。
4. 启动并设为开机自启
# 创建 systemd 片段,只加载 quic.yaml
cat >/etc/systemd/system/gost-quic.service <<'EOF'
[Unit]
Description=GOST QUIC offload for Nginx
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/gost -C /etc/gost/quic.yaml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now gost-quic
检查 UDP/443 是否被 gost 占用
ss -ulpn | grep 443
5. 客户端验证
- Chrome/Edge 打开
https://<your.domain>
,F12 → Network → Protocol 列出现 h3 即成功。 - curl(需支持 QUIC)
curl -I --http3 https://<your.domain>
# 输出:HTTP/3 200
三、日常维护
场景 | 命令 |
---|---|
证书续期后热加载 | 无需动作,gost 会 inotify 自动重载 |
升级 gost | systemctl stop gost-quic && install.sh && systemctl start gost-quic |
临时关闭 HTTP/3 | systemctl stop gost-quic (UDP/443 即关闭,客户端自动回落 TCP/HTTP2) |
卸载 | systemctl disable --now gost-quic && rm /etc/systemd/system/gost-quic.service |
四、常见坑
- Nginx 千万别开
reuseport
占 UDP
确保/etc/nginx/nginx.conf
里没有listen 443 quic reuseport;
否则端口冲突会导致 gost 起不来。 - CDN 侧
若用了 Cloudflare / 阿里云 DCDN,它们默认已提供 HTTP/3,源站再开会造成「双重 QUIC」——此时无需本方案,或直接在 CDN 控制台关闭「边缘 QUIC」让源站接管。 - curl 测试失败
检查本地 curl 是否编译了 QUIC(curl --version
应含HTTP3
或ngtcp2
),否则请升级或使用 Chrome。
五、一句话总结
「Nginx 继续干它的 HTTP/2,gost 只在外层把 UDP/443 的 QUIC 翻译成 TCP/443 的 HTTP/2,两者井水不犯河水。」
装好 gost、丢一份 10 行配置、开机自启,你就拥有了零侵入、可秒级回滚的 HTTP/3。