Проблема Загрузка файлов из приложения Rails, размещенного на Elastic Beanstalk
У меня есть приложение Rails 3, которое я разрабатываю локально и внедряю на Amazon Elastic Beanstalk для производства. В моем приложении есть несколько мест, где изображения могут быть загружены через формы HTML. После загрузки я отправляю файлы на S3 для хранения. У меня нет проблем с этим рабочим процессом при локальной разработке, но в процессе работы я получаю ответ 500 Внутренняя ошибка сервера во время загрузки (я уверен, что это до какого-либо взаимодействия с S3).
Я зашёл в мой экземпляр 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", реферер: " Jeff Atwood"
У кого-нибудь есть мудрые слова о том, почему я не могу загрузить файл в Elastic Beanstalk из моего Rails?
Заранее спасибо за помощь!
3 ответа
После некоторых исследований я считаю, что проблема заключается в том, что ежедневный cronjob (/etc/cron.daily/tmpwatch) удаляет каталог passenger-standalone.*, Который важен для загрузки файлов.
Я смог снова загрузить загрузку, перезапустив сервер приложений. Для более долгосрочного исправления я обновил скрипт 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, если это вообще возможно, особенно когда мое приложение масштабируется и появляется больше экземпляров.
Надеюсь исправлено в следующей версии:)
http://code.google.com/p/phusion-passenger/issues/detail?id=654
Вы рассматривали возможность прямой загрузки изображений в s3? Загрузка на сервер в Elastic Beanstalk в некотором роде идет вразрез с духом вещей (файл может быть удален, если экземпляр исчезает, следующий запрос может быть получен другим экземпляром и т. Д.). Я также не являюсь системным администратором и использую эластичный бобовый стебель по той же причине.
По сути, я пытаюсь сказать, что, перейдя к загрузке непосредственно в s3, вы сможете оставить свои серверы обслуживающими, ваша база данных будет базироваться на ваших данных, а ваше хранилище файлов будет хранить ваши файлы. Тогда, надеюсь, вы можете быть защищены от этой ерунды:)