如何让 systemd 使用 Puma 重启 Rails 应用程序
How to get systemd to restart Rails App with Puma
我已经为此苦苦挣扎了一个星期,似乎真的找不到答案。我已经使用 Capistrano 部署了我的 Rails 应用程序。我使用 Puma 作为服务器。
当我部署时,一切正常。问题是让 Puma 在崩溃时重新启动 and/or。
为了获得部署设置,我使用了这个 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 和我的用户。
查看 Capistrano 的部署方式,它 运行s 的命令是: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 的网站上看到了调试页面,但对我没有帮助。如果我 运行 systemctl status puma.service
它只告诉我服务处于失败状态,但它没有告诉我如何或为什么。
还值得注意:如果我从我的 App 文件夹 运行 bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb
它工作正常,那么我如何用 Systemd 服务复制这个命令?
你调查过 Foreman 了吗?
如果您的应用程序有多个进程,Foreman 可以轻松启动和停止您的应用程序。
顺便说一句,它还提供了一个 export 功能,可以生成一些 systemd
或 upstart
脚本供您(重新)启动和停止您的应用程序。
由于您已经在使用 capistrano,因此您可以使用 capistrano-foreman 将所有这些与 capistrano 很好地集成。
希望您能从这些资源中找到一些用处
最后问题是双重的: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
我已经为此苦苦挣扎了一个星期,似乎真的找不到答案。我已经使用 Capistrano 部署了我的 Rails 应用程序。我使用 Puma 作为服务器。
当我部署时,一切正常。问题是让 Puma 在崩溃时重新启动 and/or。
为了获得部署设置,我使用了这个 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 和我的用户。
查看 Capistrano 的部署方式,它 运行s 的命令是: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 的网站上看到了调试页面,但对我没有帮助。如果我 运行 systemctl status puma.service
它只告诉我服务处于失败状态,但它没有告诉我如何或为什么。
还值得注意:如果我从我的 App 文件夹 运行 bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb
它工作正常,那么我如何用 Systemd 服务复制这个命令?
你调查过 Foreman 了吗?
如果您的应用程序有多个进程,Foreman 可以轻松启动和停止您的应用程序。
顺便说一句,它还提供了一个 export 功能,可以生成一些 systemd
或 upstart
脚本供您(重新)启动和停止您的应用程序。
由于您已经在使用 capistrano,因此您可以使用 capistrano-foreman 将所有这些与 capistrano 很好地集成。
希望您能从这些资源中找到一些用处
最后问题是双重的: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