6

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

我通过 ssh 进入我的 EC2 实例,在 /var/app/support/logs/passenger.log 中发现了错误的痕迹。这是上传期间生成的行。

2013/03/30 00:58:52 [crit] 1723#0: *196227 open() "/tmp/passenger-standalone.1645/client_body_temp/0000000014" 失败(2:没有这样的文件或目录),客户端:ip_address ,服务器:_,请求:“POST /admin/users/1 HTTP/1.1”,主机:“www.my_domain.com”,引用者:“ https://www.my_domain.com/admin/users/1/edit "

有没有人对我为什么无法从 Rails 将文件上传到 Elastic Beanstalk 有任何智慧之言?

在此先感谢您的帮助!

4

3 回答 3

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 实例——尤其是当我的应用程序扩展并产生更多实例时。

于 2013-03-31T00:49:22.373 回答
1

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

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

于 2013-05-25T13:57:56.087 回答
0

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

基本上我想说的是,通过直接上传到 s3,您应该能够让您的服务器继续服务,您的数据库基于数据,您的文件存储存储您的文件。那么希望你能免受这种胡说八道的影响:)

于 2013-04-28T22:39:45.277 回答