Unicorn es un servidor de aplicaciones para Rails, que a diferencia de otros, y a pesar que Rails aún no sea tread-safe, soporta concurrencia, al iniciar varios procesos simultáneamente por cada dyno de Heroku, por lo que es el servidor recomendado para este PaaS >>
gema
Para usarlo, hay que añadirlo al Gemfile
gem 'unicorn'
por supuesto correr después
$ bundle install
config
Además hay que poner un archivo de configuración en config/unicorn.rb >>
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3) timeout 15 preload_app true before_fork do |server, worker| Signal.trap 'TERM' do puts 'Unicorn master intercepting TERM and sending myself QUIT instead' Process.kill 'QUIT', Process.pid end defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| Signal.trap 'TERM' do puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' end defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
para el detalle refiérase a la documentación…
Pero en resumen estás indicando el número de procesos por dyno (se puede entre 2 y 4, acá se usa una variable, o 3) >>, precargando la aplicación para que esté disponible en cada proceso >>, y especificándole qué hacer para iniciarse y terminarse >>
En particular, en lo que respecta a las conexiones a la base de datos, y cómo traducir una señal a cada uno de los procesos.
Por ejemplo, si digo terminar el servidor, éste tiene que ir a hacerlo a cada uno de sus procesos.
Procfile
Pero sobre todo, tienes que especificar que estás usando Unicorn, lo cual no queda tan claro en la documentación, y lo que motivó este post.
Para ésto creas un archivo llamado Procfile en la raíz de tu aplicación, que rece así
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
es decir, defines web como unicorn, le pasas el puerto, y como configuración el archivo de arriba.
Éso era.