如何在Passenger独立重启上更新ENV变量

时间:2014-08-13 06:30:26

标签: ruby-on-rails bundler passenger monit

我正在使用Capistrano来部署我的应用程序。应用程序在Passenger独立运行。当我重新部署应用程序时,Passenger仍然使用旧版本中的Gemfile,因为BUNDLE_GEMFILE环境变量尚未更新。

我应该将更新后的路径放到Gemfile中,以便Passenger在重新启动时选择它?

服务器启动命令是monit,我只是从Capistrano任务调用monit脚本,除了重启,我只需触摸restart.txt。

namespace :deploy do

  task :stop do
    run("sudo /usr/bin/monit stop my_app_#{rails_env}")
  end

  task :restart do
    run("cd #{current_path} && touch tmp/restart.txt")
  end

  task :start do
    run("sudo /usr/bin/monit start my_app_#{rails_env}")
  end

monit中的启动命令是:

start program = "/bin/su - app_user -l -c 'cd /home/app_user/current && bundle exec passenger start -d -p 8504 -e production  --pid-file=/home/app_user/current/tmp/pids/passenger.8504.pid  /home/app_user/current'"

我已经尝试将BUNDLE_GEMFILE添加到启动命令中,如下所示:

start program = "/bin/su - app_user -l -c 'cd /home/app_user/current && BUNDLE_GEMFILE=/home/app_user/current/Gemfile bundle exec passenger start -d -p 8504 -e production  --pid-file=/home/app_user/current/tmp/pids/passenger.8504.pid  /home/app_user/current'"

但它没有用,因为路径/home/app_user/current是一个发布路径的符号链接,而是取而代之的是发布路径。

1 个答案:

答案 0 :(得分:1)

简单的解决方案。

定义要在服务器启动命令中使用的Gemfile。例如:

BUNDLE_GEMFILE=/home/app_user/current/Gemfile bundle exec passenger start -d -p 9999 -e production  --pid-file=/home/app_user/current/tmp/pids/passenger.9999.pid  /home/app_user/current

早期的解决方案(在.profile中设置BUNDLE_GEMFILE env变量)并不好。当您部署新版本的应用程序并且捆绑包中有新的gem时,迁移等将失败,因为它仍将使用env变量中定义的Gemfile。