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

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

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

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

Некоторые особенности: Ubuntu 12.04, Rails 4.0.1, Ruby 2.1.0, загрузчик 3.0 с сторонней темой

Обновить:

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

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

1 ответ

В рельсах 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

Другие вопросы по тегам