Настройка рабочего сервера на машине разработки для работы с конвейером ресурсов rails 3

На моей локальной машине, работающей в производственном режиме (т. е. rails s -e production) с помощью webrick, я сгенерировал css, используя RAILS_ENV=production bundle exec rake assets:precompile, который создает application-d2bcfd35ef1c0c30b7a7ca94e52c0cbd.css, на который также ссылается файл макета.

Однако при загрузке страницы я получаю сообщение об ошибке:

Started GET "/assets/application-d2bcfd35ef1c0c30b7a7ca94e52c0cbd.css" for 127.0.0.1 at 2011-11-02 10:12:55 +0000

AbstractController::ActionNotFound (The action 'application-d2bcfd35ef1c0c30b7a7ca94e52c0cbd' could not be found for AssetsController):
  actionpack (3.1.1) lib/abstract_controller/base.rb:116:in `process'
  actionpack (3.1.1) lib/abstract_controller/rendering.rb:45:in `process'
  actionpack (3.1.1) lib/action_controller/metal.rb:193:in `dispatch'
  actionpack (3.1.1) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
  actionpack (3.1.1) lib/action_controller/metal.rb:236:in `block in action'
  actionpack (3.1.1) lib/action_dispatch/routing/route_set.rb:65:in `call'
  actionpack (3.1.1) lib/action_dispatch/routing/route_set.rb:65:in `dispatch'
  actionpack (3.1.1) lib/action_dispatch/routing/route_set.rb:29:in `call'
  rack-mount (0.8.3) lib/rack/mount/route_set.rb:152:in `block in call'
  rack-mount (0.8.3) lib/rack/mount/code_generation.rb:96:in `block in recognize'
  rack-mount (0.8.3) lib/rack/mount/code_generation.rb:68:in `optimized_each'
  rack-mount (0.8.3) lib/rack/mount/code_generation.rb:95:in `recognize'
  rack-mount (0.8.3) lib/rack/mount/route_set.rb:141:in `call'
  actionpack (3.1.1) lib/action_dispatch/routing/route_set.rb:532:in `call'
  newrelic_rpm (3.2.0) lib/new_relic/rack/browser_monitoring.rb:18:in `call'
  airbrake (3.0.4) lib/airbrake/rack.rb:27:in `call'
  sass (3.1.10) lib/sass/plugin/rack.rb:54:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
  rack (1.3.5) lib/rack/etag.rb:23:in `call'
  rack (1.3.5) lib/rack/conditionalget.rb:25:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/head.rb:14:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/flash.rb:243:in `call'
  rack (1.3.5) lib/rack/session/abstract/id.rb:195:in `context'
  rack (1.3.5) lib/rack/session/abstract/id.rb:190:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/cookies.rb:331:in `call'
  activerecord (3.1.1) lib/active_record/query_cache.rb:62:in `call'
  activerecord (3.1.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:477:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (3.1.1) lib/active_support/callbacks.rb:392:in `_run_call_callbacks'
  activesupport (3.1.1) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (3.1.1) lib/action_dispatch/middleware/callbacks.rb:28:in `call'
  rack (1.3.5) lib/rack/sendfile.rb:101:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
  actionpack (3.1.1) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
  railties (3.1.1) lib/rails/rack/logger.rb:13:in `call'
  rack (1.3.5) lib/rack/methodoverride.rb:24:in `call'
  rack (1.3.5) lib/rack/runtime.rb:17:in `call'
  activesupport (3.1.1) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.3.5) lib/rack/lock.rb:15:in `call'
  rack-cache (1.1) lib/rack/cache/context.rb:132:in `forward'
  rack-cache (1.1) lib/rack/cache/context.rb:241:in `fetch'
  rack-cache (1.1) lib/rack/cache/context.rb:181:in `lookup'
  rack-cache (1.1) lib/rack/cache/context.rb:65:in `call!'
  rack-cache (1.1) lib/rack/cache/context.rb:50:in `call'
  airbrake (3.0.4) lib/airbrake/user_informer.rb:12:in `call'
  railties (3.1.1) lib/rails/engine.rb:456:in `call'
  railties (3.1.1) lib/rails/rack/content_length.rb:16:in `call'
  railties (3.1.1) lib/rails/rack/log_tailer.rb:14:in `call'
  rack (1.3.5) lib/rack/handler/webrick.rb:59:in `service'
  /Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
  /Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
  /Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'

Я прочитал в руководстве по настройке рельсов:

  • config.serve_static_assets настраивает сам Rails для обслуживания статических ресурсов. По умолчанию установлено значение true, но в производственной среде оно отключено, поскольку серверное программное обеспечение (например, Nginx или Apache), используемое для запуска приложения, вместо этого должно обслуживать статические активы. В отличие от настройки по умолчанию, установите для этого параметра значение true при запуске (категорически не рекомендуется!) или при тестировании приложения в рабочем режиме с помощью WEBrick. В противном случае вы не сможете использовать кэширование страниц, а запросы файлов, которые регулярно существуют в общедоступном каталоге, все равно попадут в ваше приложение Rails.

Таким образом, изменение config.serve_static_assets на true для production.rb правильно ссылается на файлы. Есть ли способ настроить webrick для обслуживания файлов конвейера активов? Или есть ли какой-либо другой сервер rails, который легко настроить для моей машины разработки для работы в производственном режиме?

Я использую Mac OS 10.6 (Snow Leopard) с веб-сервером Apache.


person zlog    schedule 02.11.2011    source источник
comment
Почему вы хотите предварительно скомпилировать свои активы в среде разработки?   -  person Marek Tihkan    schedule 02.11.2011
comment
Не могли бы вы уточнить, когда именно произошла ошибка: при локальном запуске в режиме разработки, при локальном запуске в рабочем режиме или при запуске в рабочем режиме на сервере? Не могли бы вы добавить (к вопросу) информацию о том, на какой машине (Linux, Windows,...) и в каком контексте (Apache, Nginx,...) вы хотите запустить приложение в рабочем режиме?   -  person mliebelt    schedule 02.11.2011
comment
@MarekTihkan - я хочу предварительно скомпилировать свои активы на своем локальном компьютере, чтобы я мог настроить производственную среду без фактического развертывания в рабочей среде.   -  person zlog    schedule 02.11.2011
comment
@mliebelt - я пытаюсь настроить производственную среду на своем локальном компьютере. Я обновил вопрос с этой информацией.   -  person zlog    schedule 02.11.2011


Ответы (1)


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

or

Вы можете создать новую среду для тестирования производственных настроек и отметить config.serve_static_assets до true.

or

Вы можете попробовать использовать другие серверы, такие как thin...

Вероятно, первый даст вам наиболее точный результат, как он будет работать в продакшене, и вы не будете использовать ни Webrick, ни Thin в продакшене.

person Marek Tihkan    schedule 02.11.2011