【问题标题】:Making rbenv's ruby as system ruby (Using rbenv's ruby when start up) on Ubuntu在 Ubuntu 上将 rbenv 的 ruby​​ 制作为系统 ruby​​(启动时使用 rbenv 的 ruby​​)
【发布时间】:2015-11-05 05:55:25
【问题描述】:

我正在尝试在 Ubuntu 启动时启动 rails 应用程序。

为此,我在/etc/rc.local 中添加了这些行。

cd /home/ubuntu/webapp/rails/passenger-ruby-rails-demo
bundle exec passenger start --port 8000 --user ubuntu --daemonize

但是,rc.local 退出并出现错误

+ cd /home/ubuntu/webapp/rails/passenger-ruby-rails-demo
+ bundle exec passenger start --port 8000 --user ubuntu --daemonize
/usr/lib/ruby/vendor_ruby/bundler/spec_set.rb:92:in `block in materialize': Could not find rake-10.4.2 in any of the sources (Bundler::GemNotFound)
    from /usr/lib/ruby/vendor_ruby/bundler/spec_set.rb:85:in `map!'
    from /usr/lib/ruby/vendor_ruby/bundler/spec_set.rb:85:in `materialize'
    from /usr/lib/ruby/vendor_ruby/bundler/definition.rb:114:in `specs'
    from /usr/lib/ruby/vendor_ruby/bundler/definition.rb:159:in `specs_for'
    from /usr/lib/ruby/vendor_ruby/bundler/definition.rb:148:in `requested_specs'
    from /usr/lib/ruby/vendor_ruby/bundler/environment.rb:18:in `requested_specs'
    from /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:13:in `setup'
    from /usr/lib/ruby/vendor_ruby/bundler.rb:120:in `setup'
    from /usr/lib/ruby/vendor_ruby/bundler/setup.rb:17:in `<top (required)>'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

该错误是由于使用从 rbenv 安装的 ruby​​ 引起的;红宝石位于 /home/ubuntu/.rbenv/bin/ 目录中。我猜当 ubuntu 启动时,系统 ruby​​ 被执行了,但是它对使用 rbenv 的 ruby​​ 和 gem 安装的包一无所知。

我该如何解决这个问题?有没有办法让 rbenv 中的 ruby​​ 成为系统的 ruby​​?

为了得到错误,我使用了这篇文章中的提示:Run script with rc.local: script works, but not at boot

编辑

mwp 的回答很好,但我想我最好把事情说清楚。

开发包

运行bundle --deployment --binstubs创建./vendor并复制bundle目录下的文件。

setup.sh

#!/bin/bash
export APP_ROOT="/home/ubuntu/webapp/rails/passenger-ruby-rails-demo"
export APP_USER="ubuntu"
export APP_PORT="8000"

export RBENV_ROOT="/home/ubuntu/.rbenv"

export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

# Assuming you installed bundle with --binstubs...
$APP_ROOT/bin/passenger start --port $APP_PORT --user $APP_USER --daemonize

rc.local 文件

cd /home/ubuntu/webapp/rails/passenger-ruby-rails-demo
sh ./setup.sh

exit 0

【问题讨论】:

  • 仅供参考,rbenv init 将为您将shims 添加到PATH。并且像我一样引用APP_ROOT 变量是为了防止包含空格的目录路径。无论如何,我很高兴你找到了一个满意的解决方案!

标签: ruby-on-rails ruby ubuntu rbenv


【解决方案1】:

运行这些命令一次:

cd /home/ubuntu/webapp/rails/passenger-ruby-rails-demo
rbenv local <the version you want>

这将在您的应用程序目录中创建一个.ruby-version 文件,告诉 rbenv 使用哪个版本。

我还建议在将应用程序部署到其“生产”位置时,安装带有 --deployment --binstubs 标志的捆绑程序。这会将 Gems 安装在 vendor 子目录中(以使它们免受错误的 Gem 更新)并在 bin 子目录中创建方便的快捷方式以运行例如passengerrackup 等无需执行bundle exec

但是,您还有另一个问题,那就是 rbenv(shell 函数)[可能]在 rc.local 运行时不可用。我建议创建一个新的 shell 脚本并将其存储在某个地方,可能在您的应用程序的目录结构中,其中包含(类似于)以下内容:

#!/bin/bash
export APP_ROOT="/home/ubuntu/webapp/rails/passenger-ruby-rails-demo"
export APP_USER="ubuntu"
export APP_PORT="8000"

export RBENV_ROOT="/path/to/rbenv"

export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

# Assuming you installed bundle with --binstubs...
"$APP_ROOT"/bin/passenger start --port $APP_PORT --user $APP_USER --daemonize

然后将此脚本标记为可执行,您可以从 rc.local 调用它来启动服务。至于您将RBENV_ROOT 设置为什么,您可以使用现有用户的.rbenv 目录(例如~ubuntu/.rbenv,假设您在那里安装了一个副本),或者您可以在/opt/rbenv 设置系统范围的rbenv或其他地方。有一些很好的笔记here

我可以想出一百万种不同的方法来改进上述脚本,实际上这只是解决这个问题的一百万种不同方法中的一种。启动和停止服务是目前 DevOps 和 SysAdmin 社区中的一个热门话题。我使用 rbenv 和 Bundler 在生产环境中运行 Ruby 应用程序取得了巨大成功,如果你决定走这条路,我希望你也这样做!

【讨论】:

    【解决方案2】:

    Upstart (http://upstart.ubuntu.com) 可能是替换 rc.local 的更好方法。

    # simple script
    # http://uwsgi-docs.readthedocs.org/en/latest/Upstart.html
    
    description "passenger "
    start on runlevel [2345]
    stop on runlevel [06]
    
    respawn
    
    # http://stackoverflow.com/questions/14823972/upstart-node-js-working-directory
    script
        chdir /home/ubuntu/webapp/rails/passenger-ruby-rails-demo
        exec sh runme.sh
    end script
    

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2014-07-19
      • 2021-05-13
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多