如果没有用户登录,RVM如何在生产中工作?

时间:2011-05-06 00:48:42

标签: ruby-on-rails-3 rvm passenger

考虑在新机器上投入RVM(轻型)。但是我没有想象如果用户没有登录它将如何工作.RVM已经安装到/usr/local/rvm/bin/rvm中,因此它可供“所有人”使用。

如果服务器重新启动并且在登录屏幕并且后台守护进程正在服务apache / rails等,并且没有加载.bashrc等等...我们如何/在何处指定要加载哪些RVM的Rubies?

也许在Phusion的乘客的某个地方?

谁管理这些宝石?他们分享了吗?

4 个答案:

答案 0 :(得分:13)

您可以使用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的任何内容,因此也可以包含gemsets;例如,要为gemset myapp_unicorn创建my_app_gemset,请使用:

rvm wrapper ruby-1.9.2-p180@my_app_gemset myapp unicorn

这些天安装Passenger时,会自动为它创建一个包装器ruby(非常确定它称之为passenger_ruby),它会加载正确版本的Ruby(你正在使用的那个版本)你安装它)。您可以使用config/setup_load_paths.rb指定gemset - 请参阅this Stack Overflow answer

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我遇到了类似的问题,我想将ruby版本和所有相关的gems部署到生产机器上......

由于我在其他帖子中列出的原因,我选择使用本地RVM安装。我在我的开发服务器和生产服务器上都有一个用户“部署”。

我强烈建议您使用“rsync”或“scp -rp”将完整的子目录〜/ .rvm复制到目标计算机(请记住,您不希望在生产中使用cc和其他工具服务器!)

一个重要的问题:

如果您复制.rvm目录,请确保在所有计算机上使用具有相同名称的用户帐户!

我注意到RVM的内部簿记在Ruby版本和gem的安装过程中跟踪了一些环境变量,并且它特别跟踪了所使用的用户帐户的名称,以及它的路径。用户的主目录。打败我为什么他们不使用$ HOME和$ USER,这是所有UNIX上的标准..对我来说,似乎是RVM中的一个真正的错误。

如果您为所有计算机使用相同的用户帐户,它将正常工作。

e.g。我使用的用户“deploy”具有.rvm目录,并且拥有正在运行的进程。

更新

如果您使用rsync或scp同步部署帐户,则缺点是您需要重新启动服务器,例如独角兽,手动。

部署RVM和Rails应用程序的另一种有希望的方法是部署到运行捆绑包更新的一台计算机,然后从整个部署帐户创建一个RPM,然后通过rpm -Uhv或私有yum存储库进行安装到所有节点。这里的优点是可以通过RPM中的%post动作轻松地重新启动节点上的服务。

答案 3 :(得分:0)

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

2)如果你在UNIX上,你的每个系统进程都是以特定用户身份启动的,    例如在LINUX上通过/etc/init.d/中的init脚本...而进程是    作为特定用户创建,用户名映射到UID / GID,主目录,    在/ etc / passwd文件中查找和登录shell      - 这是为特定用户定义登录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将不起作用。

问题1: 当然这是一个安全问题!通常,出于安全原因,守护进程不应该有shell集。

Problem2: 您不希望某人闯入您的服务器可以使用高性能工具 - 这就是您不应该在生产服务器上安装cc和其他工具的原因 - 这就是您不应该在生产服务器上编译Rubys和Gems的原因,而是将.rvm目录复制到生产服务器上......

问题3 :(更一般) RVM管理所有Ruby和Gem版本的方式是非常非常非常流行的版本管理方法。 使用一个特定登录shell的特殊功能来促进版本管理不是一个好主意恕我直言 - 确保目前没有更好的东西,但在过去,Lude背后的想法是一个更好的方法来安装不同版本的软件: http://www.iro.umontreal.ca/contrib/lude/lude2_toc.html

结论:

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