考虑在一台新机器上将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
您可以传递多个二进制文件来创建包装器。例如,要为unicorn
和god
创建包装器,请运行
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操作轻松重新启动。