问题从Elastic Beanstalk上托管的Rails应用程序上传文件

时间:2013-03-30 01:50:36

标签: ruby-on-rails ruby-on-rails-3 file-upload elastic-beanstalk

我有一个Rails 3应用程序,我正在本地开发并部署在Amazon的Elastic Beanstalk上进行生产。我的应用程序中有几个地方可以通过HTML表单上传图像。上传后,我将文件发送到S3进行存储。在本地开发时我对此工作流程没有任何问题,但在生产中,我在上传期间收到了500内部服务器错误响应(我很确定它是在与S3进行任何通信之前)。

我在我的EC2实例中找到了/var/app/support/logs/passenger.log中发现错误的痕迹。这是上传过程中生成的行。

2013/03/30 00:58:52 [暴击] 1723#0:* 196227 open()“/ tmp /passenger-standalone.1645 / client_body_temp / 000000000014”失败(2:没有这样的文件或目录), client:ip_address,server:_,request:“POST / admin / users / 1 HTTP / 1.1”,host:“www.my_domain.com”,referrer:“https://www.my_domain.com/admin/users/1/edit

有没有人知道为什么我无法从Rails上传文件到Elastic Beanstalk?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

经过一番研究,我认为问题是每日cronjob(/etc/cron.daily/tmpwatch)正在删除对文件上传至关重要的乘客独立。*目录。

我可以通过重新启动应用服务器再次上传。对于更长期的修复,我更新了tmpwatch脚本以排除模式'/ tmp / passenger *'(见下文)。

#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/tmp/hsperfdata_*' -X '/tmp/passenger*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

是否还有其他人为此问题找到了解决方案?我不是一个系统管理员(这是我选择使用Elastic Beanstalk的一个重要原因),所以如果可能的话,我宁愿不破解EC2实例 - 特别是当我的应用程序扩展并生成更多实例时。

答案 1 :(得分:1)

希望在下一个版本中修复:)

http://code.google.com/p/phusion-passenger/issues/detail?id=654

答案 2 :(得分:0)

您是否考虑过直接将图片上传到s3?在Elastic Beanstalk中上传到服务器有点违背事物的精神(如果实例消失,则可以删除文件,下一个请求可以由不同的实例接收,等等)。我也不是系统管理员,因为同样的原因,我正在使用弹性beanstalk。

基本上我想说的是,通过直接上传到s3,你应该可以让你的服务器服务,你的数据库基于数据,你的文件存储存储你的文件。希望你能免于这种废话:)