From 3f04ede6458edfc526b564b6e1bfb8129d63b1f3 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Sun, 16 Jan 2011 13:44:29 +0800 Subject: [PATCH] add unicorn config --- config/unicorn.rb | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 config/unicorn.rb diff --git a/config/unicorn.rb b/config/unicorn.rb new file mode 100644 index 0000000..cdcda23 --- /dev/null +++ b/config/unicorn.rb @@ -0,0 +1,88 @@ +# Sample configuration file for Unicorn (not Rack) +# +# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete +# documentation. +SINATRA_ROOT = `pwd`.strip + +# Use at least one worker per core if you're on a dedicated server, +# more will usually help for _short_ waits on databases/caches. +worker_processes 3 + +# Help ensure your application will always spawn in the symlinked +# "current" directory that Capistrano sets up. +working_directory SINATRA_ROOT # available in 0.94.0+ + +# listen on both a Unix domain socket and a TCP port, +# we use a shorter backlog for quicker failover when busy +# listen "/tmp/.sock", :backlog => 64 +listen 18889, :tcp_nopush => true + +# nuke workers after 30 seconds instead of 60 seconds (the default) +timeout 30 + +# feel free to point this anywhere accessible on the filesystem + +pid "#{SINATRA_ROOT}/tmp/pids/unicorn.pid" + +# relative_path "/test_platform" +# some applications/frameworks log to stderr or stdout, so prevent +# them from going to /dev/null when daemonized here: +stderr_path "#{SINATRA_ROOT}/log/unicorn.stderr.log" +stdout_path "#{SINATRA_ROOT}/log/unicorn.stdout.log" + +# combine REE with "preload_app true" for memory savings +# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow +preload_app false +GC.respond_to?(:copy_on_write_friendly=) and + GC.copy_on_write_friendly = true + +before_fork do |server, worker| + # the following is highly recomended for Rails + "preload_app true" + # as there's no need for the master process to hold a connection + # defined?(ActiveRecord::Base) and + # ActiveRecord::Base.connection.disconnect! + + # The following is only recommended for memory/DB-constrained + # installations. It is not needed if your system can house + # twice as many worker_processes as you have configured. + # + # # This allows a new master process to incrementally + # # phase out the old master process with SIGTTOU to avoid a + # # thundering herd (especially in the "preload_app false" case) + # # when doing a transparent upgrade. The last worker spawned + # # will then kill off the old master process with a SIGQUIT. + old_pid = "#{server.config[:pid]}.oldbin" + + puts 'pid:' + puts '-------------------' + puts server.pid + puts old_pid + puts '---------------------' + + if old_pid != server.pid + begin + sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU + Process.kill(sig, File.read(old_pid).to_i) + rescue Errno::ENOENT, Errno::ESRCH + end + end + # + # # *optionally* throttle the master from forking too quickly by sleeping + sleep 1 +end + +after_fork do |server, worker| + # per-process listener ports for debugging/admin/migrations + # addr = "127.0.0.1:#{9293 + worker.nr}" + # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true) + + # the following is *required* for Rails + "preload_app true", + # defined?(ActiveRecord::Base) and + # ActiveRecord::Base.establish_connection + + # if preload_app is true, then you may also want to check and + # restart any other shared sockets/descriptors such as Memcached, + # and Redis. TokyoCabinet file handles are safe to reuse + # between any number of forked children (assuming your kernel + # correctly implements pread()/pwrite() system calls) +end \ No newline at end of file