Rails 3.2 Asset Pipeline с Thin и Apache, не находящими активы - PullRequest
9 голосов
/ 25 февраля 2012

Мой вопрос похож на этот Rails 3.2. Конвейер активов с бесконечными ошибками пассажиров за исключением того, что когда я пытаюсь перейти на

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

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

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

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

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

cache: [GET /] miss

и production.log говорит

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

UPDATE @Brandan спасибо за помощь. Мои активы действительно в RAILS_ROOT/public/assets. Я поместил это в мой файл Apache vhost:

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>

My RAILS_ROOT / config / environment / 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

Ответы [ 5 ]

4 голосов
/ 15 мая 2012

Удалите следующие строки из вашей конфигурации Apache.

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

Ответ пришел от В Rails я должен включить serve_static_assets? .

3 голосов
/ 25 февраля 2012

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

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

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

2 голосов
/ 27 февраля 2012

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

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

Вот что я сделал для сортировки:

  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 пару раз.

Вы можете увидеть суть моей конф. здесь

1 голос
/ 27 марта 2012

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

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

0 голосов
/ 15 июля 2016

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

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

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

Я сделал следующее:

chmod -R o+x shared/ 

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

...