这类问题我又碰上了一次。Nginx 启用了 WebP 自动转换,部分 jpg 转出来的文件是 0 字节,响应头仍写 200 和 image/webp,图片搜索里这些图全是破图,用户点进去也打不开。
原因不止一个,得分开看。转换进程并发写同一个临时文件,后写的覆盖成空;源图本身损坏,转换工具静默输出空文件;缓存层把上一次转换失败的 0 字节结果长期缓存。
先抽查图片实际大小和响应头
curl -sI https://www.example.com/img/a.webp | grep -Ei 'content-length|content-type'
接着找出所有 0 字节的 webp 文件
find /data/uploads -name '*.webp' -size 0 | head
等前面都确认过,再删掉坏文件并清节点缓存
curl -X PURGE https://www.example.com/img/a.webp
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
恢复的判定其实很直接。清理后图片搜索里的破图逐步消失,日志中 0 字节的 200 响应不再出现。
提醒一点。批量转换要在临时文件写完后再原子改名,直接覆盖原路径会留下大量半截文件。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
