如何让systemd使用Puma重新启动Rails应用程序

15

我已经苦恼了一个星期,但似乎找不到答案。我使用Capistrano部署了我的Rails应用,服务器上使用的是Puma。

当我部署时,一切正常,问题在于如何使Puma在重新启动和/或崩溃时自动启动。

为了进行部署设置,我使用了这个教程。我还使用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 )。如果我使用上述命令,我会收到来自Systemd的错误,指出缺少参数。所以我写了一个脚本,并让服务文件调用此脚本来启动应用程序。

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

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

2个回答

29

最后问题是双重的: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

没问题!我一早上都在搜索! - Matt Darby
嗨,我在Ubuntu 16.04上遇到了同样的问题,这个方法对我也有效。谢谢! - Atsuhiro Teshima
对我有用,谢谢伙计! - Mayur Shah

4

你是否考虑过使用 Foreman ? Foreman可以轻松启动和停止多进程应用程序。 此外,它还提供了一个导出功能,可以为您生成一些systemdupstart脚本,以便(重新)启动和停止应用程序。

由于你已经在使用capistrano,因此你可以使用capistrano-foreman将所有这些功能与capistrano完美集成。

希望这些资源对你有所帮助。


我会研究一下Foreman并回复(如果它能正常工作,可能会标记为答案)。感谢提供链接。 - WagnerMatosUK

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