6

Ich habe eine Rails 3-App, die ich lokal entwickle und auf Amazon Elastic Beanstalk für die Produktion bereitstellen werde. In meiner App gibt es mehrere Orte, an denen Bilder über HTML-Formulare hochgeladen werden können. Nach dem Hochladen sende ich die Dateien zum Speichern an S3. Ich habe keine Probleme mit diesem Workflow während der Entwicklung vor Ort, aber in der Produktion bekomme ich eine 500 Internal Server Error Response während des Uploads (ich bin ziemlich sicher, dass es vor jeder Kommunikation mit S3).Problem beim Hochladen von Dateien aus der Rails-App, die auf Elastic Beanstalk gehostet werden

Ich ssh'ed in meine EC2-Instanz fand Spuren des Fehlers in /var/app/support/logs/passenger.log. Hier ist die Zeile, die beim Hochladen generiert wird.

2013/03/30 00:58:52 [kritis] 1723 # 0: * 196227 open() "/tmp/passenger-standalone.1645/client_body_temp/0000000014" fehlgeschlagen (2: keine solche Datei oder Verzeichnis) , Client: IP_Adresse, Server: _, Anfrage: "POST/admin/Benutzer/1 HTTP/1.1", Host: "www.my_domain.com", Referrer: "https://www.my_domain.com/admin/users/1/edit"

Hat jemand irgendwelche Worte der Weisheit Warum kann ich keine Datei von meinen Rails zu Elastic Beanstalk hochladen?

Vielen Dank im Voraus für Ihre Hilfe!

+0

Für mich ein schrecklicher Rookie Fehler war. Ich musste die Installation lokal bündeln. Auf Heroku bin ich daran gewöhnt, eine Fehlermeldung für so etwas zu bekommen. – colllin

Antwort

9

Nach einigen Recherchen glaube ich, das Problem ist, dass ein täglicher Cronjob (/etc/cron.daily/tmpwatch) das passagier-Standalone. * Verzeichnis entfernt, das für Datei-Uploads kritisch ist.

Ich konnte Uploads erneut starten, indem ich den App-Server neu startete. Für eine längerfristige Lösung habe ich das tmpwatch-Skript aktualisiert, um das Muster '/ tmp/passagier *' auszuschließen (siehe unten).

#! /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 

Gibt es eine andere Lösung, die jemand anderes für dieses Problem gefunden hat? Ich bin kein sys-Administrator (was ein großer Grund ist, warum ich mich für Elastic Beanstalk entschieden habe). Daher würde ich es vorziehen, nicht mit der EC2-Instanz zu hacken, besonders wenn meine App skaliert und mehr Instanzen erzeugt werden.

+3

Ich habe Ihren Code genommen und hinzugefügt zu ".extensionens/server-update.config" in meiner App wie dieser http://pastie.org/8463846 so neue Instanzen bekommen es auch –

0

Haben Sie darüber nachgedacht, Bilder direkt in s3 hochzuladen? Uploads auf den Server in Elastic Beanstalk gehen irgendwie gegen den Geist der Sache (Datei kann gelöscht werden, wenn die Instanz verschwindet, die nächste Anfrage könnte von einer anderen Instanz empfangen werden, usw.). Ich bin auch kein sys-admin-Typ und ich verwende aus demselben Grund elastische Bohnenstangen.

Grundsätzlich versuche ich zu sagen, dass, wenn Sie zum Hochladen direkt in s3 verschieben Sie in der Lage sein sollten, Ihre Server zu verlassen, Ihre Datenbank basiert die Daten und Ihre Datei speichern Sie Dateien. Dann hoffentlich können Sie von diesem Unsinn immun sein :)

+1

Dies passiert, noch bevor Rails bekommt Aktion. Anscheinend speichert der Passagier hochgeladene Dateien in diesem tmp dir, bevor er Rails aufruft. –

+0

Downvote wegen des obigen Kommentars. Passenger reserviert ein temporäres Verzeichnis für die hochgeladene Datei. Dies beantwortet die Frage nicht. – joslinm

+0

Die Datei muss * überhaupt nicht zu Ihrem Webserver * gehen, Sie können ein Formular erstellen, das die Datei * direkt * nach s3 hochlädt. Dies bedeutet, dass Ihr Server weniger zu tun hat und Sie die Datei nicht über den Lastenausgleich usw. weitergeben. – Will