2012-02-24 2 views
9

La mia domanda è simile a questo Rails 3.2 Asset Pipeline with Passenger Endless Errors tranne che quando cerco di andare effettivamente aRails 3.2 Asset Pipeline con sottile e Apache, non trovando beni

<link href="/assets/application-eed7996ee9017637f923133371ab3e92.css" media="all" rel="stylesheet" type="text/css" /> 

ho un 404. Ecco la cosa I don' t capire. Sta cercando in/assets /, ma quando guardo il codice che è stato distribuito, le risorse sono solo in/public/assets, che in realtà è un link simbolico a/var/www/myapp/shared/assets. Quindi, in quale parte del mondo è responsabile comunicare all'app che la ricerca di contenuti/risorse produrrà risultati corretti?

Sto usando Rails 3.2.0, ruby-1.9.3-p125, distribuito su Ubuntu, Apache e Thin.

Devo chiarire: Le mie risorse sono effettivamente distribuite sul server. Tutto funziona perfettamente fino a quando non devono essere serviti, nel qual caso production.log mi dice che li sta cercando in /assets/application-eed7996ee9017637f923133371ab3e92.css, di cui 404.

per ogni richiesta di mia thin.log dice

cache: [GET /] miss 

e production.log dice

ActionController::RoutingError (No route matches [GET] "/assets/application-abecf2e096af9ee80697fd49e79a55e7.js"): 

UPDATE grazie @Brandan per l'aiuto. Le mie risorse sono effettivamente in RAILS_ROOT/public/assets. Ho messo questo nel mio file vhost Apache:

DocumentRoot /var/rails/myappname/current/public 

RewriteEngine On 
XSendFile On 
XSendFilePath /var/rails/myappname #not even sure if this line is needed 

<LocationMatch "^/assets/.*$"> 
    Header unset ETag 
    FileETag None 
    ExpiresActive On 
    ExpiresDefault "access plus 1 year" 
</LocationMatch> 

miei RAILS_ROOT/config/ambienti/production.rb impostazioni:

config.cache_classes = true 
config.consider_all_requests_local = false 
config.action_controller.perform_caching = true 
config.serve_static_assets = false 
config.assets.compress = true 
config.assets.compile = false 
config.assets.digest = true 
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 
+0

come crei i tuoi link? – apneadiving

+0

nel mio layout dico '<% = stylesheet_link_tag" application ",: media =>" all "%>' e '<% = javascript_include_tag" application "%>' – DelPiero

+0

Hai precompilato le tue risorse? – ka8725

risposta

2

Ho avuto questo problema per giorni ora. Ho pensato che fosse un problema con capistrano o la versione rubino, ma sono abbastanza sicuro che anche le autorizzazioni siano correlate.

La mia configurazione era praticamente uguale alla tua anche se sto usando anche Unicorn.

Ecco che cosa ho fatto per ordinare:

  1. Rimuovere temporaneamente la sezione seguente, perché penso che i problemi stava causando con la risoluzione dei problemi:

    <LocationMatch "^/assets/.*$"> 
        Header unset ETag 
        FileETag None 
        ExpiresActive On 
        ExpiresDefault "access plus 1 year" 
        </LocationMatch> 
    

Forse ottenere tutto questo lavoro e di quindi aggiungilo nuovamente. Non penso che sia la causa dei problemi, tuttavia, quando diagnostichi cose del genere, è meglio rimuovere il più possibile per trovare il colpevole.

  1. Eseguire un -R xxx.xxx chown (sostituire xxx con l'utente dell'applicazione o dell'utente web) sulla directory pubblica. Non appena l'ho fatto, il css è apparso di nuovo.

  2. (Quello che ho fatto ma forse non essenziale) Si potrebbe anche voler installare localmente senza cap. nel caso ci fosse un problema con esso. Anche quello ha funzionato per me.

  3. Completamente wipeout tmp/cache e public/* nel caso.

  4. Riavvia il tuo server Apache un paio di volte.

Si può vedere un esempio del mio conf. here

+0

potresti chiarire cosa intendi con "Rimuovere temporaneamente la sezione"? Quale sezione? Sono alla fine del mio spirito con questo problema, proverò qualsiasi cosa a questo punto! – DelPiero

+0

Mi spiace, per qualche motivo mi è mancato un po 'dalla mia risposta. Aggiornerò la mia risposta in pochi. Conosco il tuo dolore ... – simonmorley

+0

@DelPiero Dovresti davvero accettare una risposta se il tuo problema è stato risolto. – simonmorley

3

In genere, il vostro patrimonio dovrebbe esistono solo in /public/assets per un applicazione distribuita.

Apache deve essere configurato in modo che il suo DocumentRoot sia il proprio RAILS_ROOT/public. Quindi servirà http://example.com/assets/whatever.css da RAILS_ROOT/public/assets/whatever.css e non passa mai attraverso Rails per le risorse statiche.

Hai riavviato l'applicazione da quando hai precompilato le tue risorse? A volte Rails si aspetta una versione compilata più vecchia/più recente delle risorse di quella attualmente distribuita.

+0

sì, riavviato Apache, Thin, riavviato il server ... stesso risultato. – DelPiero

+0

Puoi accedere ad altri file che vivono in 'RAILS_ROOT/public/assets' dal browser tramite' http: // example.com/assets/filename.ext'? Sono solo le risorse compilate da Rails che stanno fallendo? Inoltre, puoi pubblicare il tuo 'config/environments/production.rb'? Non sono sicuro del motivo per cui queste richieste stanno colpendo Rails. – Brandan

+0

No, non posso accedere a nessun file che risiede in 'RAILS_ROOT/public/assets'. Tutti e 404. Aggiornerò il mio post con il mio 'production.rb'. – DelPiero

0

Passanger conosce la propria applicazione RoR poiché esiste un file config.ru.

Lo stesso errore che si sta segnalando mi è successo a causa di autorizzazioni errate. Apache non è stato in grado di servire i file all'interno assets, ma è stato in grado di inviare i file sul public/

Nel mio caso io uso Capistrano così assets era un link simbolico a shared/public/assets.

quello che ho fatto è stato:

chmod -R o+x shared/ 

x autorizzazioni sono necessarie per elencare e le directory di accesso. Dopo che ha funzionato. Devi assicurarti che assets abbia + x per gli altri