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 的对比

特性BrotliGzip
压缩率更高较低
解压速度较快较快
支持的浏览器支持大部分现代浏览器(Chrome、Firefox 等)几乎所有浏览器都支持
适用场景适用于文本文件,如 HTML、CSS、JS适用于大多数文件类型,尤其是文本
默认压缩级别较高较低

1.环境介绍

宝塔面板 9.0
Nginx 1.27.1

2.编译安装 Nginx 1.27.1 以及 brotli 模块

2025-01-09T07:16:19.png

2.1 添加自定义模块

2025-01-09T07:18:02.png
模块名称填写: 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

2025-01-09T07:20:45.png
点击提交
勾选/滑块开启模块,然后点击提交并安装(如果你的宝塔版本比较新,这里会是滑块按钮)
2025-01-09T07:25:57.png
等待安装完成(编译安装会根据你的服务器配置来决定速度)
2025-01-09T07:27:12.png

3.安装完成后修改 Nginx1.27.1 的配置文件(不需要Brotli 压缩跳过这步)

在配置文件中的52行左右有 gzip 相关配置
2025-01-09T07:33:48.png
替换成以下配置:

        # 启用 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]\.";

最终配置完成的效果:
2025-01-09T07:37:38.png
然后点击保存,并到服务选项里依次点击-重载配置-重启即可
2025-01-09T07:49:51.png

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.修改站点配置文件

这是默认配置
2025-01-09T08:26:46.png
listen 80; 下面添加以下配置项:

    listen 443 quic reuseport; 
    listen [::]:443 ssl;
    listen [::]:443 quic reuseport;
    http2 on;
    http3 on;
    http3_hq on;
    quic_retry on;

如图:
2025-01-09T08:28:58.png
然后保存即可

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.仔细检查无误后点击保存

2025-01-09T08:58:17.png

7.开启443端口的UDP协议

默认是 TCP 协议,修改为 TCP/UDP 即可
2025-01-09T08:59:35.png

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
2025-01-09T08:54:12.png
再点击第一项查看标头
可以看到刚才修改的配置项已经生效
2025-01-09T08:56:30.png

10.使用工具测试HTTP3/QUIC是否正常

点击下方链接进行测试
https://http3.wcode.net/
输入域名点击检测,可以看到已经支持了 QUICHTTP3
2025-01-09T09:04:50.png