diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-01-14 06:47:02 -0800 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-01-14 06:47:02 -0800 |
commit | 3169b900cc5005c88c7e6bdce0bdd36561978c01 (patch) | |
tree | d639652224842e9cc54e14aa48389728022af343 | |
parent | de5868eef5d8b9c693fc89ce7ceedf06a17ce947 (diff) | |
parent | fde6f2e5c87e4b5cfeae4515e0b6ca57080833ed (diff) | |
download | gitlab-ci-3169b900cc5005c88c7e6bdce0bdd36561978c01.tar.gz |
Merge pull request #40 from corpix/unicorn
Unicorn
-rw-r--r-- | Gemfile | 1 | ||||
-rw-r--r-- | Gemfile.lock | 7 | ||||
-rw-r--r-- | config/unicorn.rb | 64 |
3 files changed, 72 insertions, 0 deletions
@@ -21,6 +21,7 @@ gem 'devise' # Web server gem 'thin' +gem "unicorn", "~> 4.4.0" # Haml gem 'haml-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 926fd95..d414a2f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -95,6 +95,7 @@ GEM railties (>= 3.1.0, < 5.0) thor (~> 0.14) json (1.7.5) + kgio (2.7.4) libv8 (3.3.10.4) libwebsocket (0.1.5) addressable @@ -141,6 +142,7 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) + raindrops (0.10.0) rake (0.9.2.2) rb-fsevent (0.9.1) rb-inotify (0.8.8) @@ -214,6 +216,10 @@ GEM uglifier (1.3.0) execjs (>= 0.3.0) multi_json (~> 1.0, >= 1.0.2) + unicorn (4.4.0) + kgio (~> 2.6) + rack + raindrops (~> 0.7) vegas (0.1.11) rack (>= 1.0.0) warden (1.2.1) @@ -259,4 +265,5 @@ DEPENDENCIES therubyracer thin uglifier (>= 1.0.3) + unicorn (~> 4.4.0) will_paginate (~> 3.0) diff --git a/config/unicorn.rb b/config/unicorn.rb new file mode 100644 index 0000000..7c3ee9c --- /dev/null +++ b/config/unicorn.rb @@ -0,0 +1,64 @@ +app_dir = "/home/gitlab-ci/gitlab-ci/" +worker_processes 2 +working_directory app_dir + +# Load app into the master before forking workers for super-fast +# worker spawn times +preload_app true + +# nuke workers after 30 seconds (60 is the default) +timeout 30 + +# listen on a Unix domain socket and/or a TCP port, + +#listen 8080 # listen to port 8080 on all TCP interfaces +#listen "127.0.0.1:8080" # listen to port 8080 on the loopback interface +listen "#{app_dir}/tmp/sockets/gitlab-ci.socket" + +pid "#{app_dir}/tmp/pids/unicorn.pid" +stderr_path "#{app_dir}/log/unicorn.stderr.log" +stdout_path "#{app_dir}/log/unicorn.stdout.log" + +# 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| + # 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! + + ## + # 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 = "#{server.config[:pid]}.oldbin" + + if File.exists?(old_pid) && server.pid != old_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 + # 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 + + defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection + # Redis and Memcached would go here but their connections are established + # on demand, so the master never opens a socket +end |