RVM和thin,root用户与本地用户的区别

27

我想要让thin在RVM环境下作为服务运行。在执行thin install之后,我手动更新了/etc/init.d/thin文件,以便在运行配置命令时使用su - user使thin以本地用户而非root用户身份运行。目前为止一切正常。

现在,当我尝试使用sudo service thin start启动时,它似乎正在尝试使用非RVM版本的Ruby(安装在该系统上的1.8.7版本)来实际执行该命令。我在非RVM版本上执行了gem install thin,然后得到了一个未初始化常量Bundler的消息——Bundler仅安装在RVM gems中,而非系统gems中。看起来我无法设置RVM环境(即使我的RVM启动脚本在~/.bashrc中,还包括在~/.bash_profile中)。

我只想在RVM环境下将thin作为服务运行,而不是在系统环境下运行。这是否可能?我应该放弃吗,并犯下以根用户身份运行所有东西的终极罪孽?此时此刻,这个诱惑真的很大。

感谢任何帮助!

4个回答

84

RVM提供了一个方便的包装器生成器,可以为init.d脚本创建一个中介加载器。这使您能够使用特定的Ruby版本和gemset加载服务。我使用它来执行以下操作(在安装thin gem之后):

1- 为thin创建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 wrapper 脚本

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 wrapper

DAEMON=/usr/local/bin/bootup_thin

9 - 启动它

sudo service thin start
如果您运行多个应用程序,只需为每个应用程序生成一个启动配置yml文件; 在引导thin时,/etc/thin/中的所有yml文件都会被解析。有关更多信息,请参见此处:http://wiki.rubyonrails.org/deployment/nginx-thin?rev=1233246014 。注意:这是链接到一个修订版本,最新版本已被编辑为空。考虑查看没有url中的?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>

1
谢谢回复!我最终在原始项目中采用了根路由,但下次我会使用这种方法! - Rob Cameron
2
我正在我的用户帐户下运行rvm。我使用了rvmsudo thin install,我的rvm-thin包装器被放置在/home/<username>/.rvm/bin/中。此外,我使用了update-rc.d thin defaults,但可能会因人而异。 - Justin Turner
谢谢!但是:sudo /usr/sbin/update-rc.d -f thin defaults(不是default)。 - valk
那基本上意味着当有多个应用程序具有不同的 gemset 时,您无法将 thin 作为服务运行?另一件事是,对于部署,bundler 会在 vendor/bundle 中安装 gems,而不是在 rvm gemset 文件夹中安装,因此 rvm 甚至找不到 thin 可执行文件。 - RocketR
一个快速的提示,/usr/local/bin/bootup_thin 应该是 /path/to/rvm/bin/bootup_thin。在 rvm.io 的 init.d 集成部分中有这样的说明:https://rvm.io/integration/init-d/。 - O.O
啊,是的,我可能应该指出我的例子是基于Ubuntu/Debian的,并且在其他系统上路径和命令语法可能会有所不同。 - Ola Tuvesson

22

希望能为大家节省一些时间的一个额外提示:Ubuntu可能会在sudo和环境变量方面出现问题。如果常规sudo无法工作,请使用rvmsudo(在.rvm/bin中):

rvmsudo thin install

rvmsudo update-rc.d -f thin defaults

5

一个好的做法可能是将应用程序放在服务中,而不是作为瘦客户端,以便能够在不同环境中启动应用程序,例如一个在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

使用应用程序myapp1.9.2,您可以在混合环境中独立运行多个应用程序。
sudo service myapp1.9.2 start

谢谢 @Joel,这确实帮了我。 - rahoolm

0

对于独立安装而言,一个简单的解决方案是,我将根权限添加到用户的'rvm requirements'中,然后使用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会警告所有用户都可以读/写/执行此文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接