图片WebP批量转换自动化脚本节省海外带宽
海外独立站或轻量应用服务器最头疼的问题之一就是图片流量:一张未压缩的PNG可能几百KB,访客每次翻页都要完整下载,月底看到带宽账单才后悔。
把图片批量转成WebP格式可以显著缩小体积,通常能减少 30%~70% 的传输量。
本文用一套可自动执行的Shell脚本,带你在Linux服务器上完成从图片扫描、转换到输出验证的完整流程,全程不需要手动拖拽处理,适合零基础用户照做。
先确认服务器环境:装好转换核心工具
转换的核心工具是 Google 开源的 cwebp,它包含在 webp 软件包中。
在 Debian/Ubuntu 系统上执行:
sudo apt update
sudo apt install -y webp
在 CentOS/Rocky/Alibaba Cloud Linux 上执行:
sudo yum install -y libwebp-tools
装好后输入 cwebp -version,能输出版本号就代表环境就绪。
如果提示找不到命令,检查一下是否使用了与系统匹配的包管理器,或者用宝塔面板的“软件商店”搜索安装。
自动扫描图片:按目录批量转换并保留原图
脚本逻辑很简单:用 find 找出指定目录下所有 .jpg、.jpeg、.png 文件,再逐张调用 cwebp 转成 .webp。
为了避免误操作,建议先复制原始文件到新目录再转换,或者指定输出目录。
创建脚本文件 convert_webp.sh:
#!/bin/bash
# 将 /www/wwwroot/example.com/wp-content/uploads 下的图片批量转成 WebP
SOURCE_DIR="/www/wwwroot/example.com/wp-content/uploads"
OUTPUT_DIR="/www/wwwroot/example.com/webp_output"
QUALITY=80
mkdir -p "$OUTPUT_DIR"
find "$SOURCE_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | while read -r img; do
# 获取相对路径,保持目录结构
rel_path="${img#$SOURCE_DIR/}"
dest="$OUTPUT_DIR/${rel_path%.*}.webp"
mkdir -p "$(dirname "$dest")"
cwebp -q "$QUALITY" "$img" -o "$dest"
done
echo "转换完成,输出目录:$OUTPUT_DIR"
保存后赋予执行权限并运行:
chmod +x convert_webp.sh
./convert_webp.sh
如果图片数量特别多(比如上万张),建议配合 screen 或 tmux 在后台运行,避免 SSH 断开导致任务中断。
把任务交给Crontab:定时自动处理新增图片
手动跑一次还不够,之后上传的新图片也需要自动转换。
把脚本放入定时任务,每分钟检查一次即可。
执行 crontab -e 添加:
* * * * * /root/convert_webp.sh >> /var/log/webp_convert.log 2>&1
这样脚本每分钟扫描一次,只对尚未生成 WebP 的文件执行转换。
为避免重复处理,可以在脚本开头加一个判断:如果目标 .webp 已存在且源文件更旧,就跳过。
例如:
if [ -f "$dest" ] && [ "$img" -ot "$dest" ]; then
continue
fi
修改后完整脚本会更稳妥,也适合长时间运行。
避坑说明:别让转换后的图片反而变慢
很多新手容易踩几个坑,这里提前列出来:
- 不要过度压缩:
-q参数建议设置在75~85之间。低于 60 时,文字和渐变背景会出现明显色块。 - PNG 透明通道:
cwebp默认支持透明,但如果源图带 Alpha 通道,请尽量保持原尺寸,避免额外缩放。 - 目录权限:脚本执行用户必须对
$SOURCE_DIR有读取权限,对$OUTPUT_DIR有写入权限,否则会遇到Permission denied。 - 原图保留:转换后不要把原始图片立即删除,先确认 WebP 在浏览器和 CDN 上都显示正常再清理。
- CDN 缓存问题:如果站点接了 CDN,WebP 路径和原图路径不同,需要先在 CDN 后台刷新缓存,否则访客可能仍然命中旧的图片版本。
如何验证是否真的节省了带宽
打开输出目录,用 ls -lh 对比原图和 WebP 的体积:
ls -lh /www/wwwroot/example.com/webp_output/sample.webp
ls -lh /www/wwwroot/example.com/wp-content/uploads/sample.png
通常能明显看到体积下降。
更严谨的做法是在网页层面验证:用浏览器开发者工具的 Network 面板,勾选 “Disable cache” 后刷新页面,查看图片请求的 Transfer Size 合计值。
如果站点已启用 WebP 访问,这个数值会比之前低不少。
如果你用的是 Nginx,还可以在 location ~* \.(jpg|png)$ 中加一段 try_files 规则,当同名 .webp 存在时直接输出 WebP 文件,让浏览器无需修改任何图片标签就能生效。
不过这一步涉及更复杂的配置,建议先跑通基础脚本,再根据实际需求做进一步优化。
遇到转换失败时,优先检查脚本中的 SOURCE_DIR 路径是否存在、cwebp 是否安装成功,以及日志文件 /var/log/webp_convert.log 中的错误信息。
按照上述步骤操作,海外站点的图片流量很快就能看到明显下降。