Назад | Перейти на главную страницу

Rails, когда обслуживается единорогом, генерирует неправильный отпечаток для предварительно скомпилированных ресурсов

У меня есть производственный сервер с nginx -> unicorn -> rails. Я предварительно компилирую активы, которые помещают активы в общедоступные / активы с добавлением отпечатка пальца (хеша) к имени файла. Однако при запросе веб-страницы ссылки на ресурсы application.css и application.js будут иметь неправильный отпечаток. Например, вспомогательная функция rails stylesheet_link_tag сгенерирует имя файла, которого нет в public / assets на сервере, потому что запрошенный отпечаток пальца не соответствует предварительно скомпилированному. Активы изображений работают нормально (отпечатки пальцев совпадают).

Чтобы устранить эту проблему, я предварительно скомпилировал ресурсы на своем локальном компьютере, и отпечаток пальца соответствует предварительно скомпилированному отпечатку пальца на моем сервере. Более того, при локальном запуске с webrick в производственном режиме все работает. Затем я попытался запустить webrick на своем сервере, и это сработало, заставив меня думать, что единорог является источником проблемы.

Я решил эту проблему, запустив unicorn с параметром --no-default-middleware (или -N), и это заставляет unicorn вести себя должным образом в отношении предварительно скомпилированных ресурсов. Насколько я понимаю, это говорит единорогу не загружать набор промежуточного программного обеспечения Rack по умолчанию, который он в противном случае загрузил бы. Однако я действительно не понимаю, почему это решает проблему или что вообще идет не так. Что происходит?

Некоторые особенности: Ubuntu 12.04, Rails 4.0.1, Ruby 2.1.0, bootstrap 3.0 со сторонней темой

Обновить:

Причина, по которой я не считаю, что это проблема nginx, заключается в том, что когда я запрашиваю страницу из браузера, а затем просматриваю исходный код, имя файла для файла application.css имеет отпечаток пальца, поэтому на самом деле он выглядит как application-3855b1928b94aa5bff5e1dac1aa56882. css. Это не соответствует реальному отпечатку файла на моем сервере. Я убежден, что отпечаток пальца на сервере правильный, потому что я получаю тот же отпечаток на моей локальной машине разработки. Итак, клиент загружает веб-страницу, а затем запрашивает у сервера файл .css ... nginx получает этот запрос, но не может найти файл .css, потому что его на самом деле нет, поэтому nginx ведет себя так, как ожидалось .

Отпечаток пальца генерируется дважды: один раз, когда я предварительно компилирую активы, что работает правильно (почти наверняка) и происходит без участия единорога. И во второй раз, когда rails в контексте работника-единорога видит помощника stylesheet_link_tag и на лету вычисляет отпечаток пальца (я думаю, это то, что он делает), который по какой-то причине генерирует неправильный отпечаток пальца. Тот же процесс происходит, если я заменяю unicorn на webrick на том же сервере, но в этом случае отпечатки пальцев совпадают. Если я начну с единорога с флагом -N, отпечатки пальцев совпадают, но я не знаю, почему это имеет значение, и я не знаю, почему больше никому не нужно этого делать.

В рельсах 4 необходимо внести следующие изменения

config.assets.compile = true
config.assets.precompile =  ['*.js', '*.css', '*.css.erb'] 

Это работает со мной. используйте следующую команду для предварительной компиляции активов

RAILS_ENV=production bundle exec rake assets:precompile

из https://stackoverflow.com/questions/18700219/rails-4-assets-not-loading-in-production