수정하기 쉬운 문제로 실행되고 있지만 마법을 찾지 못하는 것 같습니다.이전 릴리스 실행 파일 (rbenv + runit)을 사용하는 unicorn
유니콘은 runit을 사용하고 현재 릴리스 Gemfile을 가리키고 있습니다. 각 배포가 끝날 때 유니콘에 USR2 신호가 전송되고 이전 마스터는 "가동 중단 시간 제로"메소드를 사용하여 성공적으로 바뀝니다. 이전 버전이 삭제 된 시점까지는 괜찮 았습니다. Unitorn 마스터를 처음 만들 때 사용 된 릴리스 디렉토리를 가리키는 runit을 발견했습니다.
난 unicorn.rb이 블록을 추가하는 시도 : 또한,이 스크립트 들러 배치 시도
before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "/home/deploy/app/current/Gemfile"
end
:
#!/bin/bash
source /etc/profile.d/rbenv.sh
bundle [email protected]
는 심지어 시도 수동 BUNDLE_GEMFILE의 ENV 변수 설정, 그러나 이들 중 어느 것도 작동하지 않는 것 같습니다. 내가 배포 한 후 유니콘 표준 출력을 살펴 때
나는이 참조 :
executing ["/home/deploy/app/releases/1279f2e2d88c90ba4e02eaba611a4ee6de6fee77/vendor/bundle/ruby/2.0.0/bin/unicorn", "-E", "staging", "-c", "/home/deploy/app/shared/config/unicorn.rb", "-D", {12=>#<Kgio::UNIXServer:fd 12>}] (in /home/deploy/app/releases/d6a582935d84cc0bec2e760c14d804a7c5e2146c)
당신이 볼 수 있듯이, 명령이 새로운 릴리즈 디렉토리 (d6a582935d84cc0bec2e760c14d804a7c5e2146c)에서 실행되고 있지만, 유니크론 실행은 이전 릴리스 (1279f2e2d88c90ba4e02eaba611a4ee6de6fee77)를 가리 킵니다.
수동으로 유니콘을 중지/시작하면 올바른 릴리스가 사용되지만 "가동 중지 시간이 적용되지 않음"을 의미하지 않습니다.
문제가 무엇인지 확실하지 않지만 rbenv 경로와 관련이 있다고 생각합니다. 누구나 올바른 (현재) 릴리스를 가리키는 유니콘을 얻는 방법에 대한 제안 사항이 있습니까?
누군가 익숙하다면 요리사와 함께 application_ruby LWRP를 사용하여 배포하고 있습니다. 기본적으로 Capistrano를 에뮬레이트합니다.
관련 CONFIGS :
unicorn.rb :
current_path = '/home/deploy/app/current'
working_directory '/home/deploy/app/current'
worker_processes 8
listen "/home/deploy/app/shared/sockets/cms.sock"
timeout 60
pid '/home/deploy/app/shared/pids/unicorn.pid'
stderr_path '/home/deploy/app/shared/log/unicorn/unicorn.stderr.log'
stdout_path '/home/deploy/app/shared/log/unicorn/unicorn.stderr.log'
preload_app true
# Enable Copy on Write Garbage Collector - http://www.rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
if GC.respond_to?(:copy_on_write_friendly=)
GC.copy_on_write_friendly = true
end
before_fork do |server, worker|
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
end
old_pid = "/home/deploy/app/shared/pids/unicorn.pid.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :TERM : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
# sleep 0 for small app, sleep 2 for big (300mb+)
sleep 1
end
before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "#{current_path}/Gemfile"
end
after_fork do |server, worker|
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
end
end
runit 유니콘 스크립트
#!/bin/bash
if [ -d "/home/deploy/app/current" ] ; then
function is_unicorn_alive {
set +e
if [ -n $1 ] && kill -0 $1 >/dev/null 2>&1; then
echo "yes"
fi
set -e
}
echo "Service PID: $$"
CUR_PID_FILE="/home/deploy/app/shared/pids/unicorn.pid"
OLD_PID_FILE=$CUR_PID_FILE.oldbin
if [ -e $OLD_PID_FILE ]; then
OLD_PID=$(cat $OLD_PID_FILE)
echo "Waiting for existing master ($OLD_PID) to exit"
while [ -n "$(is_unicorn_alive $OLD_PID)" ]; do
/bin/echo -n '.'
sleep 2
done
fi
if [ -e $CUR_PID_FILE ]; then
CUR_PID=$(cat $CUR_PID_FILE)
if [ -n "$(is_unicorn_alive $CUR_PID)" ]; then
echo "Unicorn master already running. PID: $CUR_PID"
RUNNING=true
fi
fi
if [ ! $RUNNING ]; then
echo "Starting unicorn"
cd /home/deploy/app/current
chown deploy:deploy /home/deploy/app/shared/pids/
chpst -u deploy \
/opt/rbenv/shims/bundle exec \
unicorn \
-E staging -c /home/deploy/app/shared/config/unicorn.rb -D
sleep 3
CUR_PID=$(cat $CUR_PID_FILE)
fi
function restart {
echo "Initialize new master with USR2"
kill -USR2 $CUR_PID
# Make runit restart to pick up new unicorn pid
sleep 2
echo "Restarting service to capture new pid"
exit
}
function graceful_shutdown {
echo "Initializing graceful shutdown"
kill -QUIT $CUR_PID
}
function unicorn_interrupted {
echo "Unicorn process interrupted. Possibly a runit thing?"
}
trap restart HUP QUIT USR2 INT
trap graceful_shutdown TERM KILL
trap unicorn_interrupted ALRM
echo "Waiting for current master to die. PID: ($CUR_PID)"
while [ -n "$(is_unicorn_alive $CUR_PID)" ]; do
/bin/echo -n '.'
sleep 2
done
else
sleep 1
fi