У меня есть рабочий сервер с nginx -> unicorn -> rails. Я предварительно компилирую ресурсы, что помещает ресурсы в public/assets с отпечатком (хешем), добавленным к имени файла. Однако при запросе веб-страницы ссылки на ресурсы application.css и application.js будут иметь неправильный отпечаток. Например, вспомогательный метод rails stylesheet_link_tag сгенерирует имя файла, которого нет в public/assets на сервере, потому что запрошенный отпечаток не совпадает с предварительно скомпилированным. Ресурсы изображений работают нормально (отпечатки совпадают).
Устраняя эту проблему, я предварительно скомпилировал ресурсы на своей локальной машине, и отпечаток совпадает с предварительно скомпилированным отпечатком на моем сервере. Более того, при локальном запуске с webrick в производственном режиме все работает. Затем я попробовал запустить webrick на своем сервере, что сработало, заставив меня думать, что источником проблемы является unicorn.
Я решил эту проблему, запустив unicorn с опцией --no-default-middleware (или -N), и это заставляет unicorn вести себя ожидаемым образом в отношении предварительно скомпилированных ресурсов. Я понимаю, что это говорит unicorn не загружать набор Rack middleware по умолчанию, который он в противном случае загрузил бы. Однако я не совсем понимаю, почему это решает проблему или что изначально идет не так. Что происходит?
Некоторые особенности: Ubuntu 12.04, Rails 4.0.1, Ruby 2.1.0, bootstrap 3.0 со сторонней темой
Обновлять:
Причина, по которой я не верю, что это проблема nginx, заключается в том, что когда я запрашиваю страницу из браузера, а затем просматриваю исходный код, имя файла application.css имеет отпечаток, поэтому на самом деле он выглядит как application-3855b1928b94aa5bff5e1dac1aa56882.css. Это не совпадает с реальным отпечатком файла на моем сервере. Я убежден, что отпечаток на сервере правильный, потому что я получаю тот же отпечаток на своей локальной машине разработки. Итак, клиент загружает веб-страницу, затем запрашивает у сервера файл .css... nginx получает этот запрос, но не может найти файл .css, потому что его на самом деле там нет, поэтому nginx ведет себя так, как и ожидалось.
Отпечаток генерируется дважды: один раз, когда я предварительно компилирую ресурсы, что работает правильно (почти наверняка) и происходит без участия unicorn. И второй раз, когда rails в контексте unicorn worker видит помощник stylesheet_link_tag и на лету вычисляет отпечаток (я думаю, что это то, что он делает), что по какой-то причине генерирует неправильный отпечаток. Тот же самый процесс происходит, если я заменяю unicorn на webrick на том же самом сервере, но в этом случае отпечатки совпадают. Если я запускаю unicorn с флагом -N, отпечатки совпадают, но я не знаю, почему это имеет значение, и я не знаю, почему никто другой, похоже, не должен этого делать.
решение1
В rails 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