上传时能看到临时预览,保存商品后图片变成 404,说明临时文件上传没问题,故障多半发生在从 media/tmp/catalog/product 移到正式目录或生成缓存图的阶段。

对着404地址检查原图和缓存图

假设页面请求:

/media/catalog/product/cache/.../a/b/abc.jpg

先找原图:

find pub/media/catalog/product -path '*a/b/abc.jpg' -ls

原图不存在,就看保存商品时的 exception.log,以及 PHP-FPM 用户是否能写 pub/media/catalog/product。原图存在而 cache 路径没有,则测试:

php bin/magento catalog:images:resize

权限要按运行用户修,不要chmod 777

确认 CLI 用户、PHP-FPM 用户和部署用户的组关系,再设置目录组写权限与 setgid。例如实际用户组为 www-data 时:

chgrp -R www-data pub/media
find pub/media -type d -exec chmod 2775 {} +
find pub/media -type f -exec chmod 664 {} +

命令里的用户组必须按服务器实际情况调整。还要确认 ImageMagick/GD 可用,以及 Nginx 的 /media/ 规则没有把不存在的缓存图直接永久缓存成 404。

最后重新保存同一商品,确认原图已移动、resize 命令无异常、前台缩略图 200。只清浏览器缓存而没检查文件落盘,不算修好。