ruby on rails 3 -在没有用户登录的情况下,RVM如何在生产环境中工作



考虑在一台新机器上将RVM投入生产(轻型)。但我没有想象如果用户没有登录,它将如何工作。RVM已安装到/usr/local/rvm/bin/rvm中,因此"每个人"都可以使用。

如果服务器重启并在登录屏幕上,后台守护进程正在服务apache/rails等,并且没有加载.bashrc等…我们如何/在哪里指定加载哪个RVM的ruby ?

也许在《幻影的乘客》里?

谁管理这些宝石?它们是共享的吗?

您可以使用RVM的wrapper命令生成脚本,在执行必要的二进制文件之前加载正确的RVM环境。格式为:

rvm wrapper [ruby_string] [wrapper_prefix] [binary[ binary[ ...]]]

例如,要创建一个名为system_unicorn的二进制文件,加载ruby-1.9.2-p180,然后执行unicorn,使用以下命令:

rvm wrapper ruby-1.9.2-p180 system unicorn

您可以传递多个二进制文件来创建包装器。例如,要为unicorngod创建包装器,请运行

rvm wrapper ruby-1.9.2-p180 system unicorn god

ruby_string可以是任何可以传递给rvm use的内容,因此也可以包含gemset;例如,要为gemset my_app_gemset创建myapp_unicorn,使用:

rvm wrapper ruby-1.9.2-p180@my_app_gemset myapp unicorn

当你现在安装Passenger的时候,它会自动为它的ruby(很确定它叫passenger_ruby)创建一个包装器来加载正确的Ruby版本(你安装时使用的那个版本)。您可以使用config/setup_load_paths.rb来指定一个gemset——参见这个Stack Overflow答案。

在过去,我通过使用设置了rvm的用户运行所有作业来处理这个问题。它确实增加了许多简单作业的复杂性,因为您必须确保加载了rvm。如果需要以root身份执行命令并使用rvm,可以使用rvmsudo命令。

您也可以在系统范围内以root身份安装RVM:

  • https://rvm.beginrescueend.com/rvm/install/

1)如果全局安装,root会在RVM下安装ruby版本和gems(请阅读RVM自述文件——在全局安装时可能会出现问题!)

2)如果你在UNIX上,你的每个系统进程都是作为一个特定的用户启动的,例如,在LINUX上,通过/etc/init.中的init-scriptsd/…而这些过程是作为一个特定的用户创建的,用户名到UID/GID、主目录、和login-shell在/etc/passwd文件中查找——这是为特定用户定义登录shell(例如bash)的地方。

那么,回到你的语句:

If server restarts and is at login screen and background daemons are serving apache/rails, etc. 
and no .bashrc, etc. have loaded...how/where do we specify which of RVM's Rubies to load?

你明白这句话的问题了吗?

当服务器启动和后台进程启动时,每个进程都以特定的用户启动,使用特定的登录shell和特定的主目录。

RVM需要您将登录shell设置为/bin/bash,否则它无法为该特定用户运行的任何进程设置RVM环境。例如,如果你使用/bin/nologin作为默认shell, RVM将无法工作。

Problem1:这当然是一个安全问题!一般来说,出于安全原因,守护进程不应该设置shell。

问题2:你不想让那些入侵你服务器的人可以使用功能强大的工具——这就是为什么你不应该在生产服务器上使用cc和其他工具——这就是为什么你不应该在生产服务器上编译你的ruby和Gems,而是把。rvm目录复制到生产服务器上…

问题3:(更一般)RVM管理所有Ruby和Gem版本的方式是一种非常非常笨拙的版本管理方法。使用一个特定登录shell的特殊功能来促进版本管理并不是一个好主意——当然,目前没有什么比这更好的了,但在过去,Lude背后的想法是安装不同版本软件的更好方法:http://www.iro.umontreal.ca/contrib/lude/lude2_toc.html

结论:

因此,正如我在上一篇文章中提到的,我强烈建议将RVM设置为一个普通用户帐户来运行Ruby和Rails进程,并将/bin/bash设置为登录shell,并通过scp或rsync将。RVM目录从dev-server复制到生产机器上,这是更好更安全的方法。

我有一个类似的问题,我想在生产机器上部署ruby版本和所有相关的gem…

由于我在另一篇文章中概述的原因,我选择使用本地RVM安装。我有一个用户"部署"在我的开发服务器和生产服务器上。

我强烈建议您使用"rsync'或'scp -rp'来复制完整的子目录~/。RVM到目标机器(请记住,您不希望在生产服务器上使用cc和其他工具!)

一个重要的问题:

如果复制.rvm目录,请确保在所有机器上使用相同的命名用户帐户!

我注意到在安装Ruby版本和gems期间,RVM的内部簿记会跟踪一些环境变量,特别是它会跟踪所使用的用户帐户的名称,以及用户主目录的路径。我不明白为什么他们不使用$HOME和$USER,这是所有unix的标准。

如果您在所有机器上使用相同的用户帐户,它将正常工作。

。我使用用户"部署"。它拥有。rvm目录,并且拥有正在运行的进程。

更新

如果你使用rsync或SCP同步你的部署帐户,缺点是你需要手动重启你的服务器,例如unicorn。

另一种有前途的部署RVM和Rails应用程序的方法是部署到一台机器上,在那里运行bundle update,然后从整个部署帐户创建一个RPM,然后通过RPM -Uhv或私有yum存储库安装到所有节点上。这里的优点是节点上的服务可以通过RPM中的%post操作轻松重新启动。

最新更新