Маршрутизация при обновлении ruby/rails и переходе от mongrel к unicorn

У меня есть проект, в котором я обновляю приложение ruby-1.8.7-p72/rails 2.3.2/mongrel. Первый шаг, который я делаю, — это обновление до ruby-1.9.3-p484, rails 2.3.18 и unicorn.

Сейчас я нахожусь в том месте, где могу запустить приложение на сервере разработки через unicorn (развернуть через capistrano — rvm-capistrano и capistrano-unicorn). Однако он не может обслуживать какие-либо ресурсы (изображения, таблицы стилей и т. д.).

Я вижу ошибки в журнале единорога, например:

ActionController::RoutingError (No route matches "/images/pp.jpg" with {:method=>:get}):
<internal:prelude>:10:in `synchronize'
unicorn (4.8.2) lib/unicorn/http_server.rb:572:in `process_client'
unicorn (4.8.2) lib/unicorn/http_server.rb:666:in `worker_loop'
unicorn (4.8.2) lib/unicorn/http_server.rb:521:in `spawn_missing_workers'
unicorn (4.8.2) lib/unicorn/http_server.rb:140:in `start'
unicorn (4.8.2) bin/unicorn_rails:209:in `<top (required)>'
/Users/ruby/.rvm/gems/ruby-1.9.3-p484/bin/unicorn_rails:19:in `load'
/Users/ruby/.rvm/gems/ruby-1.9.3-p484/bin/unicorn_rails:19:in `<main>'
/Users/ruby/.rvm/gems/ruby-1.9.3-p484/bin/ruby_executable_hooks:15:in `eval'
/Users/ruby/.rvm/gems/ruby-1.9.3-p484/bin/ruby_executable_hooks:15:in `<main>'

Я вижу эту же ошибку независимо от того, обращаюсь ли я к порту единорога напрямую или через apache (mod_rewrite — разговариваю с портом единорога)

Нужно ли мне менять местонахождение моих активов? В настоящее время они находятся под /public. Здесь они отлично работают под ruby-1.8.7-p72/rails 2.3.2/mongrel, но не работают под ruby-1.9.3-p484/rails 2.3.18/unicorn. Или есть элемент конфигурации, который я могу поместить в свои файлы шапки, который устанавливает местоположение активов? Я ничего не нашел в документах единорога.

Кто-нибудь еще прошел через это и знает ответ? Я буду продолжать продираться через это, но любые подсказки будут оценены.


person Robert A. Decker    schedule 26.02.2014    source источник
comment
Я думаю, это происходит из-за того, что мой экземпляр не запускается в режиме разработки и поэтому пытается обслуживать активы через apache. В рамках исправления этого я теперь понимаю, что мне также нужно расширить файлы конфигурации моего единорога, поэтому работаю над этим сейчас...   -  person Robert A. Decker    schedule 27.02.2014
comment
Теперь, когда я запускаю в режиме разработки и читаю правильные файлы конфигурации, у меня все еще возникают проблемы. Поскольку я все еще на rails2, я не могу использовать config.serve_static_assets = true. Webbrick отлично обслуживает активы, но я до сих пор не нашел способа заставить единорога их обслуживать.   -  person Robert A. Decker    schedule 27.02.2014


Ответы (1)


Я наконец получил это работает .... какая боль. Я рад, что мне нужно сделать это только один раз. На самом деле, у меня это работает только на моем сервере разработки. Я не думаю, что можно использовать unicorn на моем компьютере разработчика, пока я не перейду на rails 3 из-за отсутствующего значения конфигурации serve_static_assets.

Мой файл конфигурации единорога выглядит так:

# config/unicorn/development-mini-2.rb
# 
# this is launched from capistrano. see config/deploy/dev2.rb.
#
puts "reading development-mini-2.rb"

rails_env = ENV['RAILS_ENV'] || 'development'

timeout 30
worker_processes 4
listen 8031

root = '/Users/ruby/apps/app'
working_directory "#{root}/current"
pid "#{root}/shared/pids/unicorn.app.pid"
stderr_path "#{root}/shared/log/unicorn.log"
stdout_path "#{root}/shared/log/unicorn.log"

preload_app true

GC.respond_to?(:copy_on_write_friendly=) and
  GC.copy_on_write_friendly = true


before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

Мое развертывание крышки выглядит так:

#
# deployment for the dev mini server instance 2
# app.example.com
# deploy with
# 
#
require 'rvm/capistrano'

set :application, "app"

set :rvm_ruby_string, 'ruby-1.9.3-p484'
set :rails_env, 'development'

server 'app.example.com', :app, :web, :db, :primary => true

set :user,  "ruby"
set :group, "ruby"

set :deploy_to,   "/Users/ruby/apps/#{application}"
set :copy_remote_dir, '/Users/ruby/tmp'


namespace :deploy do
  desc "Start unicorn"
  task :start, :except => { :no_release => true } do
    run "cd #{deploy_to}/current ; unicorn_rails -c config/unicorn/development-mini-2.rb -D"
    run "ps aux | grep unicorn_rails | head -n 1 | awk '{print $2}' > #{deploy_to}/shared/pids/unicorn.app.pid"
  end

  desc "Stop unicorn"
  task :stop, :except => { :no_release => true } do
    run "kill -s QUIT `cat #{deploy_to}/shared/pids/unicorn.app.pid`"
  end

  desc "Restart Unicorn"
  task :restart, :except => { :no_release => true } do
    run "kill -s USR2 `cat #{deploy_to}/shared/pids/unicorn.app.pid`"
  end  
end

Моя конфигурация Apache выглядит так:

<VirtualHost *:443>
    ServerName app.example.com
    DocumentRoot /Users/ruby/apps/app/current/public

    RewriteEngine On
    #RewriteLog "/var/log/apache2/rewrite.log"
    #RewriteLogLevel 3

        <Proxy "balancer://unicornservers2">
        Order deny,allow
        Allow from any
                BalancerMember http://localhost:8031
        </Proxy>

    # Redirect all non-static requests to unicorn
    RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
    RewriteRule ^/(.*)$ balancer://unicornservers2%{REQUEST_URI} [P,QSA,L]

    RequestHeader set X-Forwarded-Proto "https"

    CustomLog /var/log/apache2/access_log "%h %l %u %t \"%r\" %>s %b"

    <IfModule mod_ssl.c>
        SSLEngine On
        SSLCipherSuite "ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM"
        SSLProtocol -ALL +SSLv3 +TLSv1
        SSLCertificateFile "/etc/certificates/example.com.0CB3DB818A24F638D4D4A5664865B68ACB924FF1.cert.pem"
        SSLCertificateKeyFile "/etc/certificates/example.com.0CB3DB818A24F638D4D4A5664865B68ACB924FF1.key.pem"
        SSLCertificateChainFile "/etc/certificates/example.com.0CB3DB818A24F638D4D4A5664865B68ACB924FF1.chain.pem"
        SSLProxyProtocol -ALL +SSLv3 +TLSv1
    </IfModule>

</VirtualHost>
person Robert A. Decker    schedule 27.02.2014