Drupal 7+AWS ELB多EC2实例下Plupload上传图片报错求助
解决Drupal 7+ELB+Auto Scaling下Plupload临时文件找不到的问题
我之前在处理Drupal 7搭配AWS ELB和Auto Scaling的架构时,遇到过完全一样的Plupload批量上传问题。你的情况核心原因很明确:Plupload的临时文件默认存在单台EC2实例的本地磁盘,高负载时Auto Scaling新增实例后,ELB会把后续的上传请求分发到不同的实例,新实例根本找不到之前上传到其他实例的临时文件,就会抛出你看到的报错。
下面是几个可行的解决方案,按推荐优先级排序:
1. 配置共享临时文件存储(最推荐,根治问题)
使用AWS EFS(弹性文件系统)作为所有EC2实例的共享临时目录,这样不管请求路由到哪台实例,都能访问到同一个临时文件存储位置:
- 先创建并配置EFS,确保所有EC2实例所在的VPC和安全组能访问它;
- 将EFS挂载到每台EC2实例的同一个路径,比如
/mnt/efs/tmp; - 修改Drupal的临时文件路径配置,在
sites/default/settings.php中添加或修改:$conf['file_temporary_path'] = '/mnt/efs/tmp'; - 确保Web服务器用户(比如
apache或nginx)对这个共享目录有读写权限:chown -R apache:apache /mnt/efs/tmp chmod -R 775 /mnt/efs/tmp
2. 开启ELB会话粘性(临时缓解方案)
如果暂时来不及配置共享存储,可以开启ELB的会话粘性(Sticky Sessions),让同一个用户的所有请求都固定路由到同一台EC2实例,这样临时文件就能在同一台实例上被找到。不过要注意:
- 这只是临时方案,Auto Scaling缩容销毁实例时,用户的会话和未完成的上传会直接失败;
- 会话粘性会降低ELB的负载均衡效果,不适合长期依赖。
3. 调整Plupload上传配置
修改Plupload的上传模式,跳过本地临时文件直接上传到目标目录,或者确保分块上传的每个分块能被所有实例访问:
- 进入Drupal的Plupload配置页面(路径通常是
admin/config/media/plupload); - 查找是否有“直接上传到目标目录”的选项,开启它;
- 如果是分块上传,确保分块存储的路径是共享目录(和方案1的共享路径一致)。
4. 检查并统一实例权限
确保所有EC2实例上的Drupal相关目录权限一致,Web服务器用户拥有足够的读写权限,避免因为权限问题导致临时文件无法被读取或写入。
优先推荐第一种方案,共享存储从根本上解决了多实例环境下的文件共享问题,适合长期运行的高可用站点。
内容的提问来源于stack exchange,提问作者user8550844
相关产品推荐
相关产品推荐

