HTTP/3 和 Brotli 压缩介绍
1. HTTP/3 和 QUIC
1.1 什么是 HTTP/3?
HTTP/3 是最新的 HTTP 协议版本,基于 QUIC(Quick UDP Internet Connections)协议构建。QUIC 是一个由 Google 开发的实验性协议,旨在通过减少连接建立的延迟和优化数据传输,提升网页加载速度和网络性能。
HTTP/3 继承了 HTTP/2 的多路复用特性,但与 HTTP/2 不同,它使用 UDP 协议而不是传统的 TCP 协议。这种变化带来了几个显著的性能改进。
1.2 QUIC 协议的优势
- 低延迟:由于 QUIC 使用 UDP 协议,它可以减少连接建立时间,相较于传统的 TCP,需要的握手次数更少。
- 多路复用:HTTP/3 支持多个请求在同一连接中同时进行,消除了 HTTP/2 中的头部阻塞(Head-of-line blocking)问题,减少了延迟。
- 更好的连接恢复:QUIC 支持在网络中断后更快速地恢复连接,提升了连接的稳定性。
- 内置加密:QUIC 默认启用了加密,比 TCP 更安全,简化了加密的实现。
1.3 HTTP/3 的工作原理
- 基于 UDP:QUIC 使用 UDP 进行传输,而不是传统的 TCP,因此可以减少连接建立的延迟和重新传输的开销。
- 0-RTT 连接恢复:QUIC 支持 0-RTT(Zero Round-Trip Time)连接恢复,允许客户端在与服务器建立第一次连接时,快速恢复先前的连接状态。
- 头部压缩:HTTP/3 仍然采用类似于 HTTP/2 的 HPACK 头部压缩,但 QUIC 协议本身也对包的内容进行了加密和压缩。
1.4 HTTP/3 的支持
- 当前,主流浏览器(如 Chrome、Firefox、Edge)和大部分服务器软件(如 Nginx、Apache、LiteSpeed)都已经开始支持 HTTP/3。
- 使用 HTTP/3 需要通过 QUIC 协议,并且通常需要 TLS 1.3 支持。
2. Brotli 压缩
2.1 什么是 Brotli?
Brotli 是一种现代的压缩算法,由 Google 开发,旨在取代 Gzip 和 Deflate,特别适用于 Web 内容的压缩。Brotli 以其高效的压缩率和快速的解压速度,被广泛用于网页传输,尤其是在 HTTP/2 和 HTTP/3 中。
2.2 Brotli 的特点
- 更高的压缩率:与传统的 Gzip 相比,Brotli 提供了更好的压缩比,尤其适用于文本文件(如 HTML、CSS 和 JavaScript)。通常,Brotli 压缩的文件比 Gzip 小 10%-20%。
- 适应性强:Brotli 可以在不同的应用场景下进行调节,能够根据不同的资源类型和传输需求选择压缩级别,平衡性能与压缩效果。
- 支持 HTTP/2 和 HTTP/3:Brotli 可以与 HTTP/2 和 HTTP/3 一起使用,提供更高效的网页加载体验。特别是在基于 QUIC 的 HTTP/3 上,Brotli 可以与其低延迟特性相结合,提供更快速的资源加载。
2.3 Brotli 的优势
- 更好的压缩效果:Brotli 提供比 Gzip 更高的压缩率,尤其在压缩 HTML、CSS 和 JavaScript 文件时,能够显著减少文件大小。
- 优化的解压速度:Brotli 在解压时速度也非常快,适合实时传输和动态生成的内容。
- 广泛支持:Brotli 已被大部分现代浏览器(如 Chrome、Firefox、Safari)支持,服务器端(如 Nginx、Apache)也能轻松启用 Brotli 压缩。
2.4 Brotli 和 Gzip 的对比
特性 | Brotli | Gzip |
---|---|---|
压缩率 | 更高 | 较低 |
解压速度 | 较快 | 较快 |
支持的浏览器 | 支持大部分现代浏览器(Chrome、Firefox 等) | 几乎所有浏览器都支持 |
适用场景 | 适用于文本文件,如 HTML、CSS、JS | 适用于大多数文件类型,尤其是文本 |
默认压缩级别 | 较高 | 较低 |
1.环境介绍
宝塔面板 9.0
Nginx 1.27.1
2.编译安装 Nginx 1.27.1
以及 brotli
模块
2.1 添加自定义模块
模块名称填写: ngx_brotli
模块参数填写: --add-module=/www/server/nginx/src/ngx_brotli
前置脚本粘贴以下内容:
wget -O ngx_brotli.zip https://github.com/google/ngx_brotli/archive/v1.0.0rc.zip
unzip ngx_brotli.zip
mv ngx_brotli-1.0.0rc ngx_brotli
cd ngx_brotli/deps
rm -rf brotli
wget -O brotli.zip https://github.com/google/brotli/archive/v1.0.9.zip
unzip brotli.zip
mv brotli-1.0.9 brotli
cd /www/server/nginx/src
点击提交
勾选/滑块开启模块,然后点击提交并安装(如果你的宝塔版本比较新,这里会是滑块按钮)
等待安装完成(编译安装会根据你的服务器配置来决定速度)
3.安装完成后修改 Nginx1.27.1
的配置文件(不需要Brotli 压缩跳过这步)
在配置文件中的52行左右有 gzip
相关配置
替换成以下配置:
# 启用 Brotli 压缩
brotli on;
brotli_comp_level 6;
brotli_min_length 10;
brotli_window 1m;
brotli_types *;
brotli_static always;
# 启用 Gzip 压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
最终配置完成的效果:
然后点击保存,并到服务选项里依次点击-重载配置-重启即可
4.创建一个默认站点 default.com
并配置以下证书防止溯源
pem(证书):
-----BEGIN CERTIFICATE-----
MIIEMTCCAxmgAwIBAgIRAIpP63oyckkUvKs4UpxQ+xYwDQYJKoZIhvcNAQELBQAw
XjELMAkGA1UEBhMCQ04xDjAMBgNVBAoTBU15U1NMMSswKQYDVQQLEyJNeVNTTCBU
ZXN0IFJTQSAtIEZvciB0ZXN0IHVzZSBvbmx5MRIwEAYDVQQDEwlNeVNTTC5jb20w
HhcNMjIwMTEwMDU1MDE2WhcNMjcwMTA5MDU1MDE2WjBNMQswCQYDVQQGEwJDTjE+
MDwGA1UEAww15Yir5omr5LqGLuWKs+i1hOeahOe9keermeS4jeaYr+S9oOiDveaJ
q+W+l+WIsOeahC5jbm0wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDc
kLV/AB/akUJmxEcGjE1SrZYJnOh+Gty0eiTtzYldrBY5Br2S9ggqQSdY4h8d+aIX
7oIYOvjIKC/XuqzqazaLeIhVLm7FqsyntNZBJFF5GrlgfguvSwgejm1aFDlMNSZx
UMpXBAhVkXXqY/drmB0pN/071Mgay31MHm15UZ/BcJvIFl+8prp1bhyrScudtzzm
Mj5v0NGrbXD9R+vABsyMXkLACtOVbxaeRSQqIVcTIzPaavgDs6KI+6EVxje2LCRl
LX9Glslw2mUtxH/9JYQt798q6sBWKdpmxHQ2x8szcAOgBlXYWdioU/RKWaOiktyu
vR0LIHLvvmOzNLOSR0XxAgMBAAGjgfowgfcwDgYDVR0PAQH/BAQDAgWgMB0GA1Ud
JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBQogSYF0TQaP8Fz
D7uTzxUcPwO/fzBjBggrBgEFBQcBAQRXMFUwIQYIKwYBBQUHMAGGFWh0dHA6Ly9v
Y3NwLm15c3NsLmNvbTAwBggrBgEFBQcwAoYkaHR0cDovL2NhLm15c3NsLmNvbS9t
eXNzbHRlc3Ryc2EuY3J0MEAGA1UdEQQ5MDeCNeWIq+aJq+S6hi7lirPotYTnmoTn
vZHnq5nkuI3mmK/kvaDog73miavlvpfliLDnmoQuY25tMA0GCSqGSIb3DQEBCwUA
A4IBAQA6SdaUfOx+Ys2tsVAo2zcSaDokV1d9HGyU+k/G2/J8ZvosMlt7pw90uRrK
MkGffMlss69Sxx2KAm0JVPaGZ60erx99LP04VYpw2PLCa1nibFoCeGS7D9uvEVa0
LiA1aLnMvYr5YjrX//TdAVuZdkfI8yLCZSeQr0v2M9QfcxCxQ1Bf7JDiEduGIYne
pLmPMQ+H9eq+rpAWP+aW2slXN719Tv3MatePPqXK6vGKXMtyzkxCS79pCke/+5y/
JWfEeHaPPw+ASuubQyhl9scyiEPyN8zn/ChLTSVseh+0cTXDGR7j+zz4bKYHs5zz
iaxHSWDqoFZh9d4rCPPHNKTgRBRi
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDuzCCAqOgAwIBAgIQSEIWDPfWTDKZcWNyL2O+fjANBgkqhkiG9w0BAQsFADBf
MQswCQYDVQQGEwJDTjEOMAwGA1UEChMFTXlTU0wxLDAqBgNVBAsTI015U1NMIFRl
c3QgUm9vdCAtIEZvciB0ZXN0IHVzZSBvbmx5MRIwEAYDVQQDEwlNeVNTTC5jb20w
HhcNMTcxMTE2MDUzNTM1WhcNMjcxMTE2MDUzNTM1WjBeMQswCQYDVQQGEwJDTjEO
MAwGA1UEChMFTXlTU0wxKzApBgNVBAsTIk15U1NMIFRlc3QgUlNBIC0gRm9yIHRl
c3QgdXNlIG9ubHkxEjAQBgNVBAMTCU15U1NMLmNvbTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAMBOtZk0uzdG4dcIIdcAdSSYDbua0Bdd6N6s4hZaCOup
q7G7lwXkCyViTYAFa3wZ0BMQ4Bl9Q4j82R5IaoqG7WRIklwYnQh4gZ14uRde6Mr8
yzvPRbAXKVoVh4NPqpE6jWMTP38mh94bKc+ITAE5QBRhCTQ0ah2Hq846ZiDAj6sY
hMJuhUWegVGd0vh0rvtzvYNx7NGyxzoj6MxkDiYfFiuBhF2R9Tmq2UW9KCZkEBVL
Q/YKQuvZZKFqR7WUU8GpCwzUm1FZbKtaCyRRvzLa5otghU2teKS5SKVI+Tpxvasp
fu4eXBvveMgyWwDpKlzLCLgvoC9YNpbmdiVxNNkjwNsCAwEAAaN0MHIwDgYDVR0P
AQH/BAQDAgGGMA8GA1UdJQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
HSMEGDAWgBSa8Z+5JRISiexzGLmXvMX4oAp+UzAdBgNVHQ4EFgQUKIEmBdE0Gj/B
cw+7k88VHD8Dv38wDQYJKoZIhvcNAQELBQADggEBAEl01ufit9rUeL5kZ31ox2vq
648azH/r/GR1S+mXci0Mg6RrDdLzUO7VSf0JULJf98oEPr9fpIZuRTyWcxiP4yh0
wVd35OIQBTToLrMOWYWuApU4/YLKvg4A86h577kuYeSsWyf5kk0ngXsL1AFMqjOk
Tc7p8PuW68S5/88Pe+Bq3sAaG3U5rousiTIpoN/osq+GyXisgv5jd2M4YBtl/NlD
ppZs5LAOjct+Aaofhc5rNysonKjkd44K2cgBkbpOMj0dbVNKyL2/2I0zyY1FU2Mk
URUHyMW5Qd5Q9g6Y4sDOIm6It9TF7EjpwMs42R30agcRYzuUsN72ZFBYFJwnBX8=
-----END CERTIFICATE-----
key(密钥):
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA3JC1fwAf2pFCZsRHBoxNUq2WCZzofhrctHok7c2JXawWOQa9
kvYIKkEnWOIfHfmiF+6CGDr4yCgv17qs6ms2i3iIVS5uxarMp7TWQSRReRq5YH4L
r0sIHo5tWhQ5TDUmcVDKVwQIVZF16mP3a5gdKTf9O9TIGst9TB5teVGfwXCbyBZf
vKa6dW4cq0nLnbc85jI+b9DRq21w/UfrwAbMjF5CwArTlW8WnkUkKiFXEyMz2mr4
A7OiiPuhFcY3tiwkZS1/RpbJcNplLcR//SWELe/fKurAVinaZsR0NsfLM3ADoAZV
2FnYqFP0SlmjopLcrr0dCyBy775jszSzkkdF8QIDAQABAoIBAQCKUM0gaWmQXQtw
+qE3wAA1Wtn+CUHa4umI3BgQcJY2AdalyE5VvKf+J4GPQa4V1BgMPeujWkfs7Raj
iFMrZjR8XgfQsx+QIb3ZZZP+odHdyh56HlEhikH7N4HnvUr5OVN0OB/LVaIMVv3F
EQ91j5yp3oyVWqhp9TYL6ADq1X8DhHqE5RcPP92bDG0vc84oS+SPPcARWvlbs78t
lyh+JVnLbdoZQ4knQNiPQA7OL0PLWmhemn8RxbpcKhnr5+rgeuSvUrFsvE4a257M
i4ufbkVs3dmB4G+QQqrDRKnfkqYjeXyXXGMbTzrM7Wyp0Qi2t0IOxoptdsZ+k+SM
ZWpnLczpAoGBAO4ApaT2Mu7z2TgZZuOkUtRwWwU4olS0SWqKeRX85n6JTnY3IOoL
i4x3w9bxLCwKeb5KvryDJt0R4sHnexp++dQckIdWHXTzXxAs5t2alDjeiGab7SC2
totE0DP0kKjAROwNCVXIRc5tISAZtfqwg6dtgsacLzcKTehlKGvTzWJvAoGBAO0+
gQ/2CUYDQcvdyXTy1selISQqxFQvoYjJ2Z+GOElsLBtGakCT9HV0/9AEjwy+mQQv
1xo///hLbcwx239upg3LNuuPRAEjgviQVIuOS7+GJjalFENkSStw14c0pTP6QMf2
TC44wGvG0HNL0xjIZmJtaauvAadmjU1x8JTBgI2fAoGAKYURYKLWpdsCdQfxbBsZ
nBfxuQp1P0OoXx7DGvPgngiEGJlrc4kKEjo+fvvZ0eEN9gWCGs7ic8SQA3XHgwrN
uJQ3HnUGdIWUevTqXZR+8SDZONVQ29kkJU2e6MFsjxPjsi5gB4gFrYpaMghqN86d
WRMAsndCwV5Z0wX6tDzh4p8CgYAz8nG0Gv1g1Sm9B+0qrFmXEXM2Rh8DCALovrnm
Ei+U9BicSEjPpxXp+hphY/4mnj1HC2qgFs9ngKyj/26+cm3tq0d1QMN1NF9jKcc5
X4j6gNcxM+hB8V2MI4Mt2bsqrGsu3aFEpayMbNYLyNiKHqc8ehSfQQytqOjbwk0Z
ZV1OpQKBgGtVyv7IC27BM+fcst6kP0RXzRfdvg1dOFl9DpMK12eyjOG2BUzRQY1A
TYF70H58arJ167onabe2E5wi0veN3GiMGaTGeDCUcsIST9cFrwuOx0Di9M/wNveb
7N7dGUUJ/XYxbuFeZTy92F6ShF5DWk12/W1adWeR+3rkeKW938pm
-----END RSA PRIVATE KEY-----
5.修改站点配置文件
这是默认配置
在 listen 80;
下面添加以下配置项:
listen 443 quic reuseport;
listen [::]:443 ssl;
listen [::]:443 quic reuseport;
http2 on;
http3 on;
http3_hq on;
quic_retry on;
如图:
然后保存即可
6.修改要开启HTTP3/QUIC的站点配置文件
修改之前,建议先备份源配置,避免出现问题
记得把baidu.com www.baidu.com改成自己的域名
第一个server块中:
listen 80;
目的是监听HTTP请求(端口80)
server_name
站点域名
return 301 https://$host$request_uri;
301永久重定向到HTTPS(也就是强制HTTPS,配置这个后,宝塔SSL选项中不要开启强制HTTPS选项)
第二个server块中(配置项较多,直接看注释即可):
server {
listen 80;
server_name baidu.com www.baidu.com;
return 301 https://$host$request_uri;
}
server {
# 监听 443 端口,启用 SSL 和 QUIC
listen 443 ssl; # 使用 SSL 协议监听 443 端口
listen 443 quic; # 启用 QUIC 协议监听 443 端口
# 服务器域名设置
server_name baidu.com www.baidu.com; # 指定服务器域名
# 默认的首页文件设置
index index.php index.html index.htm default.php default.htm default.html; # 默认首页文件
# 网站根目录配置
root /www/wwwroot/baidu.com/public; # 网站根目录路径
# SSL 配置
ssl_certificate /www/server/panel/vhost/cert/baidu.com/fullchain.pem; # SSL 证书
ssl_certificate_key /www/server/panel/vhost/cert/baidu.com/privkey.pem; # SSL 私钥
ssl_protocols TLSv1.2 TLSv1.3; # 启用 TLS 1.2 和 TLS 1.3 协议
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; # 设置 SSL 密码套件
ssl_session_cache shared:SSL:10m; # SSL 会话缓存
ssl_session_timeout 10m; # SSL 会话超时时间
ssl_early_data on; # 启用 SSL 早期数据
ssl_stapling on; # 启用 SSL Stapling
ssl_stapling_verify on; # 启用 SSL Stapling 验证
ssl_prefer_server_ciphers on; # 强制使用服务器的密码套件
# HTTP/2 和 HTTP/3 配置
http2 on; # 启用 HTTP/2 协议
http3 on; # 启用 HTTP/3 协议
http3_hq on; # 启用 HTTP/3 HQ(QUIC)模式
quic_retry on; # 启用 QUIC 重试机制
# 代理设置(注释掉了,如果需要代理可解除注释)
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "Upgrade";
# proxy_buffering off;
# proxy_http_version 1.1;
# proxy_read_timeout 600s;
# HSTS 配置(HTTP 严格传输安全性)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 强制客户端使用 HTTPS
# HTTP/3 和 QUIC 协议的 Alt-Svc 头
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"' always; # 提供 HTTP/3 和 QUIC 兼容信息给客户端
# QUIC 状态和 HTTP/3 状态
add_header quic-status $http3 always; # 返回 QUIC 状态
add_header x-quic 'h3' always; # 返回 HTTP/3 状态
# 重定向到 HTTPS
error_page 497 https://$host$request_uri; # 如果客户端请求的是 HTTP,自动重定向到 HTTPS
# CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
include /www/server/panel/vhost/nginx/well-known/baidu.com.com.conf; # 用于 Let’s Encrypt 等证书验证
# CERT-APPLY-CHECK--END
# SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
# 错误页面配置,可以注释、删除或修改
error_page 404 /404.html; # 配置 404 错误页面
#error_page 502 /502.html; # 配置 502 错误页面(注释掉)
# PHP 配置(假设此为 PHP 7.2 配置)
include enable-php-72.conf; # 启用 PHP 配置
# URL 重写规则配置(面板设置的伪静态规则)
include /www/server/panel/vhost/rewrite/baidu.com.com.conf; # 引入伪静态规则文件
# 禁止访问的文件或目录(如配置中的敏感文件)
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
return 404; # 封禁访问敏感文件
}
# 一键申请 SSL 证书验证目录相关设置
location ~ \.well-known {
allow all; # 允许访问验证目录
}
# 禁止在证书验证目录放入敏感文件
if ($uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$") {
return 403; # 禁止上传敏感文件至 .well-known 目录
}
# 图片和静态资源缓存(配置了缓存过期时间)
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d; # 设置图片和静态文件缓存 30 天
error_log /dev/null; # 禁用错误日志
access_log /dev/null; # 禁用访问日志
}
# JS 和 CSS 文件缓存
location ~ .*\.(js|css)?$ {
expires 12h; # 设置 JS 和 CSS 文件缓存 12 小时
error_log /dev/null; # 禁用错误日志
access_log /dev/null; # 禁用访问日志
}
# 访问日志和错误日志配置
access_log /www/wwwlogs/baidu.com.com.log; # 设置访问日志路径
error_log /www/wwwlogs/baidu.com.com.error.log; # 设置错误日志路径
}
6.仔细检查无误后点击保存
7.开启443端口的UDP协议
默认是 TCP
协议,修改为 TCP/UDP
即可
8. 开启浏览器的QUIC配置项
谷歌Chrome浏览器 访问:chrome://flags/
启用:Experimental QUIC protocol (enable-quic)
微软新版Edge浏览器 访问:edge://flags
启用:Experimental QUIC protocol 设置为“Enabled”
火狐Firefox浏览器 访问:about:config
启用:network.http.http3.enabled
9. 访问域名查看是否生效
访问域名,打开控制台,可以看到协议为 h3
再点击第一项查看标头
可以看到刚才修改的配置项已经生效
10.使用工具测试HTTP3/QUIC是否正常
点击下方链接进行测试
https://http3.wcode.net/
输入域名点击检测,可以看到已经支持了 QUIC
和 HTTP3