capistrano経由のデプロイでpassengerがリスタートしない

スポンサーリンク

RailsアプリのデプロイにCapistranoを使っているのですが、前に使っていたデプロイスクリプトをコピーしてきたらpassengerの再起動ができませんでした。
どうやらpassengerの再起動方法がバージョンアップで変わったようです。

環境

CentOS6.5、Apache2.2、PhusionPassenger 5.0、Rails4.2

これまでのPassenger再起動

Passenger4.0の再起動方法は以下のとおり。

#config/deploy.rb
…
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # restart.txtという空ファイルを作るとpassengerが再起動してくれる
      execute :touch, "#{fetch :current_path}/tmp/restart.txt"
    end
  end

新しいPassengerの再起動方法

新しい再起動は"passenger-config restart-app"というコマンドで実行するようです。
Passenger の再起動コマンドがいつの間にか変わっていた件について - Qiita

コマンドラインから試しに実行してみると謎のメッセージが・・・

$ ~/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/passenger-5.0.26/bin/passenger-config restart-app
*** ERROR: Phusion Passenger doesn't seem to be running. If you are sure that it
is running, then the causes of this problem could be one of:

 1. You customized the instance registry directory using Apache's
    PassengerInstanceRegistryDir option, Nginx's
    passenger_instance_registry_dir option, or Phusion Passenger Standalone's
    --instance-registry-dir command line argument. If so, please set the
    environment variable PASSENGER_INSTANCE_REGISTRY_DIR to that directory
    and run this command again.
 2. The instance directory has been removed by an operating system background
    service. Please set a different instance registry directory using Apache's
    PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir
    option, or Phusion Passenger Standalone's --instance-registry-dir command
    line argument.

メッセージを見る限りでは、Apacheでは"PassengerInstanceRegistryDir"ディレクティブに任意のディレクトリパスを設定する必要があるようです。

#/etc/httpd/conf/httpd.conf
…
PassengerInstanceRegistry /var/run/passenger-instreg

ディレクトリを作って

mkdir /var/run/passenger-instreg

さらに環境変数"PASSENGER_INSTANCE_REGISTRY_DIR"の設定も必要となります。

export PASSENGER_INSTANCE_REGISTRY_DIR=/var/run/passenger-instreg

こちらのサイトで詳しく説明されています。
CentOS7でpassenger-configやpassenger-statusがエラーになる | Pistolfly


ここまで来れば動くはず。
と思って実行すると、対話モードで選択するアプリを選ぶコンソールが表示されました。

$ ~/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/passenger-5.0.26/bin/passenger-config restart-app
Please select the application to restart.
Tip: re-run this command with --help to learn how to automate it.
If the menu doesn't display correctly, press '!'

 >   /var/www/project/fc2search/current
     Cancel

Restarting /var/www/project/fc2search/current

Enterすれば再起動は実行されるようなんですが、スクリプトできちんと動くのか心配なのでコマンドのオプションを見てみます。

$ ~/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/passenger-5.0.26/bin/passenger-config restart-app --help
Usage 1: passenger-config restart-app <APP PATH PREFIX> [OPTIONS]
Usage 2: passenger-config restart-app . [OPTIONS]
Usage 3: passenger-config restart-app --name <APP GROUP NAME> [OPTIONS]

…
Options:
        --name APP_GROUP_NAME        The app group name to select
        --rolling-restart            Perform a rolling restart instead of a
                                     regular restart (Enterprise only). The
                                     default is a blocking restart
        --ignore-app-not-running     Exit successfully if the specified
                                     application is not currently running. The
                                     default is to exit with an error
        --ignore-passenger-not-running
                                     Exit successfully if Phusion Passenger
                                     is not currently running. The default is to
                                     exit with an error
        --instance NAME              The Phusion Passenger instance to select
        -h, --help                       Show this help

"--name"オプションで再起動するアプリを直接指定できるようです。

$ ~/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/passenger-5.0.26/bin/passenger-config restart-app --name /var/www/project/fc2search/current
Restarting /var/www/project/fc2search/current


サイレントに再起動できました。
あとはこれをdepory.rb上に定義するだけです。

#config/deploy.rb
…
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # passenger-configによる再起動
      execute "passenger-config", "restart-app --name #{fetch :deploy_to}/current"
    end
  end

チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)

チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)

Railsデプロイ

Railsデプロイ

Ruby on Rails環境構築ガイド

Ruby on Rails環境構築ガイド