本文开头我要说一个重要的事,很多同类教程都跳过了:WordPress 上传一张图片后,会自动生成多个缩略图。一张原图背后可能跟着 5-8 个不同尺寸的副本。你以为媒体库有 2000 张图片,服务器上实际存的文件数量可能超过 1 万。
所以第一步不是装工具,是先搞清楚你面对的规模:
# 统计图片文件数量
find /www/wwwroot/example.com/wp-content/uploads \
-type f \
-iname "*.jpg" -o \
-iname "*.jpeg" -o \
-iname "*.png" | wc -l
# 查看目录总占用
du -sh /www/wwwroot/example.com/wp-content/uploads
数字出来之后,你会对接下来的操作有更准确的预期。
备份:这步不能省
批量压缩是直接修改原文件的操作,没有撤销。建议在执行任何压缩命令之前,先做备份:
cd /www/wwwroot/example.com
tar -czf ~/uploads-backup-$(date +%Y%m%d).tar.gz \
wp-content/uploads
图片很多的话这个命令会跑一段时间,耐心等待。如果 VPS 有快照功能(DigitalOcean、Vultr 都有),在操作前打一个快照是更稳妥的选择。
备份完成后再继续。
方法一:jpegoptim 批量压缩 JPG
jpegoptim 是专门处理 JPEG 的工具,支持设置质量参数,操作简单,是处理 JPG 图片最直接的选择。
安装(Ubuntu / Debian):
apt update && apt install jpegoptim -y
先测试单张图片,看看压缩效果:
jpegoptim --max=85 --stdout test.jpg > /dev/null
确认效果可以接受之后,批量处理整个 uploads 目录:
find /www/wwwroot/example.com/wp-content/uploads \
-type f \
\( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec jpegoptim --max=85 {} \;
--max=85 表示将 JPEG 质量控制在 85,这对大多数网站图片来说是比较合适的平衡点。如果你的图片本来质量就不高,可以适当调低到 80,但建议先抽几张测试,不要直接全量套用。
如果想在不损失质量的前提下做无损优化(去除 EXIF 等元数据):
find /www/wwwroot/example.com/wp-content/uploads \
-type f \
\( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec jpegoptim --strip-all {} \;
方法二:optipng 压缩 PNG
PNG 适合透明背景、Logo、图标这类图片,不适合用 JPEG 的压缩逻辑处理。optipng 对 PNG 做无损压缩,不影响画质。
安装:
apt install optipng -y
批量处理:
find /www/wwwroot/example.com/wp-content/uploads \
-type f -iname "*.png" \
-exec optipng -o2 {} \;
-o2 是优化级别,范围 0-7,数字越高压缩越彻底但耗时越长。-o2 是速度和效果的平衡点,生产环境推荐这个值。如果服务器空闲时间多,可以用 -o4,但不建议在访问高峰期跑。
方法三:ImageMagick 综合处理
ImageMagick 功能最全,既能压缩 JPG 和 PNG,也能做格式转换和批量重命名。
安装:
apt install imagemagick -y
验证安装:
magick -version
单张测试(不覆盖原文件):
magick input.jpg \
-strip \
-quality 85 \
output.jpg
-strip 会删除 EXIF、ICC 色彩配置等元数据,通常能额外减少 5-15% 的文件大小,对网页显示没有影响。
批量处理时,我建议用下面这个脚本,而不是直接用 find -exec magick 覆盖原文件。这个脚本会先输出到临时文件,比较大小之后只在压缩后更小的情况下才替换原文件:
#!/bin/bash
UPLOAD_DIR="/www/wwwroot/example.com/wp-content/uploads"
QUALITY=85
find "$UPLOAD_DIR" \
-type f \
\( -iname "*.jpg" -o -iname "*.jpeg" \) | \
while read -r img; do
tmp="${img}.tmp.jpg"
magick "$img" -strip -quality $QUALITY "$tmp"
orig_size=$(stat -c%s "$img")
new_size=$(stat -c%s "$tmp")
if [ "$new_size" -lt "$orig_size" ]; then
mv "$tmp" "$img"
echo "Compressed: $img ($orig_size -> $new_size)"
else
rm "$tmp"
echo "Skipped (no gain): $img"
fi
done
把脚本保存为 compress.sh,赋权后运行:
chmod +x compress.sh
bash compress.sh
方法四:转换为 WebP
WebP 通常比同质量的 JPG 体积更小,现代浏览器支持率很高,是 2026 年值得考虑的方向。
安装 cwebp:
apt install webp -y
单张转换测试:
cwebp -q 82 input.jpg -o output.webp
批量转换:
find /www/wwwroot/example.com/wp-content/uploads \
-type f \
\( -iname "*.jpg" -o -iname "*.jpeg" \) | \
while read -r img; do
cwebp -q 82 "$img" \
-o "${img%.jpg}.webp" 2>/dev/null
done
重要提醒: 转换成 WebP 之后,原来的 JPG 文件不要立刻删除。WordPress 数据库里的媒体库记录还指向 JPG,直接删掉会导致图片 404。正确的做法是在 WordPress 里安装支持 WebP 的插件(比如 WebP Express),让服务器在浏览器支持时自动返回 WebP 版本,不支持时返回原始 JPG,两个文件并存。
另外,不要只把 .jpg 改成 .webp 后缀,那只是改了文件名,格式没有变,图片会损坏。必须用转换工具真正重新编码。
关于 AVIF
AVIF 压缩效率通常好于 WebP,但编码速度慢很多,批量处理大量图片时 CPU 占用会很高。目前对于大多数 VPS 建站用户来说,WebP 是更实际的选择。如果你的网站图片量不大,或者服务器有足够的空闲算力,可以用 avifenc 尝试,但不是这篇教程的重点。
控制 VPS 资源占用
批量处理图片会消耗 CPU 和磁盘 IO,在生产服务器上跑会影响正常访问。建议用 nice 和 ionice 降低任务优先级:
nice -n 15 ionice -c 3 \
find /www/wwwroot/example.com/wp-content/uploads \
-type f \
\( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec jpegoptim --max=85 {} \;
nice -n 15 把 CPU 优先级降到较低水平,ionice -c 3 让磁盘 IO 在系统空闲时才执行。在访问低谷(比如凌晨)运行也是好办法,用 cron 定时触发:
# 每天凌晨 3 点执行
crontab -e
0 3 * * * nice -n 15 bash /root/compress.sh >> /root/compress.log 2>&1
验证压缩结果
压缩完成后,用 ImageMagick 批量验证图片文件完整性:
find /www/wwwroot/example.com/wp-content/uploads \
-type f \
\( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) \
-exec magick identify {} \; > /root/image-check.txt 2>&1
检查 image-check.txt,如果有损坏的图片会报错,可以从备份里恢复对应文件。
同时在浏览器里随机打开几个 WordPress 页面,确认图片显示正常,缩略图没有问题。
FAQ
压缩 WordPress 图片会影响 SEO 吗? 不会,图片压缩后体积更小,加载更快,反而对 Core Web Vitals 和 SEO 有正面影响。但要确保压缩后图片质量可接受,不能让图片明显模糊。
jpegoptim 的 --max 参数设多少合适? 没有绝对答案。80-85 是常见的平衡点,但不同类型的图片差异很大。产品图、摄影图对质量敏感,图标、截图对质量不敏感。建议先抽 10-20 张有代表性的图片测试,确认效果再全量执行。
PNG 可以转换成 JPG 来减少体积吗? 可以,但 PNG 如果有透明背景,转换成 JPG 后透明部分会变成白色或黑色,破坏图片效果。Logo、图标类图片通常不适合转 JPG。纯色照片类的 PNG 转 JPG 没问题。
压缩后 WordPress 缩略图需要重新生成吗? 不需要,jpegoptim 和 optipng 是原地修改文件,文件名和路径不变,WordPress 数据库里的引用不受影响。转 WebP 是另外生成新文件,原有缩略图不受影响。
低配 VPS(1 GB 内存)可以跑这些命令吗?
可以,但建议用 nice 降低优先级,在访问低谷时执行,避免影响正常访问。AVIF 转换对 CPU 要求较高,1 GB 内存的 VPS 不建议批量转 AVIF。
压缩完之后要清理什么吗?
备份文件(uploads-backup-*.tar.gz)在确认压缩结果正常后可以删除,或者移到对象存储里节省本地磁盘空间。临时脚本文件视情况保留或删除。