【问题标题】:Unicorn and Gemfile are using different ruby versions when trying to run unicorn and Nginx on Digital OceanUnicorn 和 Gemfile 在尝试在 Digital Ocean 上运行 unicorn 和 Nginx 时使用不同的 ruby​​ 版本
【发布时间】:2025-12-25 06:45:06
【问题描述】:

我正在尝试通过 Nginx 和 Unicorn 运行我的 Rails 应用程序,当我尝试运行 service unicorn start 时,它告诉我我失败了 master failed to start, check stderr log for details。我的 Gemfile 指定 ruby​​ 2.0.0,我的 ruby​​ 版本是 2.0.0p353。 Unicorn 似乎正在使用 ruby​​ 2.1.3。如果独角兽默认使用 2.1.3,有什么方法可以让独角兽使用 ruby​​ 2.0.0。

当我跟踪独角兽日志时:

/usr/local/rvm/gems/ruby-2.1.3/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:294:in `join'
/usr/local/rvm/gems/ruby-2.1.3/gems/unicorn-4.8.3/bin/unicorn:126:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.1.3/bin/unicorn:23:in `load'
/usr/local/rvm/gems/ruby-2.1.3/bin/unicorn:23:in `<main>'
/usr/local/rvm/gems/ruby-2.0.0-p353/bin/ruby_executable_hooks:15:in `eval'
/usr/local/rvm/gems/ruby-2.0.0-p353/bin/ruby_executable_hooks:15:in `<main>'
E, [2014-10-31T20:55:57.551794 #15567] ERROR -- : reaped #<Process::Status: pid 30319 exit 1> worker=1
I, [2014-10-31T20:55:57.552041 #15567]  INFO -- : worker=1 spawning...
I, [2014-10-31T20:55:57.553188 #30329]  INFO -- : worker=0 spawned pid=30329
I, [2014-10-31T20:55:57.560300 #30331]  INFO -- : worker=1 spawned pid=30331
I, [2014-10-31T20:55:57.587723 #30329]  INFO -- : Refreshing Gem list
I, [2014-10-31T20:55:57.595703 #30331]  INFO -- : Refreshing Gem list
E, [2014-10-31T20:55:57.940679 #30325] ERROR -- : Your Ruby version is 2.1.3, but your Gemfile specified 2.0.0 (Bundler::RubyVersionMismatch)

看起来该错误可能是由于独角兽位于/usr/local/rvm/gems/ruby-2.1.3/bin/ 而我的其他宝石位于/usr/local/rvm/gems/ruby-2.0.0-p353/bin/

我的 unicorn.conf 看起来像:

worker_processes 4
user "rails"
working_directory "/home/rails"
pid "/home/unicorn/pids/unicorn.pid"
stderr_path "/home/unicorn/log/unicorn.log"
stdout_path "/home/unicorn/log/unicorn.log"

我的独角兽文件/etc/init.d 看起来像:

set -e
NAME=unicorn
DESC="Unicorn web server"

. /lib/lsb/init-functions

if [ -f /etc/default/unicorn ]; then
  . /etc/default/unicorn
fi

PID=${PID-/run/unicorn.pid}

run_by_init() {
    ([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}

exit_with_message() {
  if ! run_by_init; then
    log_action_msg "$1 Not starting."
  fi
  exit 0
}

check_config() {
  if [ $CONFIGURED != "yes" ]; then
    exit_with_message "Unicorn is not configured (see /etc/default/unicorn)."
  fi
}

check_app_root() {
  if ! [ -d $APP_ROOT ]; then
    exit_with_message "Application directory $APP_ROOT is not exist."
  fi
}

set -u
```
And the start function in that file:
```
  start)
        check_config
        check_app_root

        log_daemon_msg "Starting $DESC" $NAME || true
        if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
              ;;

随后是其他命令,如重新启动、停止等。

还有我的 Gemfile:

source 'https://rubygems.org'
ruby '2.0.0'
gem 'rails', '4.0.0'
gem 'sass-rails', '4.0.1'
gem 'uglifier', '2.4.0'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails'
gem 'jbuilder', '1.5.3'
gem 'bootstrap-sass', '3.1.1.0'
gem 'figaro'
gem 'rolify'
gem 'simple_form'
gem 'bcrypt-ruby', :require => 'bcrypt'
gem 'rails_12factor'
gem 'pg'
gem 'notes-cli'
gem 'twitter-typeahead-rails'
gem 'gon'

group :development do
  gem 'better_errors'
  gem 'binding_of_caller', :platforms=>[:mri_19, :mri_20, :rbx]
  gem 'quiet_assets'
  gem 'rails_layout'
  gem 'mailcatcher'
  gem 'rails-erd'
  gem 'annotate'
end

group :development, :test do
  gem 'factory_girl_rails'
  gem 'rspec-rails'
  gem 'faker'
  gem 'pry'
  gem 'rb-fsevent'
  gem 'guard-rspec'
  gem 'terminal-notifier-guard'
end

group :test do
  gem 'capybara', '2.4.3'
  gem 'database_cleaner'
  gem 'email_spec'
end

如果有任何帮助,我将不胜感激。我是 Digital Ocean、Unicorn 和 Nginx 的新手,只有我的经验 在“部署”中使用 Heroku。

【问题讨论】:

  • 我也有同样的问题!

标签: ruby-on-rails-4 unicorn ruby-2.0 digital-ocean ruby-2.1


【解决方案1】:

我不知道这是否是正确的方法,但我是如何解决问题的:

  1. 杀死所有活跃的独角兽进程。做ps aux | grep unicorn 然后kill -9 pid_number

  2. 按照How To Use the 1-Click Ruby on Rails on Ubuntu 14.04 Image 更改/etc/default/unicorn 中的ruby 版本。特别是这部分:

PATH=/usr/local/rvm/rubies/ruby-2.1.3/bin:/usr/local/rvm/rubies/ruby-2.0.0-p353/bin:/usr/local/rvm/gems/ ruby-2.0.0-p353/bin:/home/unicorn/.rvm/bin:/usr/local/sbin:/usr/bin:/bin:/sbin:$ export GEM_HOME=/usr/local/rvm/gems /ruby-2.1.3 导出 GEM_PATH=/usr/local/rvm/gems/ruby-2.1.3:/usr/local/rvm/gems/ruby-2.1.3 DAEMON=/usr/local/rvm/gems/ruby-2.1.3/bin/unicorn

  1. 更改/etc/init.d/unicorn中的ruby版本,特别是这部分:

导出 GEM_HOME=/usr/local/rvm/gems/ruby-2.2.1 导出 GEM_PATH=/usr/local/rvm/gems/ruby-2.2.1:/usr/local/rvm/gems/ruby-2.2.1/gems:/usr/local/rvm/gems/ruby-2.2.1@global /宝石

在我的引用中,ruby 版本不匹配,因为一个引用来自文章,另一个来自我的实际文件,但请确保在所有地方都有你喜欢的特定 ruby​​ 版本。

  1. 启动独角兽:service unicorn start

这假设您已经运行 bundle install 并拥有所有必要的 gem。

【讨论】:

  • 这让我在升级到 rails 5 和 ruby​​ 2.4.1 后重回正轨。
最近更新 更多