Ruby on rails 4 独角兽没有';t通过部署新的Rails应用程序(Capistrano,Nginx)来获取更改

Ruby on rails 4 独角兽没有';t通过部署新的Rails应用程序(Capistrano,Nginx)来获取更改,ruby-on-rails-4,deployment,capistrano,unicorn,Ruby On Rails 4,Deployment,Capistrano,Unicorn,我对部署还不熟悉,所以这可能是新手犯的错误,但现在开始吧 我有一个Rails 4应用程序,我正在使用Capistrano、Unicorn和Nginx的组合部署到Linux服务器上。部署脚本运行良好,应用程序现在可以在所需的IP上访问,所以这很好。问题是,a)Unicorn不会在部署时重新启动(至少,PID不会更改)和b)毫不奇怪,新的更改不会反映在可用的应用程序中。除了完全停止和重新启动unicorn以刷新它之外,我似乎什么都做不了。如果我这样做,那么改变就会被接受,但这个过程显然并不理想 手动

我对部署还不熟悉,所以这可能是新手犯的错误,但现在开始吧

我有一个Rails 4应用程序,我正在使用Capistrano、Unicorn和Nginx的组合部署到Linux服务器上。部署脚本运行良好,应用程序现在可以在所需的IP上访问,所以这很好。问题是,a)Unicorn不会在部署时重新启动(至少,PID不会更改)和b)毫不奇怪,新的更改不会反映在可用的应用程序中。除了完全停止和重新启动unicorn以刷新它之外,我似乎什么都做不了。如果我这样做,那么改变就会被接受,但这个过程显然并不理想

手动地,如果我运行
kill-shup$UNICORN\u PID
,那么工人的PID会发生变化,但主PID不会发生变化,并且变化不会被拾取(显然,它们应该是这样的);使用
USR2
似乎对当前进程没有影响

下面是我正在使用的unicorn init脚本,它基于其他具有类似问题的堆栈溢出问题的建议:

set -e

USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"

# app settings
USER="deploy"
APP_NAME="app_name"
APP_ROOT="/path/to/$APP_NAME"
ENV="production"

# environment settings
PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH"
CMD="cd $APP_ROOT/current && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"
TIMEOUT=${TIMEOUT-60}

# make sure the app exists
cd $APP_ROOT || exit 1

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}

case $1 in
  start)
    sig 0 && echo >&2 "Already running" && exit 0
    echo "Starting $APP_NAME"
    su - $USER -c "$CMD"
    ;;
  stop)
    echo "Stopping $APP_NAME"
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
  force-stop)
    echo "Force stopping $APP_NAME"
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
  restart|reload)
    sig HUP && echo "reloaded $APP_NAME" && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
    run "$CMD"
    ;;
  upgrade)
    if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
    then
      n=$TIMEOUT
      while test -s $OLD_PID && test $n -ge 0
      do
        printf '.' && sleep 1 && n=$(( $n - 1 ))
      done
      echo

    if test $n -lt 0 && test -s $OLD_PID
    then
      echo >&2 "$OLD_PID still exists after $TIMEOUT seconds"
      exit 1
    fi
    exit 0
  fi
  echo >&2 "Couldn't upgrade, starting '$CMD' instead"
  su - $USER -c "$CMD"
  ;;
  rotate)
    sig USR1 && echo rotated logs OK && exit 0
    echo >&2 "Couldn't rotate logs" && exit 1
    ;;
  *)
    echo >&2 $USAGE
    exit 1
    ;;
esac

非常感谢您的帮助,谢谢

很难说清楚,因为我以前没有遇到过这个问题,但我的直觉是这是你的问题:

app_path = File.expand_path("../..", __FILE__)
working_directory "#{app_path}"
每次部署时,Capistrano都会在
releases/
位置为您的应用程序创建一个新目录。然后,它更新当前的符号链接,指向此最新版本目录

# Since "current" is a symlink to the current release,
# Unicorn will always see the latest code.
working_directory "/var/www/my-app/current"
在您的情况下,您可能会错误地告诉Unicorn使用
releases/
作为其
工作目录
。(SSH连接到服务器并检查
unicorn.rb
的内容以确定。)相反,您应该做的是指向
current
。这样你就不必停下来冷启动unicorn,让它看到新的工作目录

# Since "current" is a symlink to the current release,
# Unicorn will always see the latest code.
working_directory "/var/www/my-app/current"
我建议重写unicorn.rb,这样就不会使用相对路径。相反,将绝对路径硬编码到
当前
共享
。这样做是可以的,因为对于每个版本,这些路径将保持不变。

ENV="production"
我看起来非常可疑。我怀疑它想成为

RAILS_ENV="production".

如果没有这个,rails不会醒来不知道它是哪个环境吗?

是的,真不敢相信我错过了!谢谢:)