Skip to content

Instantly share code, notes, and snippets.

@richo
Forked from defunkt/gist:206253
Created May 12, 2011 23:47

Revisions

  1. richo revised this gist May 13, 2011. 1 changed file with 9 additions and 14 deletions.
    23 changes: 9 additions & 14 deletions gistfile1.rb
    Original file line number Diff line number Diff line change
    @@ -1,9 +1,10 @@
    # unicorn_rails -c /data/github/current/config/unicorn.rb -E production -D

    # Set by set_env anyway
    rails_env = ENV['RAILS_ENV'] || 'production'

    # 16 workers and 1 master
    worker_processes (rails_env == 'production' ? 16 : 4)
    # 4 workers in testing and 1 master
    worker_processes (rails_env == 'production' ? 4 : 1)

    # Load rails+github.git into the master before forking workers
    # for super-fast worker spawn times
    @@ -13,16 +14,9 @@
    timeout 30

    # Listen on a Unix data socket
    listen '/data/github/current/tmp/sockets/unicorn.sock', :backlog => 2048


    ##
    # REE

    # http://www.rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
    if GC.respond_to?(:copy_on_write_friendly=)
    GC.copy_on_write_friendly = true
    end
    # # XXX Hardcoded socket name??
    # To be generated by Deploy Scripts I guess..
    listen '/tmp/testing_pro.sock', :backlog => 2048


    before_fork do |server, worker|
    @@ -79,7 +73,8 @@
    if RAILS_ENV == 'development'
    STDERR.puts "couldn't change user, oh well"
    else
    raise e
    STDERR.puts "Couldn't drop privelidges, proceed anyway."
    #raise e
    end
    end
    end
    end
  2. @defunkt defunkt revised this gist Oct 9, 2009. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion gistfile1.rb
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,7 @@

    rails_env = ENV['RAILS_ENV'] || 'production'

    # 8 workers and 1 master
    # 16 workers and 1 master
    worker_processes (rails_env == 'production' ? 16 : 4)

    # Load rails+github.git into the master before forking workers
  3. @defunkt defunkt created this gist Oct 9, 2009.
    85 changes: 85 additions & 0 deletions gistfile1.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    # unicorn_rails -c /data/github/current/config/unicorn.rb -E production -D

    rails_env = ENV['RAILS_ENV'] || 'production'

    # 8 workers and 1 master
    worker_processes (rails_env == 'production' ? 16 : 4)

    # Load rails+github.git into the master before forking workers
    # for super-fast worker spawn times
    preload_app true

    # Restart any workers that haven't responded in 30 seconds
    timeout 30

    # Listen on a Unix data socket
    listen '/data/github/current/tmp/sockets/unicorn.sock', :backlog => 2048


    ##
    # REE

    # http://www.rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
    if GC.respond_to?(:copy_on_write_friendly=)
    GC.copy_on_write_friendly = true
    end


    before_fork do |server, worker|
    ##
    # When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
    # immediately start loading up a new version of itself (loaded with a new
    # version of our app). When this new Unicorn is completely loaded
    # it will begin spawning workers. The first worker spawned will check to
    # see if an .oldbin pidfile exists. If so, this means we've just booted up
    # a new Unicorn and need to tell the old one that it can now die. To do so
    # we send it a QUIT.
    #
    # Using this method we get 0 downtime deploys.

    old_pid = RAILS_ROOT + '/tmp/pids/unicorn.pid.oldbin'
    if File.exists?(old_pid) && server.pid != old_pid
    begin
    Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    # someone else did our job for us
    end
    end
    end


    after_fork do |server, worker|
    ##
    # Unicorn master loads the app then forks off workers - because of the way
    # Unix forking works, we need to make sure we aren't using any of the parent's
    # sockets, e.g. db connection

    ActiveRecord::Base.establish_connection
    CHIMNEY.client.connect_to_server
    # Redis and Memcached would go here but their connections are established
    # on demand, so the master never opens a socket


    ##
    # Unicorn master is started as root, which is fine, but let's
    # drop the workers to git:git

    begin
    uid, gid = Process.euid, Process.egid
    user, group = 'git', 'git'
    target_uid = Etc.getpwnam(user).uid
    target_gid = Etc.getgrnam(group).gid
    worker.tmp.chown(target_uid, target_gid)
    if uid != target_uid || gid != target_gid
    Process.initgroups(user, target_gid)
    Process::GID.change_privilege(target_gid)
    Process::UID.change_privilege(target_uid)
    end
    rescue => e
    if RAILS_ENV == 'development'
    STDERR.puts "couldn't change user, oh well"
    else
    raise e
    end
    end
    end