unicorn-shopify 4.8.2.5.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.CHANGELOG.old +25 -0
- data/.document +28 -0
- data/.gitignore +25 -0
- data/.mailmap +26 -0
- data/.olddoc.yml +15 -0
- data/Application_Timeouts +77 -0
- data/CONTRIBUTORS +35 -0
- data/COPYING +674 -0
- data/DESIGN +97 -0
- data/Documentation/.gitignore +5 -0
- data/Documentation/GNUmakefile +30 -0
- data/Documentation/unicorn.1.txt +185 -0
- data/Documentation/unicorn_rails.1.txt +175 -0
- data/FAQ +61 -0
- data/GIT-VERSION-GEN +39 -0
- data/GNUmakefile +252 -0
- data/HACKING +120 -0
- data/ISSUES +100 -0
- data/KNOWN_ISSUES +79 -0
- data/LICENSE +67 -0
- data/Links +59 -0
- data/PHILOSOPHY +145 -0
- data/README +145 -0
- data/Rakefile +16 -0
- data/SIGNALS +123 -0
- data/Sandbox +103 -0
- data/TODO +5 -0
- data/TUNING +101 -0
- data/archive/.gitignore +3 -0
- data/archive/slrnpull.conf +4 -0
- data/bin/unicorn +126 -0
- data/bin/unicorn_rails +209 -0
- data/examples/big_app_gc.rb +2 -0
- data/examples/echo.ru +27 -0
- data/examples/init.sh +74 -0
- data/examples/logger_mp_safe.rb +25 -0
- data/examples/logrotate.conf +29 -0
- data/examples/nginx.conf +156 -0
- data/examples/unicorn.conf.minimal.rb +13 -0
- data/examples/unicorn.conf.rb +113 -0
- data/ext/unicorn_http/CFLAGS +13 -0
- data/ext/unicorn_http/c_util.h +124 -0
- data/ext/unicorn_http/common_field_optimization.h +111 -0
- data/ext/unicorn_http/ext_help.h +82 -0
- data/ext/unicorn_http/extconf.rb +10 -0
- data/ext/unicorn_http/global_variables.h +97 -0
- data/ext/unicorn_http/httpdate.c +78 -0
- data/ext/unicorn_http/unicorn_http.rl +934 -0
- data/ext/unicorn_http/unicorn_http_common.rl +76 -0
- data/lib/unicorn.rb +112 -0
- data/lib/unicorn/app/old_rails.rb +35 -0
- data/lib/unicorn/app/old_rails/static.rb +59 -0
- data/lib/unicorn/cgi_wrapper.rb +147 -0
- data/lib/unicorn/configurator.rb +686 -0
- data/lib/unicorn/const.rb +21 -0
- data/lib/unicorn/http_request.rb +125 -0
- data/lib/unicorn/http_response.rb +73 -0
- data/lib/unicorn/http_server.rb +816 -0
- data/lib/unicorn/launcher.rb +62 -0
- data/lib/unicorn/oob_gc.rb +81 -0
- data/lib/unicorn/preread_input.rb +33 -0
- data/lib/unicorn/socket_helper.rb +197 -0
- data/lib/unicorn/stream_input.rb +146 -0
- data/lib/unicorn/tee_input.rb +133 -0
- data/lib/unicorn/tmpio.rb +27 -0
- data/lib/unicorn/util.rb +90 -0
- data/lib/unicorn/worker.rb +140 -0
- data/setup.rb +1586 -0
- data/t/.gitignore +4 -0
- data/t/GNUmakefile +74 -0
- data/t/README +42 -0
- data/t/before_murder.ru +7 -0
- data/t/bin/content-md5-put +36 -0
- data/t/bin/sha1sum.rb +17 -0
- data/t/bin/unused_listen +40 -0
- data/t/broken-app.ru +12 -0
- data/t/detach.ru +11 -0
- data/t/env.ru +3 -0
- data/t/fails-rack-lint.ru +5 -0
- data/t/heartbeat-timeout.ru +12 -0
- data/t/hijack.ru +42 -0
- data/t/listener_names.ru +4 -0
- data/t/my-tap-lib.sh +201 -0
- data/t/oob_gc.ru +20 -0
- data/t/oob_gc_path.ru +20 -0
- data/t/pid.ru +3 -0
- data/t/preread_input.ru +17 -0
- data/t/rack-input-tests.ru +21 -0
- data/t/t0000-http-basic.sh +50 -0
- data/t/t0001-reload-bad-config.sh +53 -0
- data/t/t0002-config-conflict.sh +49 -0
- data/t/t0002-parser-error.sh +94 -0
- data/t/t0003-working_directory.sh +51 -0
- data/t/t0004-heartbeat-timeout.sh +69 -0
- data/t/t0004-working_directory_broken.sh +24 -0
- data/t/t0005-working_directory_app.rb.sh +40 -0
- data/t/t0006-reopen-logs.sh +83 -0
- data/t/t0006.ru +13 -0
- data/t/t0007-working_directory_no_embed_cli.sh +44 -0
- data/t/t0008-back_out_of_upgrade.sh +110 -0
- data/t/t0009-broken-app.sh +56 -0
- data/t/t0009-winch_ttin.sh +59 -0
- data/t/t0010-reap-logging.sh +55 -0
- data/t/t0011-active-unix-socket.sh +79 -0
- data/t/t0012-reload-empty-config.sh +85 -0
- data/t/t0013-rewindable-input-false.sh +24 -0
- data/t/t0013.ru +12 -0
- data/t/t0014-rewindable-input-true.sh +24 -0
- data/t/t0014.ru +12 -0
- data/t/t0015-configurator-internals.sh +25 -0
- data/t/t0018-write-on-close.sh +23 -0
- data/t/t0019-max_header_len.sh +49 -0
- data/t/t0020-at_exit-handler.sh +49 -0
- data/t/t0021-process_detach.sh +29 -0
- data/t/t0022-listener_names-preload_app.sh +32 -0
- data/t/t0023-before-murder.sh +40 -0
- data/t/t0024-before-murder_once.sh +52 -0
- data/t/t0100-rack-input-tests.sh +124 -0
- data/t/t0116-client_body_buffer_size.sh +80 -0
- data/t/t0116.ru +16 -0
- data/t/t0200-rack-hijack.sh +27 -0
- data/t/t0300-no-default-middleware.sh +20 -0
- data/t/t9000-preread-input.sh +48 -0
- data/t/t9001-oob_gc.sh +47 -0
- data/t/t9002-oob_gc-path.sh +75 -0
- data/t/test-lib.sh +128 -0
- data/t/write-on-close.ru +11 -0
- data/test/aggregate.rb +15 -0
- data/test/benchmark/README +50 -0
- data/test/benchmark/dd.ru +18 -0
- data/test/benchmark/stack.ru +8 -0
- data/test/exec/README +5 -0
- data/test/exec/test_exec.rb +1047 -0
- data/test/test_helper.rb +297 -0
- data/test/unit/test_configurator.rb +175 -0
- data/test/unit/test_droplet.rb +28 -0
- data/test/unit/test_http_parser.rb +854 -0
- data/test/unit/test_http_parser_ng.rb +622 -0
- data/test/unit/test_request.rb +182 -0
- data/test/unit/test_response.rb +93 -0
- data/test/unit/test_server.rb +268 -0
- data/test/unit/test_signals.rb +188 -0
- data/test/unit/test_socket_helper.rb +197 -0
- data/test/unit/test_stream_input.rb +203 -0
- data/test/unit/test_tee_input.rb +304 -0
- data/test/unit/test_upload.rb +306 -0
- data/test/unit/test_util.rb +105 -0
- data/unicorn.gemspec +41 -0
- metadata +311 -0
data/archive/.gitignore
ADDED
data/bin/unicorn
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby
|
|
2
|
+
# -*- encoding: binary -*-
|
|
3
|
+
require 'unicorn/launcher'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
|
|
6
|
+
ENV["RACK_ENV"] ||= "development"
|
|
7
|
+
rackup_opts = Unicorn::Configurator::RACKUP
|
|
8
|
+
options = rackup_opts[:options]
|
|
9
|
+
|
|
10
|
+
op = OptionParser.new("", 24, ' ') do |opts|
|
|
11
|
+
cmd = File.basename($0)
|
|
12
|
+
opts.banner = "Usage: #{cmd} " \
|
|
13
|
+
"[ruby options] [#{cmd} options] [rackup config file]"
|
|
14
|
+
opts.separator "Ruby options:"
|
|
15
|
+
|
|
16
|
+
lineno = 1
|
|
17
|
+
opts.on("-e", "--eval LINE", "evaluate a LINE of code") do |line|
|
|
18
|
+
eval line, TOPLEVEL_BINDING, "-e", lineno
|
|
19
|
+
lineno += 1
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") do
|
|
23
|
+
$DEBUG = true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
opts.on("-w", "--warn", "turn warnings on for your script") do
|
|
27
|
+
$-w = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
opts.on("-I", "--include PATH",
|
|
31
|
+
"specify $LOAD_PATH (may be used more than once)") do |path|
|
|
32
|
+
$LOAD_PATH.unshift(*path.split(':'))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
opts.on("-r", "--require LIBRARY",
|
|
36
|
+
"require the library, before executing your script") do |library|
|
|
37
|
+
require library
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
opts.separator "#{cmd} options:"
|
|
41
|
+
|
|
42
|
+
# some of these switches exist for rackup command-line compatibility,
|
|
43
|
+
|
|
44
|
+
opts.on("-o", "--host HOST",
|
|
45
|
+
"listen on HOST (default: #{Unicorn::Const::DEFAULT_HOST})") do |h|
|
|
46
|
+
rackup_opts[:host] = h
|
|
47
|
+
rackup_opts[:set_listener] = true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
opts.on("-p", "--port PORT", Integer,
|
|
51
|
+
"use PORT (default: #{Unicorn::Const::DEFAULT_PORT})") do |port|
|
|
52
|
+
rackup_opts[:port] = port
|
|
53
|
+
rackup_opts[:set_listener] = true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
opts.on("-E", "--env RACK_ENV",
|
|
57
|
+
"use RACK_ENV for defaults (default: development)") do |e|
|
|
58
|
+
ENV["RACK_ENV"] = e
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
opts.on("-N", "--no-default-middleware",
|
|
62
|
+
"do not load middleware implied by RACK_ENV") do |e|
|
|
63
|
+
rackup_opts[:no_default_middleware] = true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
opts.on("-D", "--daemonize", "run daemonized in the background") do |d|
|
|
67
|
+
rackup_opts[:daemonize] = !!d
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
opts.on("-P", "--pid FILE", "DEPRECATED") do |f|
|
|
71
|
+
warn %q{Use of --pid/-P is strongly discouraged}
|
|
72
|
+
warn %q{Use the 'pid' directive in the Unicorn config file instead}
|
|
73
|
+
options[:pid] = f
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
opts.on("-s", "--server SERVER",
|
|
77
|
+
"this flag only exists for compatibility") do |s|
|
|
78
|
+
warn "-s/--server only exists for compatibility with rackup"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Unicorn-specific stuff
|
|
82
|
+
opts.on("-l", "--listen {HOST:PORT|PATH}",
|
|
83
|
+
"listen on HOST:PORT or PATH",
|
|
84
|
+
"this may be specified multiple times",
|
|
85
|
+
"(default: #{Unicorn::Const::DEFAULT_LISTEN})") do |address|
|
|
86
|
+
options[:listeners] << address
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
opts.on("-c", "--config-file FILE", "Unicorn-specific config file") do |f|
|
|
90
|
+
options[:config_file] = f
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# I'm avoiding Unicorn-specific config options on the command-line.
|
|
94
|
+
# IMNSHO, config options on the command-line are redundant given
|
|
95
|
+
# config files and make things unnecessarily complicated with multiple
|
|
96
|
+
# places to look for a config option.
|
|
97
|
+
|
|
98
|
+
opts.separator "Common options:"
|
|
99
|
+
|
|
100
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
|
101
|
+
puts opts.to_s.gsub(/^.*DEPRECATED.*$/s, '')
|
|
102
|
+
exit
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
opts.on_tail("-v", "--version", "Show version") do
|
|
106
|
+
puts "#{cmd} v#{Unicorn::Const::UNICORN_VERSION}"
|
|
107
|
+
exit
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
opts.parse! ARGV
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
app = Unicorn.builder(ARGV[0] || 'config.ru', op)
|
|
114
|
+
op = nil
|
|
115
|
+
|
|
116
|
+
if $DEBUG
|
|
117
|
+
require 'pp'
|
|
118
|
+
pp({
|
|
119
|
+
:unicorn_options => options,
|
|
120
|
+
:app => app,
|
|
121
|
+
:daemonize => rackup_opts[:daemonize],
|
|
122
|
+
})
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
Unicorn::Launcher.daemonize!(options) if rackup_opts[:daemonize]
|
|
126
|
+
Unicorn::HttpServer.new(app, options).start.join
|
data/bin/unicorn_rails
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
#!/this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby
|
|
2
|
+
# -*- encoding: binary -*-
|
|
3
|
+
require 'unicorn/launcher'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
|
|
7
|
+
ENV['RAILS_ENV'] ||= "development"
|
|
8
|
+
rackup_opts = Unicorn::Configurator::RACKUP
|
|
9
|
+
options = rackup_opts[:options]
|
|
10
|
+
|
|
11
|
+
op = OptionParser.new("", 24, ' ') do |opts|
|
|
12
|
+
cmd = File.basename($0)
|
|
13
|
+
opts.banner = "Usage: #{cmd} " \
|
|
14
|
+
"[ruby options] [#{cmd} options] [rackup config file]"
|
|
15
|
+
opts.separator "Ruby options:"
|
|
16
|
+
|
|
17
|
+
lineno = 1
|
|
18
|
+
opts.on("-e", "--eval LINE", "evaluate a LINE of code") do |line|
|
|
19
|
+
eval line, TOPLEVEL_BINDING, "-e", lineno
|
|
20
|
+
lineno += 1
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") do
|
|
24
|
+
$DEBUG = true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
opts.on("-w", "--warn", "turn warnings on for your script") do
|
|
28
|
+
$-w = true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
opts.on("-I", "--include PATH",
|
|
32
|
+
"specify $LOAD_PATH (may be used more than once)") do |path|
|
|
33
|
+
$LOAD_PATH.unshift(*path.split(':'))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
opts.on("-r", "--require LIBRARY",
|
|
37
|
+
"require the library, before executing your script") do |library|
|
|
38
|
+
require library
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
opts.separator "#{cmd} options:"
|
|
42
|
+
|
|
43
|
+
# some of these switches exist for rackup command-line compatibility,
|
|
44
|
+
|
|
45
|
+
opts.on("-o", "--host HOST",
|
|
46
|
+
"listen on HOST (default: #{Unicorn::Const::DEFAULT_HOST})") do |h|
|
|
47
|
+
rackup_opts[:host] = h
|
|
48
|
+
rackup_opts[:set_listener] = true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
opts.on("-p", "--port PORT", Integer,
|
|
52
|
+
"use PORT (default: #{Unicorn::Const::DEFAULT_PORT})") do |port|
|
|
53
|
+
rackup_opts[:port] = port
|
|
54
|
+
rackup_opts[:set_listener] = true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
opts.on("-E", "--env RAILS_ENV",
|
|
58
|
+
"use RAILS_ENV for defaults (default: development)") do |e|
|
|
59
|
+
ENV['RAILS_ENV'] = e
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
opts.on("-D", "--daemonize", "run daemonized in the background") do |d|
|
|
63
|
+
rackup_opts[:daemonize] = !!d
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Unicorn-specific stuff
|
|
67
|
+
opts.on("-l", "--listen {HOST:PORT|PATH}",
|
|
68
|
+
"listen on HOST:PORT or PATH",
|
|
69
|
+
"this may be specified multiple times",
|
|
70
|
+
"(default: #{Unicorn::Const::DEFAULT_LISTEN})") do |address|
|
|
71
|
+
options[:listeners] << address
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
opts.on("-c", "--config-file FILE", "Unicorn-specific config file") do |f|
|
|
75
|
+
options[:config_file] = f
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
opts.on("-P PATH", "DEPRECATED") do |v|
|
|
79
|
+
warn %q{Use of -P is ambiguous and discouraged}
|
|
80
|
+
warn %q{Use --path or RAILS_RELATIVE_URL_ROOT instead}
|
|
81
|
+
ENV['RAILS_RELATIVE_URL_ROOT'] = v
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
opts.on("--path PATH", "Runs Rails app mounted at a specific path.",
|
|
85
|
+
"(default: /)") do |v|
|
|
86
|
+
ENV['RAILS_RELATIVE_URL_ROOT'] = v
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# I'm avoiding Unicorn-specific config options on the command-line.
|
|
90
|
+
# IMNSHO, config options on the command-line are redundant given
|
|
91
|
+
# config files and make things unnecessarily complicated with multiple
|
|
92
|
+
# places to look for a config option.
|
|
93
|
+
|
|
94
|
+
opts.separator "Common options:"
|
|
95
|
+
|
|
96
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
|
97
|
+
puts opts.to_s.gsub(/^.*DEPRECATED.*$/s, '')
|
|
98
|
+
exit
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
opts.on_tail("-v", "--version", "Show version") do
|
|
102
|
+
puts "#{cmd} v#{Unicorn::Const::UNICORN_VERSION}"
|
|
103
|
+
exit
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
opts.parse! ARGV
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def rails_dispatcher
|
|
110
|
+
if ::Rails::VERSION::MAJOR >= 3 && ::File.exist?('config/application.rb')
|
|
111
|
+
if ::File.read('config/application.rb') =~ /^module\s+([\w:]+)\s*$/
|
|
112
|
+
app_module = Object.const_get($1)
|
|
113
|
+
begin
|
|
114
|
+
result = app_module::Application
|
|
115
|
+
rescue NameError
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
if result.nil? && defined?(ActionController::Dispatcher)
|
|
121
|
+
result = ActionController::Dispatcher.new
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
result || abort("Unable to locate the application dispatcher class")
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def rails_builder(ru, op, daemonize)
|
|
128
|
+
return Unicorn.builder(ru, op) if ru
|
|
129
|
+
|
|
130
|
+
# allow Configurator to parse cli switches embedded in the ru file
|
|
131
|
+
Unicorn::Configurator::RACKUP.update(:file => :rails, :optparse => op)
|
|
132
|
+
|
|
133
|
+
# this lambda won't run until after forking if preload_app is false
|
|
134
|
+
# this runs after config file reloading
|
|
135
|
+
lambda do ||
|
|
136
|
+
# Rails 3 includes a config.ru, use it if we find it after
|
|
137
|
+
# working_directory is bound.
|
|
138
|
+
::File.exist?('config.ru') and
|
|
139
|
+
return Unicorn.builder('config.ru', op).call
|
|
140
|
+
|
|
141
|
+
# Load Rails and (possibly) the private version of Rack it bundles.
|
|
142
|
+
begin
|
|
143
|
+
require ::File.expand_path('config/boot')
|
|
144
|
+
require ::File.expand_path('config/environment')
|
|
145
|
+
rescue LoadError => err
|
|
146
|
+
abort "#$0 must be run inside RAILS_ROOT: #{err.inspect}"
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
defined?(::Rails::VERSION::STRING) or
|
|
150
|
+
abort "Rails::VERSION::STRING not defined by config/{boot,environment}"
|
|
151
|
+
# it seems Rails >=2.2 support Rack, but only >=2.3 requires it
|
|
152
|
+
old_rails = case ::Rails::VERSION::MAJOR
|
|
153
|
+
when 0, 1 then true
|
|
154
|
+
when 2 then Rails::VERSION::MINOR < 3 ? true : false
|
|
155
|
+
else
|
|
156
|
+
false
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
Rack::Builder.new do
|
|
160
|
+
map_path = ENV['RAILS_RELATIVE_URL_ROOT'] || '/'
|
|
161
|
+
if old_rails
|
|
162
|
+
if map_path != '/'
|
|
163
|
+
# patches + tests welcome, but I really cbf to deal with this
|
|
164
|
+
# since all apps I've ever dealt with just use "/" ...
|
|
165
|
+
warn "relative URL roots may not work for older Rails"
|
|
166
|
+
end
|
|
167
|
+
warn "LogTailer not available for Rails < 2.3" unless daemonize
|
|
168
|
+
warn "Debugger not available" if $DEBUG
|
|
169
|
+
require 'unicorn/app/old_rails'
|
|
170
|
+
map(map_path) do
|
|
171
|
+
use Unicorn::App::OldRails::Static
|
|
172
|
+
run Unicorn::App::OldRails.new
|
|
173
|
+
end
|
|
174
|
+
else
|
|
175
|
+
use Rails::Rack::LogTailer unless daemonize
|
|
176
|
+
use Rails::Rack::Debugger if $DEBUG
|
|
177
|
+
map(map_path) do
|
|
178
|
+
unless defined?(ActionDispatch::Static)
|
|
179
|
+
use Rails::Rack::Static
|
|
180
|
+
end
|
|
181
|
+
run rails_dispatcher
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end.to_app
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
app = rails_builder(ARGV[0], op, rackup_opts[:daemonize])
|
|
189
|
+
op = nil
|
|
190
|
+
|
|
191
|
+
if $DEBUG
|
|
192
|
+
require 'pp'
|
|
193
|
+
pp({
|
|
194
|
+
:unicorn_options => options,
|
|
195
|
+
:app => app,
|
|
196
|
+
:daemonize => rackup_opts[:daemonize],
|
|
197
|
+
})
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# ensure Rails standard tmp paths exist
|
|
201
|
+
options[:after_reload] = lambda do
|
|
202
|
+
FileUtils.mkdir_p(%w(cache pids sessions sockets).map! { |d| "tmp/#{d}" })
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
if rackup_opts[:daemonize]
|
|
206
|
+
options[:pid] = "tmp/pids/unicorn.pid"
|
|
207
|
+
Unicorn::Launcher.daemonize!(options)
|
|
208
|
+
end
|
|
209
|
+
Unicorn::HttpServer.new(app, options).start.join
|
data/examples/echo.ru
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#\-E none
|
|
2
|
+
#
|
|
3
|
+
# Example application that echoes read data back to the HTTP client.
|
|
4
|
+
# This emulates the old echo protocol people used to run.
|
|
5
|
+
#
|
|
6
|
+
# An example of using this in a client would be to run:
|
|
7
|
+
# curl --no-buffer -T- http://host:port/
|
|
8
|
+
#
|
|
9
|
+
# Then type random stuff in your terminal to watch it get echoed back!
|
|
10
|
+
|
|
11
|
+
class EchoBody < Struct.new(:input)
|
|
12
|
+
|
|
13
|
+
def each(&block)
|
|
14
|
+
while buf = input.read(4096)
|
|
15
|
+
yield buf
|
|
16
|
+
end
|
|
17
|
+
self
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
use Rack::Chunked
|
|
23
|
+
run lambda { |env|
|
|
24
|
+
/\A100-continue\z/i =~ env['HTTP_EXPECT'] and return [100, {}, []]
|
|
25
|
+
[ 200, { 'Content-Type' => 'application/octet-stream' },
|
|
26
|
+
EchoBody.new(env['rack.input']) ]
|
|
27
|
+
}
|
data/examples/init.sh
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -e
|
|
3
|
+
# Example init script, this can be used with nginx, too,
|
|
4
|
+
# since nginx and unicorn accept the same signals
|
|
5
|
+
|
|
6
|
+
# Feel free to change any of the following variables for your app:
|
|
7
|
+
TIMEOUT=${TIMEOUT-60}
|
|
8
|
+
APP_ROOT=/home/x/my_app/current
|
|
9
|
+
PID=$APP_ROOT/tmp/pids/unicorn.pid
|
|
10
|
+
CMD="/usr/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
|
|
11
|
+
INIT_CONF=$APP_ROOT/config/init.conf
|
|
12
|
+
action="$1"
|
|
13
|
+
set -u
|
|
14
|
+
|
|
15
|
+
test -f "$INIT_CONF" && . $INIT_CONF
|
|
16
|
+
|
|
17
|
+
old_pid="$PID.oldbin"
|
|
18
|
+
|
|
19
|
+
cd $APP_ROOT || exit 1
|
|
20
|
+
|
|
21
|
+
sig () {
|
|
22
|
+
test -s "$PID" && kill -$1 `cat $PID`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
oldsig () {
|
|
26
|
+
test -s $old_pid && kill -$1 `cat $old_pid`
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
case $action in
|
|
30
|
+
start)
|
|
31
|
+
sig 0 && echo >&2 "Already running" && exit 0
|
|
32
|
+
$CMD
|
|
33
|
+
;;
|
|
34
|
+
stop)
|
|
35
|
+
sig QUIT && exit 0
|
|
36
|
+
echo >&2 "Not running"
|
|
37
|
+
;;
|
|
38
|
+
force-stop)
|
|
39
|
+
sig TERM && exit 0
|
|
40
|
+
echo >&2 "Not running"
|
|
41
|
+
;;
|
|
42
|
+
restart|reload)
|
|
43
|
+
sig HUP && echo reloaded OK && exit 0
|
|
44
|
+
echo >&2 "Couldn't reload, starting '$CMD' instead"
|
|
45
|
+
$CMD
|
|
46
|
+
;;
|
|
47
|
+
upgrade)
|
|
48
|
+
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
|
|
49
|
+
then
|
|
50
|
+
n=$TIMEOUT
|
|
51
|
+
while test -s $old_pid && test $n -ge 0
|
|
52
|
+
do
|
|
53
|
+
printf '.' && sleep 1 && n=$(( $n - 1 ))
|
|
54
|
+
done
|
|
55
|
+
echo
|
|
56
|
+
|
|
57
|
+
if test $n -lt 0 && test -s $old_pid
|
|
58
|
+
then
|
|
59
|
+
echo >&2 "$old_pid still exists after $TIMEOUT seconds"
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
62
|
+
exit 0
|
|
63
|
+
fi
|
|
64
|
+
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
|
|
65
|
+
$CMD
|
|
66
|
+
;;
|
|
67
|
+
reopen-logs)
|
|
68
|
+
sig USR1
|
|
69
|
+
;;
|
|
70
|
+
*)
|
|
71
|
+
echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
|
|
72
|
+
exit 1
|
|
73
|
+
;;
|
|
74
|
+
esac
|