Restarting Unicorn with USR2 doesn't seem to reload production.rb settings

Michael Shimmins picture Michael Shimmins · Feb 22, 2012 · Viewed 10.5k times · Source

I'm running unicorn and am trying to get zero downtime restarts working.

So far it is all awesome sauce, the master process forks and starts 4 new workers, then kills the old one, everyone is happy.

Our scripts send the following command to restart unicorn:

kill -s USR2 `cat /www/app/shared/pids/unicorn.pid`

On the surface everything looks great, but it turns out unicorn isn't reloading production.rb. (Each time we deploy we change the config.action_controller.asset_host value to a new CDN container endpoint with our pre-compiled assets in it).

After restarting unicorn in this way the asset host is still pointing to the old release. Doing a real restart (ie: stop the master process, then start unicorn again from scratch) picks up the new config changes.

preload_app is set to true in our unicorn configuration file.

Any thoughts?

Answer

Veraticus picture Veraticus · Feb 26, 2012

My guess is that your unicorns are being restarted in the old production directory rather than the new production directory -- in other words, if your working directory in unicorn.rb is <capistrano_directory>/current, you need to make sure the symlink happens before you attempt to restart the unicorns.

This would explain why stopping and starting them manually works: you're doing that post-deploy, presumably, which causes them to start in the correct directory.

When in your deploy process are you restarting the unicorns? You should make sure the USR2 signal is being sent after the new release directory is symlinked as current.

If this doesn't help, please gist your unicorn.rb and deploy.rb; it'll make it a lot easier to debug this problem.