【问题标题】:Capistrano doesn't create puma.pid fileCapistrano 不创建 puma.pid 文件
【发布时间】:2016-09-17 08:27:35
【问题描述】:

我使用 Capistrano 来部署我的 Rails 应用程序。 但是,当我部署我的应用程序时,puma.pid 文件没有被创建,这导致了一个问题 - 我无法重新启动服务器或使用 capistrano 部署新版本 - capistrano 无法停止puma,因为puma.pid don' t exests 并且它假定没有 puma 进程正在运行。当 capistrano 尝试运行另一个版本的 puma 时,我收到 ADDRESS ALREADY IN USE 错误。

这是我的deploy.rb

lock '3.4.0'

set :application, 'appname'
set :repo_url, 'giturl'
set :deploy_to, '/home/user/appname'
set :pty, false
set :linked_files, %w(config/application.yml config/database.yml)
set :linked_dirs, %w(log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads)
set :keep_releases, 5
set :rvm_type, :user
set :rvm_ruby_version, '2.3.0'

set :puma_rackup, -> { File.join(current_path, 'config.ru') }
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock" # accept array for multi-bind
set :puma_conf, "#{shared_path}/config/puma.rb"
set :puma_access_log, "#{shared_path}/log/puma_error.log"
set :puma_error_log, "#{shared_path}/log/puma_access.log"
set :puma_role, :app
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :puma_threads, 1
set :puma_workers, 1
set :puma_worker_timeout, nil
set :puma_init_active_record, true
set :puma_preload_app, true

set :sidekiq_config, 'config/sidekiq.yml'
set :sidekiq_log, '/dev/null'
set :sidekiq_processes, 1

set :clockwork_file, "clock.rb"

namespace :deploy do

  desc 'Recompile all enterprise themes'
  task :recompile_themes, [:command] => 'deploy:set_rails_env' do |task, args|
    on primary(:app) do
      within current_path do
        with :rails_env => fetch(:rails_env) do
          rake 'themes:recompile'
        end
      end
    end
  end

  after :finishing, "deploy:recompile_themes"
end

require 'appsignal/capistrano'

例如,当我尝试停止运行 Puma 时,我收到以下错误:

...
DEBUG [37113fcf] Running [ -f /home/user/appname/shared/tmp/pids/puma.pid ] as user@server
DEBUG [37113fcf] Command: [ -f /home/user/appname/shared/tmp/pids/puma.pid ]
DEBUG [37113fcf] Finished in 0.273 seconds with exit status 1 (failed).
WARN Puma not running

确实,/home/user/appname/shared/tmp/pids/puma.pid 文件不存在。我需要手动创建它还是什么?以相同方式创建的 sidekiq.pid 可以在同一目录中找到,所以我认为这不是权限问题。

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: ruby-on-rails server capistrano pid puma


    【解决方案1】:

    我假设您使用的是capistrano3-puma gem。下面是该 gem 的工作原理:各种puma_* 设置对 Puma 没有直接影响。这些设置不会从 Capistrano 传递给 Puma。 Puma 从config/puma.rb 文件中获取所有设置。为了使您的puma_* 设置生效,您必须显式运行:

    cap production puma:config
    

    这将采用您在 Capistrano 中指定的 puma_* 设置,使用这些值构建适当的 config.rb 文件,并将其上传到服务器。具体来说,它将它放在#{shared_path}/config/puma.rb

    您应该在您的:linked_files 中添加config/puma.rb,以便每次部署都与此共享配置相关联。

    换句话说,解决方案是从您的源代码存储库中删除config/puma.rb,而是依靠cap production puma:config 为您生成一个合适的。

    【讨论】:

    • 是的,你是对的。配置服务器的不是我,显然那个人忘记执行一些初始设置命令
    【解决方案2】:

    我设法通过编辑 config/puma.rb 文件并添加以下行来解决此问题:

    # Store the pid of the server in the file at "path".
    pidfile '/home/user/appname/shared/tmp/pids/puma.pid'
    
    # Use "path" as the file to store the server info state. This is
    # used by "pumactl" to query and control the server.
    state_path '/home/user/appname/shared/tmp/pids/puma.state'
    

    但这当然远非理想的解决方案,因为它会产生重复,所以我正在等待来自 SO 社区的其他更优雅的解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2019-03-22
      • 2023-03-07
      • 2012-03-17
      • 2019-12-18
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多