Wolf's Blog - Linux https://www.guwolf.com/category/Linux/ Nginx开启Brotli压缩以及预压缩文件 https://www.guwolf.com/archives/nginx-brotli.html 2025-08-25T21:07:00+08:00 什么是Brotli ?Brotli是Google在2015年推出的压缩算法,目前各大浏览器均已支持Brotli,相比Gzip,有着更高的压缩率(尤其在处理CSS、JS、HTML这类文件),解压速度却相差无几,这意味着它有着更小的数据传输量,对于网络环境较差、带宽受限的用户或移动端访问者而言,能直接转化为更快的页面加载速度和更流畅的交互体验。所以对于弱网环境下(如跨国传输),一个可行的优化思路是优先使用Brotli,对于不支持Brotli的浏览器,再回退到Gzip。当然,更高的压缩率比如会带来压缩时更大的CPU开销,所以我们接下来也会介绍预压缩这种解决方案来缓解这个问题。启用Brotli编译具有brotli模块的Nginx获取源代码先克隆ngx\_brotli源代码到本地git clone始化和同步ngx\_brotli的子模块cd ngx_brotli && git submodule update --init下载Nginx的源码并解压wget https://nginx.org/download/nginx-1.28.0.tar.gz && tar zxvf nginx-1.28.0.tar.gz保留原编译参数并编译安装依赖库apt update && apt install libbrotli-dev进入源代码目录cd nginx-1.28.0首先查看当前的Nginx编译参数nginx -V生成Makefile并编译./configure [原参数] --add-module=[ngx_brotli路径] make编译好的二进制在 objs/nginx ,先把原来的nginx二进制复制一份用于防止意外,然后替换原来的二进制文件编辑nginx配置文件在http块下加入http { ... brotli on; brotli_comp_level 6; brotli_min_length 512; brotli_types text/plain text/javascript text/css text/xml text/x-component font/opentype application/json; brotli_static on; ...参数解释指令名称语法格式默认值作用域描述重要参数说明brotli_staticon , off , alwaysoffhttp, server, location启用/禁用预压缩文件(.br)检测-on:客户端支持Brotli时返回.br文件- always:强制返回.br文件(无论客户端是否支持)brotlion , offoffhttp, server, location, if启用/禁用动态响应压缩需与brotli_types配合使用brotli_types [mime_type ...] , *text/htmlhttp, server, location指定启用压缩的MIME类型-*:压缩所有类型- text/html 始终被压缩(无需声明)brotli_buffers -http, server, location已废弃(配置会被忽略)历史遗留参数,无实际作用brotli_comp_level``6http, server, location设置动态压缩级别范围:0-11- 0:最快(最低压缩)- 11:最慢(最高压缩)brotli_window``512khttp, server, location设置滑动窗口大小(影响压缩率和内存)有效值:1k,2k,4k,8k,16k,32k,64k,128k,256k,512k,1m,2m,4m,8m,16mbrotli_min_length``20http, server, location设置启用压缩的最小响应长度(仅依据Content-Length头)单位:字节建议值:≥256(避免小文件压缩得不偿失)处理Brotli预压缩预压缩可以减少CPU开销,由于动态压缩会在每次请求(尤其是高并发下)对CPU造成压力,无论你是想优化并发性能还是想得到更高的压缩率,都建议使用Brotli预压缩,在打开了 brotli_static 项的时候nginx会先检测当前访问的文件是否有 .br 的预压缩文件并返回 (如果有的话,直接返回预压缩文件,没有的话再根据 brotli 项是否开启,决定是否进行动态压缩)。所以我们可以写一个脚本去处理预压缩#!/bin/bash WEB_ROOT="/aaa/www" 网页根目录 COMP_LEVEL=11 # 压缩级别 (0-11) LOG_FILE="/var/log/br.log" #存储日志的路径 # 创建日志目录 mkdir -p "$(dirname "$LOG_FILE")" # 查找需要压缩的文件 find "$WEB_ROOT" -type f \( \ -name "*.html" -o \ -name "*.css" -o \ -name "*.js" -o \ -name "*.xml" -o \ -name "*.json" -o \ -name "*.svg" -o \ -name "*.ttf" -o \ -name "*.woff" -o \ -name "*.woff2" \ \) | while read -r file; do # 跳过已压缩文件(如果源文件未修改) if [ -f "$file.br" ] && [ "$file" -ot "$file.br" ]; then continue fi # 记录压缩开始时间 start_time=$(date +%s) # 执行压缩(修正后的命令) brotli --quality="$COMP_LEVEL" --force --keep --output="$file.br" "$file" # 记录压缩结果 end_time=$(date +%s) orig_size=$(stat -c%s "$file") comp_size=$(stat -c%s "$file.br") ratio=$(echo "scale=2; $comp_size * 100 / $orig_size" | bc) echo "[$(date '+%Y-%m-%d %H:%M:%S')] Compressed: $file" >> "$LOG_FILE" echo " Original: $orig_size bytes, Compressed: $comp_size bytes, Ratio: ${ratio}%" >> "$LOG_FILE" echo " Time taken: $((end_time - start_time)) seconds" >> "$LOG_FILE" echo "----------------------------------------" >> "$LOG_FILE" done echo "Completed. Log saved to: $LOG_FILE"这样,在每次文件发生变化的时候都运行一次,我们就可以使用最高的压缩率和最小的CPU开销来响应请求了。 树莓派3B+搭建openwrt/lede软路由之编译固件篇 https://www.guwolf.com/archives/resros-1.html 2020-03-03T22:12:00+08:00 前段时间鸽子御坂在折腾软路由搞得我心痒痒,疫情多出来的假期正好可以用来折腾软路由,原打算是买一块j1900的X86板子回来做软路由的,因为其功耗比较低(说白了就是为了省电费),然而一次在收拾桌子时从抽屉发现了一块尘封一年多的树莓派,那原本是我之前买回来玩iot(物联网),玩完之后就放在桌子上了,因为日常事务繁重,渐渐地就把它忘了。这次正好找到它,就不用再耗时耗费去买j1900的板子做软路由了,而且鉴于其小巧摆在桌子上也不怎么碍事,然后“工作重心”就从x86平台转到了ARM平台,那么废话不多说下面就来看看,如何在树莓派上安装上openwrt/lede的软路由系统吧让我们请出这次的主角---树莓派3B+在配置方面其搭载了一块64位四核的BCM2837处理器,其拥有1.2Ghz的主频,处理器比PI2的BCM2836有着50%的速度提升,搭载的运存却仅有1G,不过也足以胜任openwrt/lede这个系统了OK,下面我们来讲讲编译此次编译的系统环境是Debian,理论上本文章也是可以适用于Ubuntu的一、安装编译环境及依赖先更新一下软件源和软件apt update && apt upgrade安装编译环境和编译依赖apt -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex node-uglify gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx-ucl libelf-dev autoconf automake libtool autopoint gcc g++ cmake vim wget ntp ntpdatePS:此操作请在root用户下进行哦二、开始编译把lede源码clone下来git clone https://github.com/coolsnowwolf/lede cd lede更新依赖源./scripts/feeds update -a ./scripts/feeds install -a下面这个命令会检查编译所需的工具是否齐全并生产配置文件.configmake defconfig进入编译内容配置菜单make menuconfigPS:这一步建议不要在root用户下进行警告:最好使用国外的服务器进行编译,防止更新编译依赖源时某些源被屏蔽造成编译失败,国内请自行解决被墙的问题如果需要Lienol的passwall插件的话请在执行上述命令的“cd lede”之后在feeds.conf.default文件添加:src-git lienol https://github.com/Lienol/openwrt-package进入编译内容配置菜单之后,可以使用上下键选择选项,Target System就是选择系统所要运行的平台,BCM27XX就是树莓派的ARM平台。第二个Subtarget就是选择cpu及系统的位数bcm2708 对应 树莓派1bcm2709 对应 树莓派2bcm2710 对应 树莓派3bcm2711 对应 树莓派4Target Images 是固件镜像选项菜单ext4和squashfs两项为编译生成的镜像中分区的格式,这两者的区别除了文件系统不一致之外,还有一个区别就是squashfs格式的固件支持在控制面板内恢复出厂设置,而ext4格式不支持,但ext4格式的固件在分区上的自由度上大一些 (比如可以比较方便地调整分区大小等)。Root filesystem partition size = 160这个是镜像中root分区的大小,我们可以尽量将 root 分区设定得大一些 (方便日后的折腾)。Administration 菜单下是选择一些管理工具(其他参数请自行百度)每次编辑完之后Save保存到.config配置文件,然后退出即可。三、下载编译依赖的源码make download V=sPS:配置完成后需要下载你所选择的那些软件,OpenWrt仅有编译及配置指令,各种依赖的代码包依然在代码仓库里。四、开始编译系统建议使用screen来避免编译过程中因各种不可预测的原因断开与服务器连接使编译中断make V=s出错后使用单线程,以方便排错make V=s -j1四、编译成功编译如果没有报错,那文件就应该在bin/targets/你选的CPU架构/你选的CPU型号/文件夹里,找到xxx-factory.img.gz并解压得到xxx-factory.img文件就是我们这次编译的成果。在这里博主也为大家附上了编译好的固件,里面包含了众多应用和插件和众多的网卡驱动,可以在树莓派2B/2B+/3B/3B+/4上使用(通用)点击此处下载注意:文章提供的固件编译自发表日,如需较新固件建议自己编译下一篇文章将介绍 openwrt/lede 的配置如果有什么报错不知道该如何解决的话,欢迎在下方评论区写出来,也可通过qq联系博主版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请标明出处链接和此声明