【问题标题】:RVM and thin, root vs. local userRVM 和瘦用户、root 用户与本地用户
【发布时间】:2010-07-12 16:48:58
【问题描述】:

所以我正在尝试通过 RVM 作为服务来运行。在thin install 之后,我在运行配置命令时手动更新了/etc/init.d/thin 以使用su - user,以便thin 作为本地用户而不是root 用户运行。到目前为止一切顺利。

现在,当我尝试sudo service thin start 时,它看起来像是在尝试使用非 RVM 版本的 Ruby(开始时安装在盒子上的 1.8.7)来实际执行命令。我在非 RVM 版本上做了一个gem install thin,然后得到了一个uninitialized constant Bundler 消息——Bundler 只安装在 RVM gems 中,而不是系统 gems。看起来我无法设置 RVM 环境(即使我的 RVM 启动脚本位于 ~/.bashrc 中,然后包含在 ~/.bash_profile 中)。

我想要做的就是使用 RVM 环境而不是系统环境将瘦身作为服务运行。这甚至可能吗?我是否应该放弃并犯下以 root 身份运行所有内容的终极罪过?在这一点上非常诱人。

感谢您的帮助!

【问题讨论】:

    标签: ruby sudo bundler rvm thin


    【解决方案1】:

    RVM 带有一个方便的包装器生成器,它为 init.d 脚本创建一个中间加载器。这允许您使用特定的 Ruby 版本和 gemset 加载服务。我是这样使用它的(在安装了thin gem之后):

    1 - 为瘦创建 init.d 条目

    sudo thin install 
    

    2 - 设置一些默认值

    sudo /usr/sbin/update-rc.d -f thin defaults 
    

    3 - 为您的 Rails 应用程序生成引导配置

    sudo thin config -C /etc/thin/<appname>.yml -c /var/rails/<appdir> --servers 4 -e production
    

    4 - 生成 rvm 包装脚本

    rvm wrapper <rubyversion>@<gemset> bootup thin
    

    5 - 如果您使用的是全局 gemset,则可以使用

    rvm wrapper ruby-1.9.2-p125 bootup thin
    

    6 - 编辑精简初始化

    sudo nano /etc/init.d/thin
    

    7 - 改变原来的加载器

    DAEMON=/usr/local/rvm/gems/ruby-<rubyversion>-<rubyrevision>@<gemset>/bin/thin
    

    8 - 改为指向 rvm 包装器

    DAEMON=/usr/local/bin/bootup_thin
    

    9 - 启动它

    sudo service thin start
    

    如果您运行多个应用程序,只需为每个应用程序生成一个引导配置 yml 文件;当启动瘦时,/etc/thin/ 中的所有 yml 文件都会被解析。更多信息在这里:

    http://wiki.rubyonrails.org/deployment/nginx-thin?rev=1233246014 nb:这是链接到修订版,最新版本已被编辑为空。考虑查看网址中没有?rev=... 的链接,当前版本可能会返回并且可能会更新。

    HTH

    2013 年奖金编辑

    虽然我不再在生产中使用 RVM,但 Thin 仍然是我选择的生产服务器,我仍然使用上面的步骤 1-3 开始。但是它生成的默认配置可以做一些调整,这里是我的一些:

    设置thin运行的用户和组为:

    user: www-data
    group: www-data
    

    删除端口配置并改用套接字(快一点):

    # port: 3000
    socket: tmp/sockets/<appname>.sock
    

    告诉 thin 一个一个重启实例,而不是在重新启动之前将它们全部关闭(滚动重启):

    onebyone: true
    

    给服务器进程一个“标签”以帮助识别它们(在 ps aux 等中):

    tag: <appname>
    

    【讨论】:

    • 感谢您的回复!我最终在原项目中走根路线,但下次我将使用此方法!
    • 我在我的用户帐户下运行 rvm。我使用了 rvmsudo 瘦安装,我的 rvm-thin 包装器放在 /home//.rvm/bin/ 我还使用了 update-rc.d Thin 默认值,但是 YMMV
    • 谢谢!但是: sudo /usr/sbin/update-rc.d -f Thin 默认(默认不是默认)
    • 所以这基本上意味着当拥有多个具有不同 gemset 的应用程序时,您不能将瘦作为服务运行?另一件事是,部署捆绑器在vendor/bundle 中安装gem,而不是在rvm gemset 文件夹中,所以rvm 甚至找不到thin 可执行文件。
    • 快速说明,/usr/local/bin/bootup_thin 应该是 /path/to/rvm/bin/bootup_thin。这是它在 rvm.io init.d 集成部分所说的:rvm.io/integration/init-d
    【解决方案2】:

    一个有望节省一些时间的附录:Ubuntu 可以使用 sudo 和环境变量做一些有趣的事情。如果常规 sudo 不起作用,请使用 rvmsudo(在 .rvm/bin 中):

    rvmsudo thin install
    
    rvmsudo update-rc.d -f thin defaults
    

    【讨论】:

      【解决方案3】:

      一个好的做法可能是将应用程序投入服务而不是精简,以便能够在不同的环境中启动应用程序,例如 ruby​​ 1.8.7 myapp1.8.7 中的一个应用程序和 ruby​​ 1.9.2 myapp1.9.2 中的另一个应用程序

      sudo nano /etc/init.d/myapp1.8.7
      

      保留原来的加载器

      DAEMON=/usr/local/rvm/gems/ruby-<rubyversion>-<rubyrevision>@<gemset>/bin/thin
      

      在开始的地方

      $DAEMON -C /etc/thin/$NAME.yml start
      

      然后启动它

      sudo service myapp1.8.7 start
      

      与 app myapp1.9.2 做同样的事情,您将可以在混合环境中独立运行许多应用程序。

      sudo service myapp1.9.2 start
      

      【讨论】:

      • 谢谢@Joel,这确实帮助了我。
      【解决方案4】:

      对于独立安装一个简单的解决方案,我将 root 权限添加到用户的“rvm 要求”,然后使用 visudo username ALL=(ALL:ALL) ALL 删除权限

      https://www.digitalocean.com/community/articles/how-to-add-delete-and-grant-sudo-privileges-to-users-on-a-debian-vps

      您可能会遇到对 /usr/local/rvm 的读/写访问权限的问题

      我更改了权限,以便所有用户都可以读/写/执行;

      作为 root 'chomod a+xwr /usr/local/rvm/'

      在更新 GEMS 时,您将收到来自 RVM 的有关所有用户对该文件夹具有读/写/执行权限的警告

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-30
        • 2018-06-23
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多