【问题标题】:Capistrano Puma won't start due to "shared_path"Capistrano Puma 由于“shared_pa​​th”而无法启动
【发布时间】:2018-05-14 16:07:32
【问题描述】:

我正在尝试构建一个 Capistrano 部署脚本,到目前为止它除了 Puma 部分之外都可以工作:

set :puma_bind,       'unix://#{shared_path}/tmp/sockets/puma_myapp.sock;'
set :puma_state,      '#{shared_path}/tmp/pids/puma_myapp.state'
set :puma_pid,        '#{shared_path}/tmp/pids/puma_myapp.pid'
set :puma_access_log, '#{release_path}/log/puma.error.log'
set :puma_error_log,  '#{release_path}/log/puma.access.log'
set :puma_conf,       "#{shared_path}/puma.rb"
set :puma_threads,    [4, 16]
set :puma_workers,    3
set :puma_env, 'production'
set :assets_roles, [:web, :app]
set :rails_assets_groups, :assets
set :keep_assets, 2
append :rbenv_map_bins, 'puma', 'pumactl'

namespace :puma do
  desc 'create directories for Puma pids and socket'
  task :make_dirs do
    on roles(:app) do
      execute "mkdir #{shared_path}/tmp/sockets -p"
      execute "mkdir #{shared_path}/tmp/pids -p"
    end
  end

  before :start, :make_dirs
end

当我执行脚本时,它在命令puma:start 给出错误后失败:

bundler: failed to load command: puma (/var/www/myapp/shared/bundle/ruby/2.5.0/bin/puma)
  01 NameError: undefined local variable or method `shared_path' for #<Puma::DSL:0x000055e752c4c018>
  01 Did you mean?  state_path

我查看了上传到服务器的 shared/puma.rb conf,除了使用未在 puma.rb 文件中定义的 #{shared_path} 变量外,似乎没有什么奇怪的:

#!/usr/bin/env puma

directory '/var/www/myapp/current'
rackup "/var/www/myapp/current/config.ru"
environment 'production'

tag ''

pidfile "#{shared_path}/tmp/pids/puma.pid"
state_path "#{shared_path}/tmp/pids/puma.state"
stdout_redirect '#{release_path}/log/puma.error.log', '#{release_path}/log/puma.access.log', true

threads 0,16

bind 'unix://#{shared_path}/tmp/sockets/puma_myapp.sock;'

workers 0

prune_bundler

on_restart do
  puts 'Refreshing Gemfile'
  ENV["BUNDLE_GEMFILE"] = ""
end

我错过了什么吗?

【问题讨论】:

  • 一般来说,如果您在 capistrano 上传的配置文件中有 shared_path,则配置文件将是一个被填写的模板 - 类似于 puma.rb.erb 其中包含 &lt;%= shared_path %&gt; - 是您的puma.rb 部署前的模板?
  • 我的 Rails 应用程序中的 puma.rb 文件是默认文件。运行 Capistrano 会得到puma:check WARN puma.rb NOT FOUND! 并在远程服务器的shared 目录下生成 puma.rb 文件。
  • 但是puma.rb 是由某些东西创建的——你使用的是哪个 Capistrano puma 插件(以及它的版本)

标签: ruby-on-rails ruby puma capistrano3


【解决方案1】:

快速重读您的问题后,问题立即变得明显。您正在设置需要用单引号字符串进行插值的 puma 设置,这会禁用插值 - 任何包含 #{...} 的设置都需要用双引号括起来

set :puma_bind,       "unix://#{shared_path}/tmp/sockets/puma_myapp.sock;"
set :puma_state,      "#{shared_path}/tmp/pids/puma_myapp.state"
set :puma_pid,        "#{shared_path}/tmp/pids/puma_myapp.pid"
...

【讨论】:

  • 谢谢!就是这样,一个新手错误...... :) 现在可以正常工作了!
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2021-12-18
  • 1970-01-01
  • 2021-07-20
  • 2018-05-06
  • 2021-04-14
  • 1970-01-01
  • 2019-07-09
相关资源
最近更新 更多