【问题标题】:uninitialized constant ActiveRecord (NameError) wiith Dokku + nginx + unicornDokku + nginx + unicorn 的未初始化常量 ActiveRecord (NameError)
【发布时间】:2015-04-25 18:43:20
【问题描述】:

我使用Dokku + nginx + PostgreSQL 在 digitalocean 上运行 Rails 应用程序。部署的 App 使用 WEBrick 作为默认服务器运行,我想迁移到 unicorn。

宝石文件

group :production do
  gem 'pg'
  gem 'unicorn'
end

我已经为 Unicorn 使用了 Heroku 配置

过程文件

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

config/unicorn.rb

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app 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

这就是日志的样子

root@oktobTest:~# dokku logs oktob
I, [2015-04-25T18:30:29.195191 #13]  INFO -- : Refreshing Gem list
config.ru:4:in `block in <main>': uninitialized constant ActiveRecord (NameError)
    from /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval'
    from /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize'
    from config.ru:1:in `new'
    from config.ru:1:in `<main>'
    from /app/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn.rb:48:in `eval'
    from /app/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn.rb:48:in `block in builder'
    from /app/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:764:in `call'
    from /app/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:764:in `build_app!'
    from /app/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:137:in `start'
    from /app/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/bin/unicorn:126:in `<top (required)>'
    from /app/vendor/bundle/ruby/2.1.0/bin/unicorn:23:in `load'
    from /app/vendor/bundle/ruby/2.1.0/bin/unicorn:23:in `<main>'

当我运行docker ps 命令时,我只看到 PostgreSQL 进程并且没有用于 rails 服务器的进程。

root@oktobTest:~# docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                     NAMES
fbdbb516b19c        postgresql/oktob:latest   "/usr/bin/start_pgsq   2 hours ago         Up 2 hours          0.0.0.0:49153->5432/tcp   elegant_ardinghelli

【问题讨论】:

    标签: ruby-on-rails postgresql nginx unicorn dokku


    【解决方案1】:

    我在dokku Github 页面上提问并得到了答案

    因此将active_record gem 添加到config/unicorn.rb 将解决问题:

    require 'rubygems'
    require 'active_record'
    
    worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
    timeout 15
    preload_app 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
    

    这就是结果

    使用docker ps

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4a43ac670998 dokku/oktob:latest "/start web" 12 minutes ago Up 12 minutes grave_yonath fbdbb516b19c postgresql/oktob:latest "/usr/bin/start_pgsq 6 days ago Up 6 days 0.0.0.0:49153->5432/tcp elegant_ardinghelli

    使用htop

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2016-09-15
      • 2015-02-24
      • 1970-01-01
      • 2014-01-06
      相关资源
      最近更新 更多