最近批量导入了一批 Magento 产品信息,不知道为何直接导致服务器磁盘空间被占满。 而导入的产品也不多,不到1万个,理论上不应该占用上 G 的空间啊。
使用 ncdu 工具排查
使用之前的磁盘空间分析工具 ncdu。使用方式参考: 使用 ncdu 命令分析 linux 磁盘空间占用
发现,最占磁盘空间是 Magento 的项目目录。占了 76 G。
然后,在结果里面逐级进入子目录,发现最占空间的 Magento 子目录是:
pub/media/catalog/product/cache
占了 56 个G。这个目录里全部是产品图片的缓存,即各种尺寸的缩略图。
不得不说,ncdu 真是运维神奇啊。
同一张图片多个拷贝
比较诡异的是,进入 pub/media/catalog/product/cache 下面的最终子目录,会看到很多同名的图片文件,只是数字后缀不同。 例如:
- image_1.jpg
- image_2.jpg
- image_3.jpg
- ...
从文件大小看,是完全一样的大小,推测就是同一张图片的多个拷贝。从浏览器链接访问,发现确实都是一样的图片。
那么,为什么会有这么多同一张图片的拷贝呢?估计是批量导入时,很多产品的图片是相同的,导致 Magento 生成了很多重复的缓存图片。 但是,就算是这样,也不应该占用这么多空间啊。
官方的两个讨论
- https://github.com/magento/magento2/issues/32118
- https://github.com/magento/magento2/issues/29964
完全一样的问题,而且版本也对的上。有人反馈 2.4.6 也遇到了。
其中一个解决方案,就是禁用 CSP 模块。
禁用 CSP
如果不了解什么是 CSP,可以参考:开源商城系统 Magento 修改 Content Security Policy (CSP) 配置,添加新域名白名单
Content Security Policy 是一种安全机制,旨在减少跨站脚本攻击 (XSS) 的风险。
CSP 就是个 js 白名单功能,我感觉跟 cache 没有任何关系。。。但是这两个讨论里都说有效。
Thanks for all the feed-back. I can confirm to you that disabling Magento_Csp module resolved the issue on Magento 2.4.1 version I have. My cache only grew to 600MB and is stable now compared to multiple GB previous days. This is inline with my experience on Magento 2.3.3. Thanks for the help and prompt feed-back. I really appreciate it!!!
禁用命令:
php bin/magento module:disable Magento_Csp
然后清理缓存:
php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -f
php bin/magento cache:flush
清理图片缓存
因为只剩下 100M 的空间了,不得已,只能先删除图片缓存目录。 从 Magento 管理后台操作就行:
System -> Cache Management -> Flush Catalog Images Cache (页面最底部)
然后,再点击右上角的 Flush Magento Cache 按钮。
一顿操作之后,磁盘空间终于释放了 70G。
等待
只能观察一天了,看看图片缓存还会不会继续增长。
从 Magento Github Issue 的讨论来看,Magento 的官方开发团队确实不太行。 很多问题,拖了几年都没有解决。而且性能还这么差,确实复杂的系统,维护成本太高了。
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式