Ruby on rails 使用capistrano rbenv unicorn部署rails应用程序
我在部署期间盯着独角兽有问题。堆栈跟踪与从Ruby on rails 使用capistrano rbenv unicorn部署rails应用程序,ruby-on-rails,unicorn,rbenv,capistrano3,Ruby On Rails,Unicorn,Rbenv,Capistrano3,我在部署期间盯着独角兽有问题。堆栈跟踪与从“app\u name”/current目录执行时相同: bundle-exec-rails-c生产 deploy.rb # config valid only for current version of Capistrano lock '3.5.0' set :application, 'qna' set :repo_url, 'git@github.com:khataev/qna.git' # Default deploy_to directo
“app\u name”/current
目录执行时相同:
bundle-exec-rails-c生产
deploy.rb
# config valid only for current version of Capistrano
lock '3.5.0'
set :application, 'qna'
set :repo_url, 'git@github.com:khataev/qna.git'
# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, '/home/deployer/qna'
set :deploy_user, 'deployer'
# Default value for :linked_files is []
set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/private_pub.yml', 'config/private_pub_thin.yml', '.env')
# Default value for linked_dirs is []
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system', 'vendor/bundle', 'public/uploads')
# rbenv
set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.3.0'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
# set :rbenv_map_bins, %w(rake gem bundle ruby rails)
set :rbenv_roles, :all # default value
set :bundle_binstubs, nil
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# execute :touch, release_path.join('tmp/restart.txt')
invoke 'unicorn:restart'
end
end
after :publishing, :restart
end
namespace :private_pub do
desc 'Start private_pub server'
task :start do
on roles(:app) do
within current_path do
with rails_env: fetch(:rails_env) do
execute :bundle, 'exec thin -C config/private_pub_thin.yml start'
end
end
end
end
desc 'Stop private_pub server'
task :stop do
on roles(:app) do
within current_path do
with rails_env: fetch(:rails_env) do
execute :bundle, 'exec thin -C config/private_pub_thin.yml stop'
end
end
end
end
desc 'Restart private_pub server'
task :restart do
on roles(:app) do
within current_path do
with rails_env: fetch(:rails_env) do
execute :bundle, 'exec thin -C config/private_pub_thin.yml restart'
end
end
end
end
end
after 'deploy:restart', 'private_pub:restart'
after 'deploy:restart', 'thinking_sphinx:restart'
独角兽/production.rb
# paths
app_path = '/home/deployer/qna'
working_directory "#{app_path}/current"
pid "#{app_path}/current/tmp/pids/unicorn.pid"
# listen
listen '/tmp/unicorn.qna.sock', backlog: 64
# logging
stderr_path 'log/unicorn.stderr.log'
stdout_path 'log/unicorn.stdout.log'
# workers
worker_processes 2
# use correct Gemfile on restarts
before_exec do |_server|
ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
end
# preload
preload_app true
before_fork do |server, _worker|
# the following is highly recomended for Rails + "preload_app true"
# as there's no need for the master process to hold a connection
ActiveRecord::Base.connection.disconnect! if defined?(ActiveRecord::Base)
# Before forking, kill the master process that belongs to the .oldbin PID.
# This enables 0 downtime deploys.
old_pid = "#{server.config[:pid]}.oldbin"
if File.exist?(old_pid) && server.pid != old_pid
begin
Process.kill('QUIT', File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
after_fork do |_server, _worker|
ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base)
end
我认为问题在于rbenv和unicorn之间,但我不是舒尔…我认为您的问题实际上与unicorn无关。在上面的评论中,你说“在我想从乘客迁移到独角兽之前,它不会在生产中造成问题”。但是,切换到unicorn的承诺表明,在此步骤中,
活动的\u model\u序列化程序已从0.9.5版升级到0.10.0版
这对于序列化程序来说非常重要,因为类上下文中似乎不再使用self.root=
方法-它现在是ActiveModel::serializer
类中的一个普通attr\u访问器,也就是说,如果有,那么应该在实例上下文中使用它。请参阅vs
无论如何,如果您想在序列化对象时不包含根,您应该能够切换到-now default-。您可以在控制器中使用adapter::attributes
。此文件的外观:/home/deployer/qna/releases/2016052119207/app/serializers/votable_serializer.rbIt作为链接附加在文章底部。我相信这不是问题的核心,因为它在开发中运行良好,在我想从乘客迁移到独角兽之前,它不会在生产中造成问题。你是对的!激活的\u模型\u序列化程序是原因!我应该更小心地去看宝石版本。。。
# config valid only for current version of Capistrano
lock '3.5.0'
set :application, 'qna'
set :repo_url, 'git@github.com:khataev/qna.git'
# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, '/home/deployer/qna'
set :deploy_user, 'deployer'
# Default value for :linked_files is []
set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/private_pub.yml', 'config/private_pub_thin.yml', '.env')
# Default value for linked_dirs is []
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system', 'vendor/bundle', 'public/uploads')
# rbenv
set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.3.0'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
# set :rbenv_map_bins, %w(rake gem bundle ruby rails)
set :rbenv_roles, :all # default value
set :bundle_binstubs, nil
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# execute :touch, release_path.join('tmp/restart.txt')
invoke 'unicorn:restart'
end
end
after :publishing, :restart
end
namespace :private_pub do
desc 'Start private_pub server'
task :start do
on roles(:app) do
within current_path do
with rails_env: fetch(:rails_env) do
execute :bundle, 'exec thin -C config/private_pub_thin.yml start'
end
end
end
end
desc 'Stop private_pub server'
task :stop do
on roles(:app) do
within current_path do
with rails_env: fetch(:rails_env) do
execute :bundle, 'exec thin -C config/private_pub_thin.yml stop'
end
end
end
end
desc 'Restart private_pub server'
task :restart do
on roles(:app) do
within current_path do
with rails_env: fetch(:rails_env) do
execute :bundle, 'exec thin -C config/private_pub_thin.yml restart'
end
end
end
end
end
after 'deploy:restart', 'private_pub:restart'
after 'deploy:restart', 'thinking_sphinx:restart'
# paths
app_path = '/home/deployer/qna'
working_directory "#{app_path}/current"
pid "#{app_path}/current/tmp/pids/unicorn.pid"
# listen
listen '/tmp/unicorn.qna.sock', backlog: 64
# logging
stderr_path 'log/unicorn.stderr.log'
stdout_path 'log/unicorn.stdout.log'
# workers
worker_processes 2
# use correct Gemfile on restarts
before_exec do |_server|
ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
end
# preload
preload_app true
before_fork do |server, _worker|
# the following is highly recomended for Rails + "preload_app true"
# as there's no need for the master process to hold a connection
ActiveRecord::Base.connection.disconnect! if defined?(ActiveRecord::Base)
# Before forking, kill the master process that belongs to the .oldbin PID.
# This enables 0 downtime deploys.
old_pid = "#{server.config[:pid]}.oldbin"
if File.exist?(old_pid) && server.pid != old_pid
begin
Process.kill('QUIT', File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
after_fork do |_server, _worker|
ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base)
end