読者です 読者をやめる 読者になる 読者になる

【Rails】【Capistrano】USR2だと環境変数(ENV["XXX"])を再読み込みしない

前にこんな記事を書きました。

fujiyasu.hatenablog.com

対応期限も迫り切羽詰っている状況で
原因や解決方法がわかったのでメモ。

調査

Capistranoでデプロイ後、capistrano3-unicronを使って再起動をしていました。

github.com

再起動前後で、ENV["XXX"]を記述したところが動かず
明示的にunicornをstop, startすると問題なく動きました。

「ENV["XXX"]」に何か原因があるとわかり、探っていると
実際の値は、アプリの実行ユーザーの環境変数「.bash_profile」に
記述していました。

# ~/.bash_profile
export SAMPLE="hogepiyo"

なお、ENV["XXX"]をハードコーディングに置き換えると
動くというところまでわかりました。

原因

同じような原因で困っている人がいるはず!と思って調べていたところ
以下の記事がドンピシャリでした。

qiita.com

capistrano3-unicronを使っていたので、unicorn:restartのソースを見てみます。

https://github.com/tablexi/capistrano3-unicorn/blob/master/lib/capistrano3/tasks/unicorn.rake#L64

# 該当箇所を抜粋
  desc "Restart Unicorn (USR2); use this when preload_app: true"
  task :restart do
    invoke "unicorn:start"
    on roles(fetch(:unicorn_roles)) do
      within current_path do
        info "unicorn restarting..."
        execute :kill, "-s USR2", pid
      end
    end
  end

そして、自分が書いたdeploy.rbはこんな感じです。

# config/deploy.rb
namespace :deploy do
  # ...中略...

  task :restart do
    invoke 'unicorn:restart'
  end

  before :starting, :upload
end

まさしく、unicorn:restartを実行していて、さらにUSR2でkillされていることがわかりました。
これで、環境変数が新しく読み込まれず、エラーになってしまいます。

解決方法

手動でunicornをstop, startするのもイケてないですし、USR2を使って安全にkillをしたい。
なので、unicorn側でよしなに設定するのが良さそうです。

qiita.com

また、stop, startを明示的にdeploy.rbに記述のも手かもしれません。
試していない手がまだあるので、いろいろ試してみます。

まとめ

紹介記事ばかりになってしまいましたが、アプリだけ作成しても
Webサービスを作ったとは言えないということが痛感した内容でした。