6

로컬로 개발 중이며 Amazon Elastic Beanstalk에서 프로덕션을 위해 배포중인 Rails 3 응용 프로그램이 있습니다. HTML 양식을 통해 이미지를 업로드 할 수있는 앱이 여러 곳 있습니다. 업로드가 끝나면 저장을 위해 파일을 S3로 보냅니다. 로컬로 개발하는 동안이 워크 플로에는 아무런 문제가 없지만 프로덕션 환경에서는 업로드하는 동안 500 개의 내부 서버 오류 응답이 표시됩니다 (S3과의 통신 전에는 확실합니다).호 Elastic Beanstalk에서 호스팅되는 Rails 응용 프로그램에서 파일 업로드

내 EC2 인스턴스로 ssh 접속하여 /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 : 해당 파일 또는 디렉토리 없음) 호스트 : "www.my_domain.com", 참조 자 : "https://www.my_domain.com/admin/users/1/edit"

지혜의 단어가없는 사람은 누구입니까? 왜 Rails에서 Elastic Beanstalk에 파일을 업로드 할 수 없습니까?

미리 도움 주셔서 감사합니다.

+0

이 끔찍한 신인 실수 나에게로부터 면역이 될 수 있습니다. 로컬로 설치를 번들해야했습니다. 영웅에 대해서는 이런 종류의 오류 메시지를받는 데 익숙해졌습니다. – colllin

답변

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을 사용하는 큰 이유 인) sys 관리자가 아니기 때문에 가능하면 EC2 인스턴스를 해킹하지 않는 편이 좋다. 특히 내 애플리케이션이 확장되고 더 많은 인스턴스가 생성되는 경우 특히 그렇다.

+3

코드를 가져 와서 이것을 http://apastie.org/8463846과 같이 내 응용 프로그램의'.ebextensions/server-update.config'에 추가 했으므로 새로운 인스턴스도 마찬가지가됩니다. –

0

직접 이미지를 s3으로 직접 업로드 한 것으로 생각하십니까? Elastic Beanstalk 종류의 서버에 업로드하면 인스턴스의 영혼에 위배됩니다 (인스턴스가 사라지면 파일을 삭제할 수 있고 다음 요청은 다른 인스턴스에서 수신 할 수 있음). 나는 sys-admin 녀석도 아니고 나는 동일한 이유로 콩팥 껍질을 사용하고있다.

기본적으로 s3으로 직접 업로드하여 서버를 사용하고 데이터베이스를 기반으로 데이터베이스를 만들고 파일 저장소에 파일을 저장하도록 할 수 있습니다. 잘하면 당신은

+1

이것은 레일스가 도착하기 전에도 발생합니다 동작. 분명히 승객 레일을 호출하기 전에이 tmp 디렉토리에 업로드 된 파일을 저장합니다. –

+0

위의 코멘트 때문에 Downvote. 승객은 업로드 된 파일의 임시 디렉토리를 할당합니다. 이것은 질문에 대답하지 않습니다. – joslinm

+0

파일이 웹 서버 *로 이동하지 않아도 * 파일을 * 직접 * s3에 업로드하는 양식을 만들 수 있습니다. 이는 서버의 부하가 적어로드 밸런서 등을 통해 파일을 전달하지 않는다는 것을 의미합니다. – Will

관련 문제