2013-09-19 3 views
1

Я использовал этот драгоценный камень некоторое время и просто взял погружение, чтобы попытаться развернуть реальную промежуточную среду на моем промежуточном сервере, и у меня возникли проблемы. Единорог начинается с команды unicorn_rails и -E production, несмотря на правильность настроек afaik.Capistrano-unicorn gem получить неправильный набор окружения

Я заметил в deploy.rb, что моя переменная unicorn_bin была установлена ​​как unicorn_rails. Я выбрал эту настройку в своем deploy.rb. Однако unicorn: duplicate все еще выполняет команду unicorn_rails, когда по умолчанию должно быть unicorn.

У меня все готово к размещению в deploy/staging.rb, как указано в многоступенчатом wiki-документе настройки, но я заметил, что -E все еще настроен на производство.

Релевент информация:

Вот мой выход из моего unicorn.log файла после развёртывания:

executing ["/var/www/apps/myapp/shared/bundle/ruby/2.0.0/bin/unicorn_rails", "-c", "/var/www/apps/bundio/current/config/unicorn.rb", "-E", "production", "-D", {12=>#<Kgio::UNIXServer:/tmp/bundio.socket>, 13=>#<Kgio::TCPServer:fd 13>}] (in /var/www/apps/bundio/current) 

Вот выход из cap -T (по умолчанию постановки)

# Environments 
rails_env   "staging" 
unicorn_env  "staging" 
unicorn_rack_env "staging" 

# Execution 
unicorn_user  nil 
unicorn_bundle  "/usr/local/rvm/gems/[email protected]/bin/bundle" 
unicorn_bin  "unicorn" 
unicorn_options "" 
unicorn_restart_sleep_time 2 

# Relative paths 
app_subdir       "" 
unicorn_config_rel_path   "config" 
unicorn_config_filename   "unicorn.rb" 
unicorn_config_rel_file_path  "config/unicorn.rb" 
unicorn_config_stage_rel_file_path "config/unicorn/staging.rb" 

# Absolute paths 
app_path     "/var/www/apps/myapp/current" 
unicorn_pid    "/var/www/apps/myapp/shared/pids/unicorn.myapp.pid" 
bundle_gemfile   "/var/www/apps/myapp/current/Gemfile" 
unicorn_config_path  "/var/www/apps/myapp/current/config" 
unicorn_config_file_path "/var/www/apps/myapp/current/config/unicorn.rb" 
unicorn_config_stage_file_path 
->      "/var/www/apps/myapp/current/config/unicorn/staging.rb" 

И еще Любопытно, что флаг unicorn_rails -E должен ссылаться на среду рельсов, тогда как unicorn -E должен ссылаться на стойку env - стойка env должна получать только стоимость разработки и развертывания, но он настроен на производство, что немного странно (см. unicorn docs for settings of the RACK_ENV variable.

Любое понимание этого было бы высоко оценено. На моем промежуточном сервере я также установил RAILS_ENV для постановки. Я настроил вещи для рельсов для другой среды, как добавление staging.rb в моей папке сред, добавив раздел Диагностирования database.yml и т.д.

Важных линий в lib/capistrano-unicorn/config.rb говорить о unicorn_rack_env:

_cset(:unicorn_env)    { fetch(:rails_env, 'production') } 
_cset(:unicorn_rack_env) do 
# Following recommendations from http://unicorn.bogomips.org/unicorn_1.html 
fetch(:rails_env) == 'development' ? 'development' : 'deployment' 
end 

Заранее спасибо.

ответ

0

Хорошо, после долгого времени не имея правильной среды, я обнаружил проблему!

В основном, мои скрипты инициализации были запущены до того, как мой кепринано-единорог занимался своим делом.

Итак, убедитесь, что ваши сценарии init.d или upstart для управления Unicorn и его работниками учитываются, когда capistrano-unicorn выполняет задачи перезапуска/перезагрузки/дублирования единорога.

Я не думал рассматривать эти скрипты, когда мне приходилось отлаживать устаревший файл pid/уже запущенный/неспособный слушать ошибки сокета. Но это имеет смысл, так как выскочка запускает Единорог, когда он не работает, а затем капистрано-единорог также пытается начать Единорог.

Теперь я объединил эти задачи и крючки capistrano с Monit и скриптом инициализации Unicorn.

Capistrano задачи:

namespace :monit do 
    desc ' wait 20 seconds ' 
    task :wait_20_seconds do 
    sleep 20 
    end 
    task :monitor_all, :roles => :app do 
    sudo "monit monitor all" 
    end 

    task :unmonitor_all, :roles => :app do 
    sudo "monit unmonitor all" 
    end 

    desc 'monitor unicorn in the monit rc file' 
    task :monitor_unicorn, :roles => :app do 
    sudo "monit monitor unicorn" 
    end 

    desc 'unmonitor unicorn in the monit rc file' 
    task :unmonitor_unicorn, :roles => :app do 
    sudo "monit unmonitor unicorn" 
    end 
end 

Capistrano Крючки:

after 'deploy:restart', 'unicorn:duplicate' # app preloaded. check https://github.com/sosedoff/capistrano-unicorn section for zero downtime 

before 'deploy', "monit:unmonitor_unicorn" 
before 'deploy:migrations', "monit:unmonitor_unicorn" 

after 'deploy', 'monit:wait_20_seconds' 
after "deploy:migrations", "monit:wait_20_seconds" 

after 'monit:wait_20_seconds', 'monit:monitor_unicorn' 

Я использую Monit для мониторинга моего единорога процесса:

Within/и т.д./монит/monitrc:

check process unicorn 
    with pidfile /var/www/apps/my_app/shared/pids/mypid.pid 
    start program = "/usr/bin/sudo service unicorn start" 
    stop program = "/usr/bin/sudo service unicorn stop" 

В пределах init, вы начнете процесс единорога с чего-то вроде: unicorn_rails -c /var/www/apps/my_app/current/config/unicorn.rb -E staging -D Убедитесь, что флаг -E установлен в правильную среду. Графики capistrano-unicorn имеют директивы, использующие :set в файле deploy.rb, которые позволяют указать среду для этого процесса единорога.

Смежные вопросы