6

Ho un'app Rails 3 che sto sviluppando localmente e distribuisco su Amazon's Elastic Beanstalk per la produzione. Nella mia app ci sono diversi punti in cui le immagini possono essere caricate tramite moduli HTML. Dopo il caricamento, invierò i file a S3 per l'archiviazione. Non ho problemi con questo flusso di lavoro mentre si sviluppa localmente, ma in produzione, ricevo una risposta di errore del server interno 500 durante il caricamento (sono abbastanza sicuro che sia prima di qualsiasi comunicazione con S3).Problema di caricamento dei file dall'app Rails ospitata su Elastic Beanstalk

I ssh'ed nella mia istanza EC2 ha rilevato le tracce dell'errore in /var/app/support/logs/passenger.log. Ecco la riga generata durante il caricamento.

2013/03/30 00:58:52 [critico] 1723 # 0: * 196227 open() "/tmp/passenger-standalone.1645/client_body_temp/0000000014" non riuscito (2: Nessun file o directory di questo tipo) , cliente: ip_address, server: _, richiesta: "POST/admin/utenti/1 HTTP/1.1", host: "www.my_domain.com", referrer: "https://www.my_domain.com/admin/users/1/edit"

qualcuno ha qualche parole di saggezza sul perché non riesco a caricare un file su Elastic Beanstalk dal mio Rails?

Grazie in anticipo per il vostro aiuto!

+0

Per me questo è stato un terribile errore da rookie. Avevo bisogno di installare bundle localmente. Su heroku, sono abituato a ricevere un messaggio di errore per questo genere di cose. – colllin

risposta

9

Dopo alcune ricerche, credo che il problema sia che un cronjob giornaliero (/etc/cron.daily/tmpwatch) rimuove la directory passeggero-autonoma. * Che è fondamentale per i caricamenti di file.

Sono riuscito a ripristinare il funzionamento degli upload riavviando il server dell'app. Per una correzione a lungo termine, ho aggiornato lo script tmpwatch per escludere il pattern '/ tmp/passenger *' (vedi sotto).

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

C'è un'altra soluzione che qualcun altro ha trovato per questo problema? Io non sono un ragazzo amministratore di sistema (che è una grande ragione per cui ho scelto di utilizzare Elastic Beanstalk), quindi preferirei non modificare l'istanza EC2 se possibile, specialmente quando la mia app si ridimensiona e vengono generate più istanze.

+3

Ho preso il tuo codice e l'ho aggiunto a '.ebextensions/server-update.config' nella mia app come questo http://pastie.org/8463846 quindi anche le nuove istanze lo ottengono –

0

Avete considerato il caricamento diretto di immagini in s3? I caricamenti sul server in Elastic Beanstalk vanno contro lo spirito della cosa (il file può essere cancellato se l'istanza sparisce, la richiesta successiva potrebbe essere ricevuta da un'altra istanza, ecc.). Io non sono un ragazzo sys-admin e sto usando il beanstalk elastico per la stessa ragione.

Fondamentalmente sto cercando di dire che spostando il caricamento direttamente in s3 si dovrebbe essere in grado di lasciare i server serviti, il database basando i dati e il proprio archivio file memorizzano i file. Poi si spera si può essere immune da questa assurdità :)

+1

Questo accade anche prima che Rails ottenga qualche azione. Apparentemente il passeggero salva i file caricati in questo dir tmp prima di chiamare Rails. –

+0

Downvote a causa del commento precedente. Passenger assegna una directory temporanea per il file caricato da andare. Questo non risponde alla domanda. – joslinm

+0

Il file non deve necessariamente andare sul tuo server web *, puoi creare un modulo che carica il file * direttamente * su s3. Questo significa che il tuo server ha meno cose da fare e che non stai passando il file attraverso il load balancer ecc. – Will

Problemi correlati