让网站提速50%:Brotli压缩Nginx与Apache服务器实战配置指南
【免费下载链接】brotli Brotli compression format 项目地址: https://gitcode.com/gh_mirrors/bro/brotli
你是否还在为网站加载缓慢而烦恼?用户因等待太久而流失?根据HTTP Archive统计,全球网站平均页面大小已达2.5MB,而采用Brotli压缩可减少40-50%的传输体积,让你的网站像猎豹一样飞奔。本文将带你一步步在Nginx和Apache服务器上部署Brotli压缩,无需复杂编程,只需简单配置即可让用户体验显著提升。
Brotli压缩技术优势
Brotli是由Google开发的新一代无损压缩算法,基于LZ77算法、霍夫曼编码和二阶上下文建模技术,相比传统的gzip压缩具有明显优势:
- 更高压缩率:比gzip提高15-25%的压缩效率,尤其对HTML、CSS、JavaScript等文本类资源效果显著
- 更快解压缩速度:虽然压缩时略慢,但解压缩速度比gzip快10-20%,减轻服务器负载
- 广泛浏览器支持:所有现代浏览器(Chrome 49+、Firefox 44+、Edge 11+、Safari 11+)均已原生支持
Brotli的压缩原理可以通过以下流程图直观展示:
项目核心压缩实现位于src/c/enc/encode.c,解码器实现位于src/c/dec/decode.c。完整的算法规范可参考RFC 7932。
编译安装Brotli
在配置服务器前,需要先安装Brotli工具。以下是在Linux系统下的编译安装步骤:
# 克隆仓库
git clone https://link.gitcode.com/i/dc760123c313f50ac785cb4830ee9d47
cd brotli
# 创建构建目录
mkdir out && cd out
# 配置并编译
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..
cmake --build . --config Release --target install
# 验证安装
brotli --version
编译完成后,Brotli可执行文件将安装在/usr/local/bin/brotli,库文件安装在/usr/local/lib,头文件安装在/usr/local/include/brotli。
Nginx服务器配置
安装Nginx Brotli模块
Nginx需要通过模块方式集成Brotli支持,推荐使用Google官方维护的ngx_brotli模块:
# 下载ngx_brotli模块
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init
# 重新编译Nginx,添加Brotli模块
cd /path/to/nginx/source
./configure --add-module=/path/to/ngx_brotli
make && make install
Nginx配置示例
编辑Nginx配置文件nginx.conf,添加以下配置:
http {
# Brotli压缩配置
brotli on;
brotli_comp_level 6; # 压缩级别(1-11),推荐6-8
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/x-javascript;
brotli_buffers 16 8k;
brotli_min_length 20; # 最小压缩文件大小
brotli_window 512k; # 窗口大小
brotli_static on; # 启用静态文件压缩
server {
# 服务器其他配置...
location ~* \.(js|css|html|svg)$ {
brotli on;
expires 1y;
add_header Cache-Control "public, max-age=31536000";
add_header Content-Encoding br;
}
}
}
配置说明:
brotli_comp_level:压缩级别,1-11,级别越高压缩率越好但CPU消耗越大brotli_types:指定需要压缩的MIME类型brotli_min_length:小于此大小的文件不压缩,避免小文件压缩开销大于收益brotli_static:是否启用预压缩的静态文件(.br后缀)
配置完成后,重启Nginx使配置生效:
nginx -t # 测试配置是否有误
systemctl restart nginx
Apache服务器配置
安装mod_brotli模块
Apache通过mod_brotli模块支持Brotli压缩。以下是安装步骤:
# Ubuntu/Debian系统
sudo apt-get install libapache2-mod-brotli
# CentOS/RHEL系统
sudo yum install mod_brotli
# 启用模块
sudo a2enmod brotli # Debian/Ubuntu
sudo apachectl -M | grep brotli # 验证模块是否加载
Apache配置示例
编辑Apache配置文件httpd.conf或.htaccess文件:
<IfModule mod_brotli.c>
# 启用压缩
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml application/rss+xml
AddOutputFilter BROTLI_COMPRESS .js .css .html .xml .json .rss .txt
# 压缩级别(1-11)
BrotliCompressionLevel 6
# 最小压缩文件大小
BrotliMinimumFileSize 20
# 压缩缓冲区大小
BrotliBufferSize 65536
# 启用预压缩文件检查
BrotliCompressOnDemandState On
</IfModule>
配置说明:
AddOutputFilterByType:对指定MIME类型的内容启用压缩BrotliCompressionLevel:设置压缩级别,建议6-8BrotliMinimumFileSize:设置最小压缩文件大小,单位字节BrotliCompressOnDemandState:启用时会检查是否存在预压缩的.br文件
配置完成后重启Apache:
sudo systemctl restart apache2 # Debian/Ubuntu
sudo systemctl restart httpd # CentOS/RHEL
验证Brotli压缩效果
配置完成后,我们需要验证Brotli压缩是否正常工作。以下是几种验证方法:
使用curl命令验证
curl -I -H "Accept-Encoding: br" https://yourdomain.com/index.html
如果响应头中包含Content-Encoding: br,说明Brotli压缩已生效:
HTTP/1.1 200 OK
Server: nginx/1.18.0
Content-Type: text/html
Content-Encoding: br
Last-Modified: Tue, 10 Aug 2021 10:00:00 GMT
ETag: "12345-67890"
Cache-Control: max-age=3600
Expires: Tue, 10 Aug 2021 11:00:00 GMT
Content-Length: 1234
使用浏览器开发者工具验证
- 打开Chrome/Firefox浏览器
- 按F12打开开发者工具
- 切换到Network标签
- 勾选Disable cache选项
- 刷新页面
- 查看Response Headers中的Content-Encoding是否为br
浏览器验证Brotli压缩
性能对比测试
可以使用brotli命令行工具进行压缩效果测试:
# 测试不同压缩级别对文件的压缩效果
brotli -Z -v test.js # 最高级别压缩
brotli -q 6 -v test.js # 级别6压缩
brotli -d -v test.js.br # 解压并显示详细信息
以下是不同压缩级别下的性能对比(以1MB的JavaScript文件为例):
| 压缩级别 | 文件大小(KB) | 压缩时间(秒) | 解压时间(秒) | 压缩率 |
|---|---|---|---|---|
| 1 | 235 | 0.12 | 0.03 | 76.5% |
| 6 | 182 | 0.45 | 0.02 | 81.8% |
| 9 | 165 | 1.23 | 0.02 | 83.5% |
| 11 | 158 | 3.76 | 0.02 | 84.2% |
从测试结果可以看出,压缩级别从1提高到11,文件大小减少约33%,但压缩时间增加近30倍,而解压时间基本保持不变。因此在实际应用中,建议选择6-8的压缩级别,平衡压缩率和CPU消耗。
预压缩静态资源
为了减少服务器实时压缩的CPU消耗,可以预先生成压缩文件,服务器直接提供预压缩文件。
使用Brotli命令行预压缩
# 压缩单个文件
brotli -q 6 -o styles.css.br styles.css
# 批量压缩目录下所有CSS和JS文件
find /var/www/html -type f \( -name "*.css" -o -name "*.js" -o -name "*.html" \) -exec brotli -q 6 -k {} \;
# 参数说明:
# -q 6: 设置压缩级别为6
# -k: 保留源文件
# -o: 指定输出文件
自动化预压缩脚本
创建一个bash脚本precompress.sh,用于自动化预压缩:
#!/bin/bash
# 预压缩网站静态资源为Brotli格式
# 压缩级别
LEVEL=6
# 需要压缩的文件类型
EXTENSIONS=("css" "js" "html" "xml" "json" "txt" "svg")
# 网站根目录
WEB_ROOT="/var/www/html"
# 压缩文件
for ext in "${EXTENSIONS[@]}"; do
find $WEB_ROOT -type f -name "*.$ext" ! -name "*.br" -exec sh -c '
for file do
# 只压缩大于20KB的文件
if [ $(stat -c%s "$file") -gt 20480 ]; then
echo "Compressing $file"
brotli -q '$LEVEL' -k "$file"
fi
done
' sh {} +
done
echo "Precompression completed!"
将脚本添加到crontab,定期执行以压缩新文件:
# 每天凌晨2点执行预压缩
0 2 * * * /path/to/precompress.sh >> /var/log/brotli-precompress.log 2>&1
配置服务器使用预压缩文件
Nginx配置:
location ~* \.(js|css|html|svg|json|xml|txt)$ {
# 检查是否存在预压缩文件
add_header Vary Accept-Encoding;
expires 1y;
# 尝试提供预压缩文件
try_files $uri.br $uri =404;
}
Apache配置:
<IfModule mod_rewrite.c>
RewriteEngine On
# 检查浏览器是否支持Brotli
RewriteCond %{HTTP:Accept-Encoding} br
# 检查预压缩文件是否存在
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.br -f
# 提供预压缩文件
RewriteRule ^(.*)$ $1.br [L]
# 设置.br文件的Content-Encoding头
<FilesMatch "\.br$">
AddType text/css .css
AddType text/javascript .js
AddType text/html .html
AddType application/json .json
AddType application/xml .xml
AddType text/plain .txt
AddEncoding br .br
Header set Vary "Accept-Encoding"
</FilesMatch>
</IfModule>
常见问题解决
浏览器不支持Brotli怎么办?
虽然现代浏览器都已支持Brotli,但对于老旧浏览器(如IE),需要配置服务器回退到gzip压缩:
Nginx配置:
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
Apache配置:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
</IfModule>
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript
</IfModule>
这样配置后,支持Brotli的浏览器会优先使用Brotli压缩,不支持的浏览器会使用gzip压缩。
压缩后网站出现乱码或错误?
如果压缩后网站出现乱码或错误,可能有以下原因:
- 双重压缩:服务器同时启用了gzip和Brotli压缩
- MIME类型配置错误:压缩了不应该压缩的二进制文件
- 预压缩文件和源文件不同步:更新了源文件但没有重新生成预压缩文件
解决方法:
- 检查配置,确保只启用一种压缩方式,或正确配置优先级
- 限制压缩的MIME类型,只压缩文本类型文件
- 使用自动化脚本确保预压缩文件与源文件同步更新
如何监控Brotli压缩效果?
可以使用以下工具监控Brotli压缩效果:
- PageSpeed Insights:Google提供的网站性能分析工具,会显示压缩效果评分
- WebPageTest:详细的网站性能测试,包括压缩率和节省的字节数
- 浏览器开发者工具:Network标签下可以查看每个资源的压缩情况
监控指标建议:
- 压缩率:目标>70%
- 压缩资源比例:目标>90%的文本资源被压缩
- 首屏加载时间:目标<2秒
总结与最佳实践
Brotli压缩是提升网站性能的有效手段,通过本文介绍的方法,你可以在Nginx或Apache服务器上轻松部署Brotli压缩。以下是最佳实践总结:
- 选择合适的压缩级别:推荐6-8级,平衡压缩率和CPU消耗
- 预压缩静态资源:减少服务器实时压缩的CPU负载
- 合理设置压缩文件类型:只压缩文本类型文件,避免压缩二进制文件
- 设置最小压缩文件大小:通常20KB以上的文件才值得压缩
- 配置浏览器缓存:配合长期缓存使用,最大化压缩收益
- 监控压缩效果:定期检查压缩配置是否正常工作
通过实施这些最佳实践,大多数网站可以减少40-50%的传输大小,显著提升加载速度,改善用户体验,同时降低带宽成本。
项目完整文档和源码可在项目仓库获取。如果你在实施过程中遇到问题,可以查阅项目FAQ或提交issue到项目的问题跟踪系统。
希望本文能帮助你成功部署Brotli压缩,让你的网站更快、更高效!
【免费下载链接】brotli Brotli compression format 项目地址: https://gitcode.com/gh_mirrors/bro/brotli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



