如何让systemd用Puma

时间:2016-07-11 08:36:08

标签: ruby-on-rails linux nginx puma systemd

我一直在努力解决这个问题,现在似乎无法找到答案。我已经用Capistrano部署了我的Rails应用程序。我使用Puma作为服务器。

部署时,一切正常。问题是让Puma在重启和/或崩溃时启动。

要进行部署设置,我已使用此tutorial。我也在使用RVM。我似乎得到的问题是让服务启动Puma。这是我使用过的(服务文件):

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple

#User=my-user

WorkingDirectory=/home/my-user/apps/MyApp/current

ExecStart=/home/my-user/apps/MyApp/current/sbin/puma -C /home/my-user/apps/MyApp/shared/puma.rb

Restart=always

[Install]
WantedBy=multi-user.target

这不起作用。我开始认为问题是没有为所有用户安装Ruby,所以我为所有用户安装了RVM,但仍然遇到了同样的问题。我的服务器只有root和my-user。

看看Capistrano如何部署,它运行的命令是:cd /home/my-user/apps/MyApp/current && ( RACK_ENV=production /home/my-user/.rvm/bin/rvm default do bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb --daemon )。如果我使用上述命令,我会收到来自Systmd的错误,抱怨缺少参数。所以我用它编写了一个脚本,并获得了服务文件来调用这个脚本来启动应用程序。

这也不起作用。请注意,如果我从服务器上的任何位置调用脚本,脚本会启动应用程序,因此它在配置Systemd时出现问题,但我无法弄清楚错误是什么,我不确定如何调试它。我在System&#39的网站上看过调试页面,但它对我没有帮助。如果我运行systemctl status puma.service,它会告诉我服务处于失败状态,但它并没有告诉我如何或为什么。

另外值得注意的是:如果我从我的App文件夹运行bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb它可以正常工作,那么如何使用Systemd服务复制此命令?

2 个答案:

答案 0 :(得分:21)

最后问题是双重的:1)没有为所有用户正确安装rvm,这意味着部署用户没有ruby / bundle / etc可用,其次脚本也是错误的。以下是对我有用的修订脚本:

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple

User=deployer

WorkingDirectory=/var/www/apps/MRCbe/current

ExecStart=/bin/bash -lc 'bundle exec puma -C /var/www/apps/MRCbe/shared/puma.rb'

Restart=always

[Install]
WantedBy=multi-user.target

答案 1 :(得分:3)

你有没有看过Foreman? 如果有多个流程,Foreman可以轻松启动和停止您的应用程序。 顺便提一下,它还提供了export函数,可以为您生成一些systemdupstart脚本,以便(重新)启动和停止您的应用程序。

由于你已经在使用capistrano,你可以使用capistrano-foreman将所有这些与capistrano很好地整合。

我希望你能在这些资源中找到一些用途