9 Stimmen

Rails 3.2 Asset Pipeline mit Thin und Apache, findet keine Assets

Meine Frage ist ähnlich wie diese Rails 3.2 Asset Pipeline mit Passagier Endless Errors außer, dass ich, wenn ich versuche, tatsächlich zu gehen

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

Ich erhalte eine 404. Das ist das, was ich nicht verstehe. Es wird in /assets/ gesucht, aber wenn ich mir den Code ansehe, der bereitgestellt wurde, befinden sich die Assets nur in /public/assets, was eigentlich ein Symlink zu /var/www/myapp/shared/assets ist. Was um alles in der Welt ist also dafür verantwortlich, der Anwendung zu sagen, dass die Suche in /assets korrekte Ergebnisse liefern wird?

Ich verwende Rails 3.2.0, ruby-1.9.3-p125, die Bereitstellung auf Ubuntu, Apache und Thin.

Ich sollte das klarstellen: Meine Assets werden tatsächlich auf dem Server bereitgestellt. Alles funktioniert einwandfrei, bis sie serviert werden müssen, in diesem Fall production.log sagt mir, dass es für sie in /assets/application-eed7996ee9017637f923133371ab3e92.css, die 404's sucht.

Für jede Anfrage meiner thin.log sagt

cache: [GET /] miss

y produktion.log sagt

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

UPDATE @Brandan danke für die Hilfe. Meine Assets sind in der Tat in RAILS_ROOT/public/assets . Ich habe dies in meine Apache vhost-Datei eingefügt:

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>

Meine RAILS_ROOT/config/environments/production.rb Einstellungen:

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 Stimmen

Wie erstellen Sie Ihre Links?

0 Stimmen

In meinem Layout sage ich <%= stylesheet_link_tag "application", :media => "all" %> y <%= javascript_include_tag "application" %>

0 Stimmen

Haben Sie Ihre Assets vorkompiliert?

4voto

rxgx Punkte 4968

Löschen Sie die folgenden Zeilen aus Ihrer Apache-Konfiguration.

ProxyPass / balancer://thinservers/
ProxyPassReverse / balancer://thinservers/

Die Antwort kam von In Rails, sollte ich serve_static_assets aktivieren? .

3voto

Brandan Punkte 14387

In der Regel werden Ihre Vermögenswerte sollte existieren nur in /public/assets für eine eingesetzte Anwendung.

Der Apache sollte so konfiguriert werden, dass seine DocumentRoot ist Ihr RAILS_ROOT/public . Dann wird es dienen http://example.com/assets/whatever.css de RAILS_ROOT/public/assets/whatever.css und es geht nie durch Rails für statische Assets.

Haben Sie Ihre Anwendung seit der Vorkompilierung Ihrer Assets neu gestartet? Manchmal erwartet Rails eine ältere/neuere kompilierte Version Ihrer Assets als die, die derzeit bereitgestellt wird.

2voto

simonmorley Punkte 2781

Ich habe dieses Problem nun schon seit Tagen. Dachte, es war ein Problem mit Capistrano oder die Ruby-Version aber ich bin ziemlich sicher, dass es Berechtigungen im Zusammenhang zu.

Meine Konfiguration war so ziemlich die gleiche wie Ihre, obwohl ich auch Unicorn verwende.

Ich habe Folgendes getan, um zu sortieren:

  1. Entfernen Sie vorübergehend den folgenden Abschnitt, weil ich glaube, dass er Probleme bei der Fehlersuche verursacht hat:

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

Vielleicht sollten Sie alles zum Laufen bringen und es dann wieder einbauen. Ich glaube nicht, dass es die Ursache für die Probleme ist, aber wenn man so etwas diagnostiziert, ist es am besten, so viel wie möglich zu entfernen, um den Schuldigen zu finden.

  1. Führen Sie ein chown -R xxx.xxx (ersetzen Sie xxx durch Ihren Anwendungs- oder Webbenutzer) auf dem öffentlichen Verzeichnis aus. Sobald ich dies getan hatte, erschien das css wieder.

  2. (Was ich getan habe, aber vielleicht nicht unbedingt notwendig ist) Sie können auch lokal ohne Kappe installieren, nur für den Fall, dass es ein Problem mit ihr gibt. Das hat bei mir auch funktioniert.

  3. Löschen Sie tmp/cache und public/* vorsichtshalber vollständig.

  4. Starten Sie Ihren Apache-Server ein paar Mal neu.

Sie können einen Überblick über meine Konf sehen. aquí

1voto

Brent Punkte 11

Versuchen Sie, die ProxyPass y ProxyPassReverse Direktiven aus Ihrer apache/thin-Konfiguration. Das P-Flag in Ihrer Rewrite-Regel führt bereits den von Ihnen gewünschten Proxy-Pass durch.

Véase http://httpd.apache.org/docs/2.0/mod/mod_proxy.html für weitere Informationen.

0voto

Arnold Roa Punkte 6775

Passanger weiß, dass es sich um eine RoR-Anwendung handelt, da es eine config.ru-Datei gibt.

Der gleiche Fehler, den Sie berichten, ist bei mir aufgrund falscher Berechtigungen aufgetreten. Apache war nicht in der Lage, die Dateien in assets konnte aber die Dateien weiterschicken public/

In meinem Fall verwende ich Capistrano. assets war ein Symlink zu shared/public/assets .

Was ich tat, war:

chmod -R o+x shared/ 

x-Berechtigungen sind erforderlich, um Verzeichnisse aufzulisten und darauf zuzugreifen. Danach hat es funktioniert. Sie müssen sicherstellen, dass assets hat +x für andere

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X