6

ローカルで開発し、本番用に Amazon の Elastic Beanstalk にデプロイしている Rails 3 アプリがあります。私のアプリには、HTML フォームを介して画像をアップロードできる場所がいくつかあります。アップロード後、ファイルを S3 に送信して保存します。ローカルで開発している間はこのワークフローに問題はありませんが、本番環境では、アップロード中に 500 Internal Server Error 応答が返されます (S3 との通信前であると確信しています)。

EC2 インスタンスに SSH 接続したところ、/var/app/support/logs/passenger.log にエラーの痕跡が見つかりました。アップロード中に生成される行は次のとおりです。

2013/03/30 00:58:52 [クリティカル] 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) が、ファイルのアップロードに重要なパッセンジャースタンドアローン.* ディレクトリを削除していることだと思います。

アプリサーバーを再起動することで、アップロードを再び機能させることができました。より長期的な修正として、パターン '/tmp/passenger*' を除外するように tmpwatch スクリプトを更新しました (以下を参照)。

#! /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 に答える