DigitalOcean部署的Strapi(v3.6.8)批量上传图片报错如何解决?
故障根因
- 内存溢出触发系统OOM终止进程:1核1GB配置的云服务器无默认交换分区,Strapi v3.6.8处理批量图片上传时,需要同时执行多图解码、多规格缩略图生成、数据批量写入操作,峰值内存占用很容易突破1GB上限,被系统强制杀死进程。
- 数据丢失由异常终止+存储配置不合理导致:你使用的是Strapi默认的SQLite数据库,进程异常中断时极易损坏数据库文件;如果同时未配置固定JWT密钥,进程重启后会自动生成新的鉴权密钥,原有会话签名校验失败,就会弹出
invalid credentials、invalid credentials signature报错。 - 单张上传可以正常运行的原因是单图处理的资源消耗远低于批量上传,不会触发内存阈值。
修复步骤
1. 解决内存不足问题
临时缓解方案,添加1GB交换分区:
fallocate -l 1G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab
长期方案:将服务器配置升级到2核2GB,符合Strapi v3生产环境最低运行要求。
2. 修复数据丢失与鉴权报错问题
固定鉴权密钥,在项目根目录.env文件添加以下配置:
JWT_SECRET=自定义的32位以上随机字符串 ADMIN_JWT_SECRET=自定义的32位以上随机字符串
修改数据库存储路径到持久化目录,编辑config/database.js:
module.exports = ({ env }) => ({ defaultConnection: 'default', connections: { default: { connector: 'bookshelf', settings: { client: 'sqlite', filename: env('DATABASE_FILENAME', './data/data.db'), // 不要存放在tmp等临时目录 }, options: { useNullAsDefault: true, }, }, }, });
手动创建./data目录并赋予写入权限:
mkdir data chmod 755 data
3. 调整上传配置降低资源消耗
编辑config/middleware.js调高上传大小限制:
module.exports = { settings: { parser: { enabled: true, multipart: true, formLimit: '100mb', jsonLimit: '100mb', }, }, };
编辑config/plugins.js关闭不需要的缩略图规格,降低批量上传时的内存占用:
module.exports = { upload: { provider: 'local', providerOptions: { sizeLimit: 10 * 1024 * 1024, }, breakpoints: { large: null, medium: null, thumbnail: { width: 200, height: 200, }, // 仅保留需要的缩略图规格即可 }, }, };
4. 优化进程管理配置
如果使用pm2管理进程,创建ecosystem.config.js配置内存阈值:
module.exports = { apps: [ { name: 'strapi-app', script: 'npm', args: 'start', instances: 1, autorestart: true, max_memory_restart: '800M', env: { NODE_ENV: 'production', }, }, ], };
内容的提问来源于stack exchange,提问作者pawel-mielech
相关产品推荐
相关产品推荐

