使用 EC2 + Rails + Nginx + Capistrano 重新启动时 Puma 重新启动失败

2024-03-17

我已成功使用 capistrano 将我的 Rails 应用程序部署到 Ubuntu EC2。部署时一切都运行良好。 Rails 应用程序名称是 deseov12 我的问题是 Puma 不会在启动时启动,这是必要的,因为生产 EC2 实例将根据需要实例化。 Puma 将在通过 Capistrano 部署时启动,也将在运行时启动

cap production puma:start

在本地机器上。

如果我运行以下命令,它也会在重新启动后在服务器上启动:

su - deploy
[enter password]
cd /home/deploy/deseov12/current && ( export RACK_ENV="production" ; ~/.rvm/bin/rvm ruby-2.2.4 do bundle exec puma -C /home/deploy/deseov12/shared/puma.rb --daemon )

我按照 Puma 丛林工具的指示,通过使用 upstart 使 Puma 在启动时启动,如下所示:

/etc/puma.conf 的内容

/home/deploy/deseov12/current

/etc/init/puma.conf 和 /home/deploy/puma.conf 的内容

# /etc/init/puma.conf - Puma config

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Puma instances with
# Upstart, Ubuntu's native service management tool.
#
# See workers.conf for how to manage all Puma instances at once.
#
# Save this config as /etc/init/puma.conf then manage puma with:
#   sudo start puma app=PATH_TO_APP
#   sudo stop puma app=PATH_TO_APP
#   sudo status puma app=PATH_TO_APP
#
# or use the service command:
#   sudo service puma {start,stop,restart,status}
#

description "Puma Background Worker"

# no "start on", we don't want to automatically start
stop on (stopping puma-manager or runlevel [06])

# change apps to match your deployment user if you want to use this as a less privileged user $
setuid deploy
setgid deploy

respawn
respawn limit 3 30

instance ${app}

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rbenv/rvm
# quoted heredoc to tell /bin/sh not to interpret
# variables

# source ENV variables manually as Upstart doesn't, eg:
#. /etc/environment

exec /bin/bash <<'EOT'
# set HOME to the setuid user's home, there doesn't seem to be a better, portable way
  export HOME="$(eval echo ~$(id -un))"

  if [ -d "/usr/local/rbenv/bin" ]; then
    export PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"
  elif [ -d "$HOME/.rbenv/bin" ]; then
    export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"
  elif [ -f  /etc/profile.d/rvm.sh ]; then
    source /etc/profile.d/rvm.sh
  elif [ -f /usr/local/rvm/scripts/rvm ]; then
    source /etc/profile.d/rvm.sh
  elif [ -f "$HOME/.rvm/scripts/rvm" ]; then
    source "$HOME/.rvm/scripts/rvm"
  elif [ -f /usr/local/share/chruby/chruby.sh ]; then
    source /usr/local/share/chruby/chruby.sh
    if [ -f /usr/local/share/chruby/auto.sh ]; then
      source /usr/local/share/chruby/auto.sh
    fi
    # if you aren't using auto, set your version here
    # chruby 2.0.0
  fi

  cd $app
  logger -t puma "Starting server: $app"

  exec bundle exec puma -C current/config/puma.rb
EOT
end script

/etc/init/puma-manager.conf 和 /home/deploy/puma-manager.conf 的内容

# /etc/init/puma-manager.conf - manage a set of Pumas

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Puma instances with
# Upstart, Ubuntu's native service management tool.
#
# See puma.conf for how to manage a single Puma instance.
#
# Use "stop puma-manager" to stop all Puma instances.
# Use "start puma-manager" to start all instances.
# Use "restart puma-manager" to restart all instances.
# Crazy, right?
#

description "Manages the set of puma processes"

# This starts upon bootup and stops on shutdown
start on runlevel [2345]
stop on runlevel [06]

# Set this to the number of Puma processes you want
# to run on this machine
env PUMA_CONF="/etc/puma.conf"

pre-start script
  for i in `cat $PUMA_CONF`; do
  app=`echo $i | cut -d , -f 1`
  logger -t "puma-manager" "Starting $app"
  start puma app=$app
done
end script

/home/deploy/deseov12/shared/puma.rb 的内容

#!/usr/bin/env puma

directory '/home/deploy/deseov12/current'
rackup "/home/deploy/deseov12/current/config.ru"
environment 'production'

pidfile "/home/deploy/deseov12/shared/tmp/pids/puma.pid"
state_path "/home/deploy/deseov12/shared/tmp/pids/puma.state"
stdout_redirect '/home/deploy/deseov12/shared/log/puma_error.log', '/home/deploy/deseov12/shar$


threads 0,8

bind 'unix:///home/deploy/deseov12/shared/tmp/sockets/puma.sock'

workers 0

activate_control_app

prune_bundler


on_restart do
  puts 'Refreshing Gemfile'
  ENV["BUNDLE_GEMFILE"] = "/home/deploy/deseov12/current/Gemfile"
end

但是,我无法让 Puma 在服务器重新启动后自动启动。它只是没有开始。

我当然希望得到一些帮助

编辑:我刚刚注意到一些可能是线索的东西:

以部署用户身份运行以下命令时:

sudo start puma app=/home/deploy/deseov12/current

ps aux 将显示 puma 进程几秒钟,然后消失。

deploy    4312  103  7.7 183396 78488 ?        Rsl  03:42   0:02 puma 2.15.3 (tcp://0.0.0.0:3000) [20160106224332]

这个puma流程与capistrano启动的工作流程不同:

deploy    5489 10.0 12.4 858088 126716 ?       Sl   03:45   0:02 puma 2.15.3 (unix:///home/deploy/deseov12/shared/tmp/sockets/puma.sock) [20160106224332]

经过大量研究终于解决了这个问题。事实证明,这个问题有三个方面:

1)运行upstart脚本时没有设置正确的环境 2)使用capistrano时实际生产的puma.rb配置文件可以在home/deploy/deseov12/shared目录中找到,而不是在/current/目录中 3)没有正确妖魔化puma服务器

为了解决这些问题:

1) 应将此行添加到 /etc/init/puma.conf 和 /home/deploy/puma.conf 中脚本的开头:

env RACK_ENV="production"

2) 和 3) 这条线

exec bundle exec puma -C current/config/puma.rb

应该用这个替换

exec bundle exec puma -C /home/deploy/deseov12/shared/puma.rb --daemon

执行此操作后,puma 服务器将在重新启动或生成新实例时正常启动。希望这可以帮助人们避免数小时的故障排除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 EC2 + Rails + Nginx + Capistrano 重新启动时 Puma 重新启动失败 的相关文章

  • Rails 3 默认作用域、可覆盖的作用域

    我遇到的情况是现有应用程序的行为正在发生变化 这让我非常头疼 我的应用程序有照片 照片有一个状态 batch queue or complete 应用程序中的所有现有照片都是 完整的 99 的情况下 我只需要显示完整的照片 并且在所有现有代
  • 验证 ActionCable 连接

    我发现了一个很棒的 ActionCable gem 它是 SPA 的一个很好的解决方案 我只想发送html css and js资产 所有其他连接将通过ActionCable 交换字符串或者整数并不难 但是如何通过ActionCable登录
  • 同一模型之间的两个 has_many 链接

    I have users其中有products通过 habtm 链接 该链接正在运行 我想添加一个链接user模型和product模型 以跟踪creator该产品的 当然 谁并不总是拥有该产品 但是当我写在我的user and produc
  • 强参数不起作用

    使用 Ruby 1 9 3 Rails 3 2 13 Strong parameters 0 2 1 我遵循了教程和railscasts中的每一个指示 但我无法让strong parameters工作 这应该是非常简单的事情 但我看不出错误
  • Googlebot 收到现有模板缺少模板错误

    在过去的几天里 当谷歌机器人尝试访问我们的主页 欢迎 索引 时 我们开始收到缺少模板的错误 我已经盯着这个看了几个小时 知道我只是错过了一些简单的东西 A ActionView MissingTemplate occurred in wel
  • rvm编译安装ruby 2.5.0出错

    我正在尝试使用 rvm 安装 ruby 2 5 0 但出现错误 我在 Ubuntu 18 16 和现在的 Linux Mint Cinnamon 上尝试过 基本上我在运行安装 ruby 的代码之前所做的是 打开 GPG 密钥https rv
  • 我们能否知道回形针下载何时完成?

    我有一个应用程序 我需要知道用户的 Rails Paperclip 文件下载时间complete 我的应用程序设置为与 Amazon S3 交互 当用户收到完整的文件时 我需要运行 JavaScript 函数 我怎样才能做到这一点 跟踪天气
  • MONGODB [DEBUG] 游标的cursor.refresh() 7078636577051629992

    更新大型 json 列表时 出现以下错误 2012 04 01T09 34 00 00 00 app run 1 MONGODB DEBUG cursor refresh for cursor 7078636577051629992 201
  • 渲染:带参数的动作

    我有一个有 2 种方法的类 第一个方法由视图使用一些 GET 参数 params page 调用 我想保存这些参数并通过渲染操作将它们发送到我的第二个方法 class exemple def first sql save of params
  • ApplicationController 的未定义方法“helper_method”,Rails 5

    我正在尝试使用doorkeeper 将oAuth2 0 集成到我的仅rails api 应用程序中 但我不断收到此错误 ApplicationController 的未定义方法 helper method 但无法找到解决该问题的明确解决方案
  • 获取设备中的当前用户ID

    如何使用设备获取控制器中的当前用户 ID 在我的控制器中我有这样的东西 def index me current user c User find me sheets c time sheets end 我收到一条错误消息 无法找到没有 I
  • git push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem
  • 为什么“捆绑”会在我的开发机器上安装生产 gem?

    Gemfile 说 gem sqlite3 groups gt development test gem mysql2 group gt production 然而当我打字时bundle install在我的开发机器上安装了所有 gem 我
  • 资产管道弃用警告 tsort.rb:226

    我的 Rails 4 2 在开发中运行良好 但在生产环境中我收到以下警告 DEPRECATION WARNING The configuration option config serve static assets has been re
  • 将 Rails 变量传递给液体可以在控制台中工作,但不在视图中

    我想将哈希传递给渲染方法 当我这样做时 在我的控制台中一切正常 object Object find params id hash object object to liquid template Liquid Template parse
  • Ruby on Rails REST 设计问题 - 在账户之间转账

    我有一个 Account 类 想要实现转账屏幕以允许用户在 2 个账户之间转账 我将如何实现这种 RESTful 方式 我有标准帐户和休息操作 那很好 但我该如何实现转移呢 通常我只会向帐户控制器和相应的视图添加一个名为 transfer
  • Rails 3 + angularjs + 缩小在生产中不起作用:未知提供者:eProvider

    我已遵循我能找到的所有修复缩小的说明 例如 var MyController function renamed scope renamedGreeter MyController inject scope greeter and someM
  • 如何在 Rails 4 中使用 params.require

    我有一个像这样的私有方法 用于有四个字段的注册表单 firstname email password and confirm password 我不知道如何检查password confirmation def user params pa
  • 在 Rails 3 中渲染 Markdown 文本

    我想将 markdown 转换为 html 在我看来我有markdown some text variable 但我得到了错误undefined method markdown I added require BlueCoth 到envir
  • 即使在急切加载之后,belongs_to 关联也会单独加载

    我有以下关联 class Picture lt ActiveRecord Base belongs to user end class User lt ActiveRecord Base has many pictures end 在我的

随机推荐

  • 在 linq 和 EF 中按月份排序

    我有一个 linq 查询 其中包含月份名称 我希望结果按月份 一月 二月 三月 排序 目前我有以下内容 但它给了我一个错误 LINQ to Entities 无法识别方法 System DateTime Parse System Strin
  • Windows Phone 7.5 - 应用程序被逻辑删除时推送通知

    我编写了一个 Windows 7 5 手机应用程序 用于使用 MPNS 注册磁贴和 Toast 推送通知 我的所有基础设施都正常运行 并且电话已在 MPNS 上注册 我将 ChannelUri 保存在手机本地 然后将 ChannelUri
  • lxml XMLSyntaxError:未找到命名空间默认前缀

    我正在使用 lxml 来读取我的 xml 文件 我正在使用如下代码 它在 lxml2 3 beta1 上工作得很好 但在 lxml2 3 上它给了我 zn xml 语法错误 如下所示 我浏览了两个版本的发行说明 但无法弄清楚是什么导致了此错
  • 如何生成如图所示的拼贴图像

    如何生成如下所示的拼贴图像 如果您能让我知道是否有任何在线工具或应用程序可以执行此操作 我将不胜感激 谢谢 使用ImageMagickmontage像这样让你的蒙太奇10张图像宽并且所有图像邻接在一起 之间没有空格 montage geom
  • 第二个下拉列表所选项目在 ASP.NET MVC 中不会更改

    我对 ASP NET MVC 的行为有点困惑 因为它在 POST 之后没有更改下拉列表的值 有人可以解释如何做到这一点 首先我有一个如下所示的模型 public class Test public int OneID get set pub
  • 非法动态引用

    jniPath val subProjectPath projectDependencies value map module gt jniPath in LocalProject module name value val path li
  • 如何在 FluentValidation 中使用 Reflection?

    我有一个场景 我想使用反射来使用 Fluent Validation 进行验证 像这样的事情 public class FooValidator AbstractValidator
  • 从 Java 列表生成 p:tabs

    我想从 Java 列表创建 Primefaces 选项卡 我测试了这段代码
  • 在 mysql 更新查询中查找受影响的字段

    我这里有一个复杂的问题 假设我的表中有 5 个字段 而我的一个用户在运行 mysql 更新查询的表单的帮助下仅更新了 2 个字段 那么有什么办法可以查出哪两个字段被改变了 好吧 我不确定这是否是最好的方法 但它会起作用 请注意 语法适用于
  • 将通用列表数组绑定到 GridView

    您好 我有一个返回 问题 数组的列表 我的问题是如何将其绑定到网格视图 当我尝试调用 Question Ordinal 时 我发现它在数据源中不存在 我正在使用以下代码 GridView1 DataSource myList GetQ Gr
  • 堆栈在缓存中吗?

    在现代计算机中 我知道当前代码区域位于高速缓存中 然而 在许多计算机语言实现中 本地 自动 变量将位于堆栈上 因此会对堆栈进行大量内存访问 在正常架构中 堆栈是否位于另一个缓存中 如果不是 则假设堆栈可以重新定位到 本地 即非常靠近当前代码
  • chrome 扩展:页面完成加载 javascript 后运行脚本

    当页面完成加载时 这根本不会触发 基本上 当我单击浏览器操作按钮时 它会触发它 并且在页面加载时 它将运行一个脚本 在我的background js中 var toggle false chrome browserAction onClic
  • 如何使用 JMeter 发送动态 URL 参数

    我想将 URL PATH 发送为 controller 1 1 controller 2 2 start 但是参数 2controller 2是动态的 如何发送该参数 使参数成为变量 controller 2 controller2 par
  • 使用 swift for Mac 应用程序获得管理权限

    我正在编写一个软件 需要经常以root权限运行命令 现在 我通过询问用户一次密码 保存密码 然后将该密码提供给NSAppleScript作为参数with administrator privileges 这显然对用户来说确实不安全 因为有人
  • 使用 Obj-C 的帖子发送 amp (&)

    我正在发送包含文本 数字和数据的帖子 数字和数据工作正常 但我在文本方面遇到问题 因为它可能包含与号 例如 page php text Hello World Space 现在我发现 被服务器接收到 但读起来就像一个新变量开始一样 所以它看
  • pyqtdeploy:无法检测到 MSVC2015 或 MSVC2017

    我第一次尝试 pyqtdeploy 遵循文档 https www riverbankcomputing com static Docs pyqtdeploy demo html 运行 build demo py 时出现以下错误 C User
  • 将phoneGap 与本机iOS 应用程序集成

    我正在尝试创建一个使用本机功能和phoneGap 框架组合的应用程序 本机应用程序有一个按钮 单击该按钮后 phoneGap ui 必须添加到视图中 有什么办法可以实现这一点吗 有相同的教程吗 是的 这是可能的 尽管您可能会让自己陷入一些头
  • 如何确定我是否在 Android Wear 中运行?

    我在 Android Studio 中有一个移动和穿戴模块 它们都使用 核心 代码库 在该核心代码中 我如何确定我的代码是否在 移动 模块的 穿戴 上运行 我应该使用屏幕尺寸吗 尽管这没有正式记录 据我所知 您可以通过调用以下任一方法来确定
  • 使用 pyautogui 输入 unicode 字符串

    我正在创建一个自动测试应用程序pyautogui库 我想用typewrite将文本输入到表单中的方法 但我的一些输入字符串中含有 unicode 字符 例如 N st 根据文件typewrite只能按单字符键 所以它只是忽略了 特点 您能建
  • 使用 EC2 + Rails + Nginx + Capistrano 重新启动时 Puma 重新启动失败

    我已成功使用 capistrano 将我的 Rails 应用程序部署到 Ubuntu EC2 部署时一切都运行良好 Rails 应用程序名称是 deseov12 我的问题是 Puma 不会在启动时启动 这是必要的 因为生产 EC2 实例将根