【Rails】【Capistrano】USR2だと環境変数(ENV["XXX"])を再読み込みしない
前にこんな記事を書きました。
対応期限も迫り切羽詰っている状況で
原因や解決方法がわかったのでメモ。
調査
Capistranoでデプロイ後、capistrano3-unicronを使って再起動をしていました。
再起動前後で、ENV["XXX"]を記述したところが動かず
明示的にunicornをstop, startすると問題なく動きました。
「ENV["XXX"]」に何か原因があるとわかり、探っていると
実際の値は、アプリの実行ユーザーの環境変数「.bash_profile」に
記述していました。
# ~/.bash_profile export SAMPLE="hogepiyo"
なお、ENV["XXX"]をハードコーディングに置き換えると
動くというところまでわかりました。
原因
同じような原因で困っている人がいるはず!と思って調べていたところ
以下の記事がドンピシャリでした。
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側でよしなに設定するのが良さそうです。
また、stop, startを明示的にdeploy.rbに記述のも手かもしれません。
試していない手がまだあるので、いろいろ試してみます。
まとめ
紹介記事ばかりになってしまいましたが、アプリだけ作成しても
Webサービスを作ったとは言えないということが痛感した内容でした。