2012-02-24 4 views
9

Мой вопрос похож на этот Rails 3.2 Asset Pipeline with Passenger Endless Errors за исключением того, когда я пытаюсь на самом деле пойтиRails 3.2 Asset Pipeline с тонкими и Apache, не находя активы

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

я получаю 404. Вот, что я не» Т понять. Он ищет в/assets /, но когда я смотрю на код, который был развернут, активы находятся только в/public/assets, что на самом деле является символической ссылкой на/var/www/myapp/shared/assets. Итак, что в мире отвечает за сообщение приложения, что поиск/активы приведут к правильным результатам?

Я использую Rails 3.2.0, ruby-1.9.3-p125, развертывая Ubuntu, Apache и Thin.

Я должен уточнить: Мои активы действительно развернуты на сервере. Все работает отлично, пока их не нужно подавать, и в этом случае production.log говорит мне, что они ищут их в /assets/application-eed7996ee9017637f923133371ab3e92.css, которые 404's.

Для каждого запроса мой thin.log говорит

cache: [GET /] miss 

и production.log говорит

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

UPDATE @Brandan спасибо за помощь. Мои активы действительно находятся в RAILS_ROOT/public/assets. Я положил это в моем ВХосте файл 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> 

Моей RAILS_ROOT/Config/Область/production.rb настройки:

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

Как вы создаете свои ссылки? – apneadiving

+0

В моем макете я говорю '<% = stylesheet_link_tag" приложение ",: media =>" all "%>' и '<% = javascript_include_tag" приложение "%>' – DelPiero

+0

Вы прекомпилировали свои активы? – ka8725

ответ

2

У меня была эта проблема в течение нескольких дней. Думал, что это была проблема с capistrano или рубиновой версией, но я уверен, что это тоже связанные разрешения.

Моя конфигурация была почти такой же, как ваша, хотя я также использую Единорог.

Вот что я сделал, чтобы сортировать:

  1. Временно удалите следующий раздел, потому что я думаю, что вызывало проблемы с устранения неполадок:

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

, возможно, получить все это работает и затем добавьте его обратно. Я не думаю, что это причина проблем, однако, при диагностировании таких вещей лучше всего удалить столько, сколько вы можете, чтобы найти виновника.

  1. Запустите chown -R xxx.xxx (замените xxx пользователем приложения или веб-пользователем) в общем каталоге. Как только я это сделал, css появился снова.

  2. (Что я сделал, но, возможно, не обязательно). Вы также можете установить локально без крышки. на всякий случай, если есть проблема с ним. Это также сработало для меня.

  3. Полностью уничтожить tmp/cache и public/* на всякий случай.

  4. Перезапустите сервер Apache пару раз.

Вы можете увидеть суть моего conf. here

+0

Не могли бы вы уточнить, что вы подразумеваете под «Временно удалить раздел»? Какой раздел? Я в конце концов с этой проблемой, я попробую что-нибудь в этом пункте! – DelPiero

+0

Извините, по некоторым причинам в моем ответе немного не хватало. Я обновляю свой ответ в нескольких случаях. Я знаю вашу боль ... – simonmorley

+0

@DelPiero Вы должны действительно принять ответ, если ваша проблема решена. – simonmorley

3

Как правило, ваши активы должны существовать только в /public/assets для развернутое приложение.

Apache должен быть сконфигурирован таким образом, чтобы его DocumentRoot был вашим RAILS_ROOT/public. Затем он будет обслуживать http://example.com/assets/whatever.css от RAILS_ROOT/public/assets/whatever.css, и он никогда не проходит через Rails для статических активов.

Перезагрузили ли вы приложение, так как вы предварительно скомпилировали свои активы? Иногда Rails ожидает более старую/новую скомпилированную версию ваших активов, чем в настоящее время развернута.

+0

да, перезапустил Apache, Thin, перезагрузил сервер ... тот же результат. – DelPiero

+0

Можете ли вы получить доступ к другим файлам, которые находятся в «RAILS_ROOT/public/assets» из браузера через http: // example.com/assets/filename.ext'? Это просто скомпилированные активы Rails, которые терпят неудачу? Кроме того, можете ли вы разместить свой 'config/environment/production.rb'? Я не уверен, почему эти запросы ударяют Rails. – Brandan

+0

Нет, не может получить доступ к файлу, который находится в 'RAILS_ROOT/public/assets'. Все они 404. Я обновляю свой пост с помощью 'production.rb'. – DelPiero

1

Попробуйте удалить директивы ProxyPass и ProxyPassReverse из вашей конфигурации apache/thin. Флаг P в вашем правиле rewrite уже выполняет прокси-пропуск, который вы хотите.

Для получения дополнительной информации см. http://httpd.apache.org/docs/2.0/mod/mod_proxy.html.

0

Passanger знает свое приложение RoR, так как есть файл config.ru.

Те же ошибки, о которых вы сообщаете, произошли со мной из-за неправильных разрешений. Apache не в состоянии обслуживать файлы внутри assets, но был в состоянии отправить файлы на public/

В моем случае я использую Capistrano так assets была символическая ссылка на shared/public/assets.

что я сделал:

chmod -R o+x shared/ 

х разрешения необходимы для отображения и доступа к каталогам. После этого все получилось. Вы должны убедиться, что у assets есть + x для других

 Смежные вопросы

  • Нет связанных вопросов^_^