unicorn 0.95.3 → 0.96.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Documentation/unicorn.1.txt +5 -6
- data/Documentation/unicorn_rails.1.txt +4 -6
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +2 -2
- data/bin/unicorn +2 -2
- data/bin/unicorn_rails +2 -2
- data/lib/unicorn.rb +19 -2
- data/lib/unicorn/const.rb +1 -1
- data/lib/unicorn/http_request.rb +1 -1
- data/lib/unicorn/http_response.rb +2 -1
- data/lib/unicorn/launcher.rb +32 -6
- data/local.mk.sample +1 -1
- data/test/exec/test_exec.rb +1 -1
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/.gitignore +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/Rakefile +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/app/controllers/application_controller.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/app/controllers/foo_controller.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/app/helpers/application_helper.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/config/boot.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/config/database.yml +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/config/environment.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/config/environments/development.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/config/environments/production.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/config/routes.rb +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/db/.gitignore +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/public/404.html +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/public/500.html +0 -0
- data/test/rails/{app-2.3.3.1 → app-2.3.5}/public/x.txt +0 -0
- data/test/unit/test_server.rb +10 -0
- metadata +18 -18
data/Documentation/unicorn.1.txt
CHANGED
@@ -13,8 +13,8 @@ unicorn [-c CONFIG_FILE] [-E RACK_ENV] [-D] [RACKUP_FILE]
|
|
13
13
|
# DESCRIPTION
|
14
14
|
|
15
15
|
A rackup(1)-like command to launch Rack applications using Unicorn.
|
16
|
-
It is expected to be started in your application root (APP_ROOT),
|
17
|
-
"
|
16
|
+
It is expected to be started in your application root (APP_ROOT),
|
17
|
+
but the "working_directory" directive may be used in the CONFIG_FILE.
|
18
18
|
|
19
19
|
While Unicorn takes a myriad of command-line options for
|
20
20
|
compatibility with ruby(1) and rackup(1), it is recommended to stick
|
@@ -33,10 +33,9 @@ with rackup(1) but strongly discouraged.
|
|
33
33
|
# UNICORN OPTIONS
|
34
34
|
-c, \--config-file CONFIG_FILE
|
35
35
|
: Path to the Unicorn-specific config file. The config file is
|
36
|
-
implemented as a Ruby DSL, so Ruby code may executed
|
37
|
-
|
38
|
-
|
39
|
-
directives available from the DSL.
|
36
|
+
implemented as a Ruby DSL, so Ruby code may executed.
|
37
|
+
See the RDoc/ri for the *Unicorn::Configurator* class for the full
|
38
|
+
list of directives available from the DSL.
|
40
39
|
|
41
40
|
-D, \--daemonize
|
42
41
|
: Run daemonized in the background. The process is detached from
|
@@ -14,8 +14,7 @@ unicorn_rails [-c CONFIG_FILE] [-E RAILS_ENV] [-D] [RACKUP_FILE]
|
|
14
14
|
|
15
15
|
A rackup(1)-like command to launch Rails applications using Unicorn. It
|
16
16
|
is expected to be started in your Rails application root (RAILS_ROOT),
|
17
|
-
but "
|
18
|
-
optionally, RACKUP_FILE.
|
17
|
+
but the "working_directory" directive may be used in the CONFIG_FILE.
|
19
18
|
|
20
19
|
The outward interface resembles rackup(1), the internals and default
|
21
20
|
middleware loading is designed like the `script/server` command
|
@@ -29,10 +28,9 @@ as much as possible.
|
|
29
28
|
# UNICORN OPTIONS
|
30
29
|
-c, \--config-file CONFIG_FILE
|
31
30
|
: Path to the Unicorn-specific config file. The config file is
|
32
|
-
implemented as a Ruby DSL, so Ruby code may executed
|
33
|
-
|
34
|
-
|
35
|
-
directives available from the DSL.
|
31
|
+
implemented as a Ruby DSL, so Ruby code may executed.
|
32
|
+
See the RDoc/ri for the *Unicorn::Configurator* class for the
|
33
|
+
full list of directives available from the DSL.
|
36
34
|
|
37
35
|
-D, \--daemonize
|
38
36
|
: Run daemonized in the background. The process is detached from
|
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -159,11 +159,11 @@ manifest: $(pkg_extra) man
|
|
159
159
|
cmp $@+ $@ || mv $@+ $@
|
160
160
|
$(RM) $@+
|
161
161
|
|
162
|
-
NEWS: GIT-VERSION-FILE
|
162
|
+
NEWS: GIT-VERSION-FILE .manifest
|
163
163
|
$(RAKE) -s news_rdoc > $@+
|
164
164
|
mv $@+ $@
|
165
165
|
|
166
|
-
SINCE = 0.
|
166
|
+
SINCE = 0.95.0
|
167
167
|
ChangeLog: LOG_VERSION = \
|
168
168
|
$(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
|
169
169
|
echo $(GIT_VERSION) || git describe)
|
data/bin/unicorn
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/
|
1
|
+
#!/this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby
|
2
2
|
# -*- encoding: binary -*-
|
3
3
|
require 'unicorn/launcher'
|
4
4
|
require 'optparse'
|
@@ -161,5 +161,5 @@ if $DEBUG
|
|
161
161
|
})
|
162
162
|
end
|
163
163
|
|
164
|
-
Unicorn::Launcher.daemonize! if daemonize
|
164
|
+
Unicorn::Launcher.daemonize!(options) if daemonize
|
165
165
|
Unicorn.run(app, options)
|
data/bin/unicorn_rails
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/
|
1
|
+
#!/this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby
|
2
2
|
# -*- encoding: binary -*-
|
3
3
|
require 'unicorn/launcher'
|
4
4
|
require 'optparse'
|
@@ -202,6 +202,6 @@ end
|
|
202
202
|
|
203
203
|
if daemonize
|
204
204
|
options[:pid] = rails_pid
|
205
|
-
Unicorn::Launcher.daemonize!
|
205
|
+
Unicorn::Launcher.daemonize!(options)
|
206
206
|
end
|
207
207
|
Unicorn.run(app, options)
|
data/lib/unicorn.rb
CHANGED
@@ -38,7 +38,7 @@ module Unicorn
|
|
38
38
|
:before_fork, :after_fork, :before_exec,
|
39
39
|
:logger, :pid, :app, :preload_app,
|
40
40
|
:reexec_pid, :orig_app, :init_listeners,
|
41
|
-
:master_pid, :config)
|
41
|
+
:master_pid, :config, :ready_pipe)
|
42
42
|
include ::Unicorn::SocketHelper
|
43
43
|
|
44
44
|
# prevents IO objects in here from being GC-ed
|
@@ -162,6 +162,7 @@ module Unicorn
|
|
162
162
|
def initialize(app, options = {})
|
163
163
|
self.app = app
|
164
164
|
self.reexec_pid = 0
|
165
|
+
self.ready_pipe = options.delete(:ready_pipe)
|
165
166
|
self.init_listeners = options[:listeners] ? options[:listeners].dup : []
|
166
167
|
self.config = Configurator.new(options.merge(:use_defaults => true))
|
167
168
|
self.listener_opts = {}
|
@@ -249,6 +250,10 @@ module Unicorn
|
|
249
250
|
def stdout_path=(path); redirect_io($stdout, path); end
|
250
251
|
def stderr_path=(path); redirect_io($stderr, path); end
|
251
252
|
|
253
|
+
def logger=(obj)
|
254
|
+
HttpRequest::DEFAULTS["rack.logger"] = super
|
255
|
+
end
|
256
|
+
|
252
257
|
# sets the path for the PID file of the master process
|
253
258
|
def pid=(path)
|
254
259
|
if path
|
@@ -306,6 +311,9 @@ module Unicorn
|
|
306
311
|
"(#{tries < 0 ? 'infinite' : tries} tries left)"
|
307
312
|
sleep(delay)
|
308
313
|
retry
|
314
|
+
rescue => err
|
315
|
+
logger.fatal "error adding listener addr=#{address}"
|
316
|
+
raise err
|
309
317
|
end
|
310
318
|
end
|
311
319
|
|
@@ -324,6 +332,11 @@ module Unicorn
|
|
324
332
|
trap(:CHLD) { |sig_nr| awaken_master }
|
325
333
|
proc_name 'master'
|
326
334
|
logger.info "master process ready" # test_exec.rb relies on this message
|
335
|
+
if ready_pipe
|
336
|
+
ready_pipe.syswrite($$.to_s)
|
337
|
+
ready_pipe.close rescue nil
|
338
|
+
self.ready_pipe = nil
|
339
|
+
end
|
327
340
|
begin
|
328
341
|
loop do
|
329
342
|
reap_all_workers
|
@@ -528,7 +541,11 @@ module Unicorn
|
|
528
541
|
WORKERS.values.include?(worker_nr) and next
|
529
542
|
worker = Worker.new(worker_nr, Unicorn::Util.tmpio)
|
530
543
|
before_fork.call(self, worker)
|
531
|
-
WORKERS[fork {
|
544
|
+
WORKERS[fork {
|
545
|
+
ready_pipe.close if ready_pipe
|
546
|
+
self.ready_pipe = nil
|
547
|
+
worker_loop(worker)
|
548
|
+
}] = worker
|
532
549
|
end
|
533
550
|
end
|
534
551
|
|
data/lib/unicorn/const.rb
CHANGED
@@ -7,7 +7,7 @@ module Unicorn
|
|
7
7
|
# gave about a 3% to 10% performance improvement over using the strings directly.
|
8
8
|
# Symbols did not really improve things much compared to constants.
|
9
9
|
module Const
|
10
|
-
UNICORN_VERSION="0.
|
10
|
+
UNICORN_VERSION="0.96.0"
|
11
11
|
|
12
12
|
DEFAULT_HOST = "0.0.0.0" # default TCP listen host address
|
13
13
|
DEFAULT_PORT = 8080 # default TCP listen port
|
data/lib/unicorn/http_request.rb
CHANGED
@@ -47,7 +47,8 @@ module Unicorn
|
|
47
47
|
headers.each do |key, value|
|
48
48
|
next if SKIP.include?(key.downcase)
|
49
49
|
if value =~ /\n/
|
50
|
-
|
50
|
+
# avoiding blank, key-only cookies with /\n+/
|
51
|
+
out.concat(value.split(/\n+/).map! { |v| "#{key}: #{v}\r\n" })
|
51
52
|
else
|
52
53
|
out << "#{key}: #{value}\r\n"
|
53
54
|
end
|
data/lib/unicorn/launcher.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
2
|
|
3
|
-
$
|
3
|
+
$stdout.sync = $stderr.sync = true
|
4
4
|
$stdin.binmode
|
5
5
|
$stdout.binmode
|
6
6
|
$stderr.binmode
|
@@ -19,21 +19,47 @@ class Unicorn::Launcher
|
|
19
19
|
# the directory it was started in when being re-executed
|
20
20
|
# to pickup code changes if the original deployment directory
|
21
21
|
# is a symlink or otherwise got replaced.
|
22
|
-
def self.daemonize!
|
22
|
+
def self.daemonize!(options = nil)
|
23
23
|
$stdin.reopen("/dev/null")
|
24
24
|
|
25
25
|
# We only start a new process group if we're not being reexecuted
|
26
26
|
# and inheriting file descriptors from our parent
|
27
27
|
unless ENV['UNICORN_FD']
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
if options
|
29
|
+
# grandparent - reads pipe, exits when master is ready
|
30
|
+
# \_ parent - exits immediately ASAP
|
31
|
+
# \_ unicorn master - writes to pipe when ready
|
31
32
|
|
33
|
+
rd, wr = IO.pipe
|
34
|
+
grandparent = $$
|
35
|
+
if fork
|
36
|
+
wr.close # grandparent does not write
|
37
|
+
else
|
38
|
+
rd.close # unicorn master does not read
|
39
|
+
Process.setsid
|
40
|
+
exit if fork # parent dies now
|
41
|
+
end
|
42
|
+
|
43
|
+
if grandparent == $$
|
44
|
+
# this will block until HttpServer#join runs (or it dies)
|
45
|
+
master_pid = (rd.readpartial(16) rescue nil).to_i
|
46
|
+
unless master_pid > 1
|
47
|
+
warn "master failed to start, check stderr log for details"
|
48
|
+
exit!(1)
|
49
|
+
end
|
50
|
+
exit 0
|
51
|
+
else # unicorn master process
|
52
|
+
options[:ready_pipe] = wr
|
53
|
+
end
|
54
|
+
else # backwards compat
|
55
|
+
exit if fork
|
56
|
+
Process.setsid
|
57
|
+
exit if fork
|
58
|
+
end
|
32
59
|
# $stderr/$stderr can/will be redirected separately in the Unicorn config
|
33
60
|
Unicorn::Configurator::DEFAULTS[:stderr_path] = "/dev/null"
|
34
61
|
Unicorn::Configurator::DEFAULTS[:stdout_path] = "/dev/null"
|
35
62
|
end
|
36
|
-
$stdin.sync = $stdout.sync = $stderr.sync = true
|
37
63
|
end
|
38
64
|
|
39
65
|
end
|
data/local.mk.sample
CHANGED
data/test/exec/test_exec.rb
CHANGED
@@ -805,7 +805,7 @@ EOF
|
|
805
805
|
exec($unicorn_bin, "-D", "-l#{@addr}:#{@port}", "-c#{ucfg.path}")
|
806
806
|
end
|
807
807
|
pid, status = Process.waitpid2(pid)
|
808
|
-
assert status.success?, "original process exited successfully"
|
808
|
+
assert ! status.success?, "original process exited successfully"
|
809
809
|
sleep 1 # can't waitpid on a daemonized process :<
|
810
810
|
assert err.stat.size > 0
|
811
811
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/test/unit/test_server.rb
CHANGED
@@ -228,6 +228,16 @@ class WebServerTest < Test::Unit::TestCase
|
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
231
|
+
def test_logger_set
|
232
|
+
assert_equal @server.logger, Unicorn::HttpRequest::DEFAULTS["rack.logger"]
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_logger_changed
|
236
|
+
tmp = Logger.new($stdout)
|
237
|
+
@server.logger = tmp
|
238
|
+
assert_equal tmp, Unicorn::HttpRequest::DEFAULTS["rack.logger"]
|
239
|
+
end
|
240
|
+
|
231
241
|
def test_bad_client_400
|
232
242
|
sock = nil
|
233
243
|
assert_nothing_raised do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.96.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Unicorn hackers
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-08 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -191,22 +191,22 @@ files:
|
|
191
191
|
- test/rails/app-2.2.2/log/.gitignore
|
192
192
|
- test/rails/app-2.2.2/public/404.html
|
193
193
|
- test/rails/app-2.2.2/public/500.html
|
194
|
-
- test/rails/app-2.3.
|
195
|
-
- test/rails/app-2.3.
|
196
|
-
- test/rails/app-2.3.
|
197
|
-
- test/rails/app-2.3.
|
198
|
-
- test/rails/app-2.3.
|
199
|
-
- test/rails/app-2.3.
|
200
|
-
- test/rails/app-2.3.
|
201
|
-
- test/rails/app-2.3.
|
202
|
-
- test/rails/app-2.3.
|
203
|
-
- test/rails/app-2.3.
|
204
|
-
- test/rails/app-2.3.
|
205
|
-
- test/rails/app-2.3.
|
206
|
-
- test/rails/app-2.3.
|
207
|
-
- test/rails/app-2.3.
|
208
|
-
- test/rails/app-2.3.
|
209
|
-
- test/rails/app-2.3.
|
194
|
+
- test/rails/app-2.3.5/.gitignore
|
195
|
+
- test/rails/app-2.3.5/Rakefile
|
196
|
+
- test/rails/app-2.3.5/app/controllers/application_controller.rb
|
197
|
+
- test/rails/app-2.3.5/app/controllers/foo_controller.rb
|
198
|
+
- test/rails/app-2.3.5/app/helpers/application_helper.rb
|
199
|
+
- test/rails/app-2.3.5/config/boot.rb
|
200
|
+
- test/rails/app-2.3.5/config/database.yml
|
201
|
+
- test/rails/app-2.3.5/config/environment.rb
|
202
|
+
- test/rails/app-2.3.5/config/environments/development.rb
|
203
|
+
- test/rails/app-2.3.5/config/environments/production.rb
|
204
|
+
- test/rails/app-2.3.5/config/routes.rb
|
205
|
+
- test/rails/app-2.3.5/db/.gitignore
|
206
|
+
- test/rails/app-2.3.5/log/.gitignore
|
207
|
+
- test/rails/app-2.3.5/public/404.html
|
208
|
+
- test/rails/app-2.3.5/public/500.html
|
209
|
+
- test/rails/app-2.3.5/public/x.txt
|
210
210
|
- test/rails/test_rails.rb
|
211
211
|
- test/test_helper.rb
|
212
212
|
- test/unit/test_configurator.rb
|