无法在生产中启动独角兽 - 无法将Pathname转换为String(TypeError)

时间:2012-06-04 17:41:54

标签: ruby-on-rails ruby unicorn

我有一个Rails 3(Spree)应用程序,我可以从开发但不是生产开始。

如果我运行bundle exec unicorn -c config/unicorn.rb -D -E development一切正常。

但是,bundle exec unicorn -c config/unicorn.rb -D -E production会返回:

master failed to start, check stderr log for details

这是unicorn.stder.log文件:

I, [2012-06-04T17:31:54.497851 #10431]  INFO -- : listening on addr=/tmp/unicorn-uspatriottactical.socket fd=5
I, [2012-06-04T17:31:54.499222 #10431]  INFO -- : Refreshing Gem list
/var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/polyglot-0.3.3/lib/polyglot.rb:63:in `require': can't convert Pathname into String (TypeError)
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/polyglot-0.3.3/lib/polyglot.rb:63:in `require'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `block in require'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:236:in `load_dependency'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:359:in `require_or_load'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:502:in `load_missing_constant'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:192:in `block in const_missing'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:190:in `each'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:190:in `const_missing'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/bundler/gems/spree_related_products-72cbbfc9ed31/lib/spree_related_products.rb:17:in `block in <class:Engine>'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/initializable.rb:30:in `instance_exec'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/initializable.rb:30:in `run'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/initializable.rb:55:in `block in run_initializers'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/initializable.rb:54:in `each'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/initializable.rb:54:in `run_initializers'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/application.rb:136:in `initialize!'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/railtie/configurable.rb:30:in `method_missing'
        from /var/rails/uspatriottactical/releases/20120604171150/config/environment.rb:5:in `<top (required)>'
        from config.ru:4:in `require'
        from config.ru:4:in `block in <main>'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:51:in `instance_eval'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:51:in `initialize'
        from config.ru:1:in `new'
        from config.ru:1:in `<main>'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn.rb:44:in `eval'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn.rb:44:in `block in builder'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:696:in `call'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:696:in `build_app!'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:136:in `start'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/bin/unicorn:121:in `<top (required)>'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `load'
        from /var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `<main>'

因为这似乎是一个宝石问题,这是我的Gemfile:

source 'http://rubygems.org'

gem 'active_shipping',                  :git => 'git://github.com/Shopify/active_shipping.git'
gem 'carrierwave'
gem 'jquery-rails'
gem 'rails', '~> 3.2.0'
gem 'rmagick'
gem 'spree',                            :git => 'git://github.com/spree/spree', :branch => '1-1-stable'
gem 'spree_active_shipping',            :git => 'git://github.com/spree/spree_active_shipping.git'
gem 'spree_flexi_variants',             :git => 'git://github.com/jsqu99/spree_flexi_variants.git'
gem 'spree_reviews',                    :git => 'git://github.com/spree/spree_reviews.git'
gem 'spree_related_products',           :git => 'git://github.com/spree/spree_related_products.git'
gem 'spree_shipworks_api',              :path => 'spree_shipworks_api'
gem 'spree_amazon_fps',                 :path => 'spree_amazon_fps'
# gem 'spree_variant_options',            :git => 'git://github.com/citrus/spree_variant_options.git'
gem 'spree_videos',                     :git => 'git://github.com/iloveitaly/Spree-Videos.git'
gem 'spree_gateway',                    :git => 'git://github.com/spree/spree_gateway.git'
gem 'spree_paypal_express',             :git => 'git://github.com/spree/spree_paypal_express.git'
gem 'remit',                            :git => 'git://github.com/tylerhunt/remit.git'
#gem 'remit',                            :path => '../remit'
gem 'unicorn'

# temporary
gem 'sqlite3'
gem 'execjs'
gem 'therubyracer'


group :assets do
  gem 'coffee-rails', '~> 3.2.0'
  gem 'sass-rails',   '~> 3.2.0'
  gem 'uglifier', '>= 1.2.4'
end

group :console do
  gem 'awesome_print',                  :require => 'ap'
  gem 'hirb-unicode'
  gem 'wirb'
end

group :development, :test do
  gem 'capybara'
  gem 'factory_girl_rails'
  gem 'faker'
  gem 'mysql2'
  gem 'pry'
  gem 'rspec-rails'
  gem 'sunspot_rails', '~> 1.3.1'
  gem 'progress_bar', '0.4.0'
  gem 'sunspot_solr'
  gem "sunspot_with_kaminari", '~> 0.1'
  gem 'sqlite3'
  gem 'debugger'
end

group :development do
#  gem 'heroku'
  gem 'pry-rails'
end

group :production do

    gem 'capistrano'
    gem 'rvm-capistrano'


    gem 'mysql2'

    gem 'sunspot_rails', '~> 1.3.1'
    gem 'progress_bar', '0.4.0'
    gem 'sunspot_solr'
    gem "sunspot_with_kaminari", '~> 0.1'
end

# Used when running on Heroku
# group :deployment do
#   gem 'foreman'
#   gem 'pg'
#   gem 'thin'
# end

group :test do
  gem 'fakeweb'
  # Pretty printed test output
  gem 'turn', '~> 0.8.3',               :require => false
  gem 'vcr'
end

编辑:这是我的unicorn.rb

# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete documentation.

www_dir = "/var/rails/"
app_name = "uspatriottactical"

# Set environment to development unless something else is specified
#env = ENV["RAILS_ENV"] || "production"

# amount of unicorn workers to spin up
worker_processes 2

# Socket to bind to
listen "/tmp/unicorn-#{app_name}.socket"

preload_app true

# restarts workers that hang for 30 seconds
timeout 30

pid "/tmp/unicorn.#{app_name}.pid"



#if env == "production"
  user 'app_user', 'app_user' # 'user', 'group'

  working_directory "#{www_dir}#{app_name}/current"
  shared_path = "#{www_dir}#{app_name}/shared"

  stderr_path "#{shared_path}/log/unicorn.stderr.log"
  stdout_path "#{shared_path}/log/unicorn.stdout.log"
#end

before_fork do |server, worker|
  # the following is highly recomended for Rails + "preload_app true"
  # as there's no need for the master process to hold a connection
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  # When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
  # immediately start loading up a new version of itself (loaded with a new
  # version of our app). When this new Unicorn is completely loaded
  # it will begin spawning workers. The first worker spawned will check to
  # see if an .oldbin pidfile exists. If so, this means we've just booted up
  # a new Unicorn and need to tell the old one that it can now die. To do so
  # we send it a QUIT.
  #
  # This enables 0 downtime deploys.
  old_pid = "/var/run/unicorn-#{app_name}.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
end

after_fork do |server, worker|

  # Unicorn master loads the app then forks off workers - because of the way
  # Unix forking works, we need to make sure we aren't using any of the parent's
  # sockets, e.g. db connection (since "preload_app true")
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end

  # if preload_app is true, then you may also want to check and
  # restart any other shared sockets/descriptors such as Memcached,
  # and Redis.  TokyoCabinet file handles are safe to reuse
  # between any number of forked children (assuming your kernel
  # correctly implements pread()/pwrite() system calls)
end

编辑:每个请求/var/rails/uspatriottactical/shared/bundle/ruby/1.9.1/gems/polyglot-0.3.3/lib/polyglot.rb

我在第63行评论

require 'pathname'

module Polyglot
  @registrations ||= {} # Guard against reloading
  @loaded ||= {}

  class PolyglotLoadError < LoadError; end

  class NestedLoadError < LoadError
    def initialize le
      @le = le
    end
    def reraise
      raise @le
    end
  end

  def self.register(extension, klass)
    extension = [extension] unless Array === extension
    extension.each{|e|
      @registrations[e] = klass
    }
  end

  def self.find(file, *options, &block)
    is_absolute = Pathname.new(file).absolute?
    (is_absolute ? [""] : $:).each{|lib|
      base = is_absolute ? "" : lib+File::SEPARATOR
      # In Windows, repeated SEPARATOR chars have a special meaning, avoid adding them
      matches = Dir["#{base}#{file}{,.#{@registrations.keys*',.'}}"]
      # Revisit: Should we do more do if more than one candidate found?
      $stderr.puts "Polyglot: found more than one candidate for #{file}: #{matches*", "}" if matches.size > 1
      if path = matches[0]
        return [ path, @registrations[path.gsub(/.*\./,'')]]
      end
    }
    return nil
  end

  def self.load(*a, &b)
    file = a[0].to_str
    return if @loaded[file] # Check for $: changes or file time changes and reload?
    begin
      source_file, loader = Polyglot.find(file, *a[1..-1], &b)
      if (loader)
        begin
          loader.load(source_file)
          @loaded[file] = true
        rescue LoadError => e
          raise Polyglot::NestedLoadError.new(e)
        end
      else
        raise PolyglotLoadError.new("Failed to load #{file} using extensions #{(@registrations.keys+["rb"]).sort*", "}")
      end
    end
  end
end

module Kernel
  alias polyglot_original_require require

  def require(*a, &b)
    polyglot_original_require(*a, &b) # <- line 63
  rescue LoadError => load_error
    begin
      Polyglot.load(*a, &b)
    rescue Polyglot::NestedLoadError => e
      e.reraise
    rescue LoadError
      # Raise the original exception, possibly a MissingSourceFile with a path
      raise load_error
    end
  end
end

1 个答案:

答案 0 :(得分:1)

升级到ruby 1.9.3可以解决此问题。

有关详细信息,请参阅github.com/cjheath/polyglot/issues/2

显然,RVM安装的ruby 1.9.1和1.9.2存在问题。