unicorn 4.8.3 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +5 -5
  2. data/.document +0 -1
  3. data/.gitattributes +5 -0
  4. data/.gitignore +2 -2
  5. data/.manifest +15 -19
  6. data/.olddoc.yml +25 -0
  7. data/Application_Timeouts +7 -7
  8. data/CONTRIBUTORS +6 -2
  9. data/DESIGN +2 -4
  10. data/Documentation/.gitignore +1 -3
  11. data/Documentation/unicorn.1 +222 -0
  12. data/Documentation/unicorn_rails.1 +207 -0
  13. data/FAQ +23 -6
  14. data/GIT-VERSION-FILE +1 -1
  15. data/GIT-VERSION-GEN +1 -1
  16. data/GNUmakefile +138 -92
  17. data/HACKING +5 -30
  18. data/ISSUES +73 -36
  19. data/KNOWN_ISSUES +18 -18
  20. data/LATEST +16 -22
  21. data/LICENSE +2 -2
  22. data/Links +24 -22
  23. data/NEWS +771 -0
  24. data/PHILOSOPHY +0 -6
  25. data/README +48 -42
  26. data/Rakefile +0 -44
  27. data/SIGNALS +2 -2
  28. data/Sandbox +11 -10
  29. data/TODO +0 -2
  30. data/TUNING +30 -9
  31. data/archive/slrnpull.conf +1 -1
  32. data/bin/unicorn +4 -2
  33. data/bin/unicorn_rails +3 -3
  34. data/examples/big_app_gc.rb +1 -1
  35. data/examples/init.sh +36 -8
  36. data/examples/logrotate.conf +17 -2
  37. data/examples/nginx.conf +14 -14
  38. data/examples/unicorn.conf.minimal.rb +2 -2
  39. data/examples/unicorn.conf.rb +14 -6
  40. data/examples/unicorn.socket +11 -0
  41. data/examples/unicorn@.service +40 -0
  42. data/ext/unicorn_http/c_util.h +5 -13
  43. data/ext/unicorn_http/common_field_optimization.h +22 -5
  44. data/ext/unicorn_http/epollexclusive.h +124 -0
  45. data/ext/unicorn_http/ext_help.h +0 -44
  46. data/ext/unicorn_http/extconf.rb +32 -5
  47. data/ext/unicorn_http/global_variables.h +2 -2
  48. data/ext/unicorn_http/httpdate.c +3 -2
  49. data/ext/unicorn_http/unicorn_http.c +926 -638
  50. data/ext/unicorn_http/unicorn_http.rl +159 -170
  51. data/ext/unicorn_http/unicorn_http_common.rl +1 -1
  52. data/lib/unicorn/configurator.rb +110 -46
  53. data/lib/unicorn/const.rb +2 -25
  54. data/lib/unicorn/http_request.rb +110 -31
  55. data/lib/unicorn/http_response.rb +17 -31
  56. data/lib/unicorn/http_server.rb +259 -179
  57. data/lib/unicorn/launcher.rb +1 -1
  58. data/lib/unicorn/oob_gc.rb +6 -6
  59. data/lib/unicorn/select_waiter.rb +6 -0
  60. data/lib/unicorn/socket_helper.rb +58 -78
  61. data/lib/unicorn/stream_input.rb +8 -7
  62. data/lib/unicorn/tee_input.rb +16 -11
  63. data/lib/unicorn/tmpio.rb +10 -6
  64. data/lib/unicorn/util.rb +5 -4
  65. data/lib/unicorn/version.rb +1 -1
  66. data/lib/unicorn/worker.rb +36 -23
  67. data/lib/unicorn.rb +64 -44
  68. data/man/man1/unicorn.1 +124 -112
  69. data/man/man1/unicorn_rails.1 +106 -107
  70. data/t/GNUmakefile +3 -76
  71. data/t/README +4 -4
  72. data/t/t0002-parser-error.sh +3 -3
  73. data/t/t0011-active-unix-socket.sh +1 -1
  74. data/t/t0012-reload-empty-config.sh +2 -1
  75. data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
  76. data/t/t0301.ru +13 -0
  77. data/t/test-lib.sh +4 -3
  78. data/test/benchmark/README +14 -4
  79. data/test/benchmark/ddstream.ru +50 -0
  80. data/test/benchmark/readinput.ru +40 -0
  81. data/test/benchmark/uconnect.perl +66 -0
  82. data/test/exec/test_exec.rb +74 -20
  83. data/test/test_helper.rb +42 -33
  84. data/test/unit/test_ccc.rb +91 -0
  85. data/test/unit/test_droplet.rb +1 -1
  86. data/test/unit/test_http_parser.rb +49 -19
  87. data/test/unit/test_http_parser_ng.rb +98 -115
  88. data/test/unit/test_request.rb +11 -11
  89. data/test/unit/test_response.rb +31 -19
  90. data/test/unit/test_server.rb +89 -15
  91. data/test/unit/test_signals.rb +9 -9
  92. data/test/unit/test_socket_helper.rb +16 -12
  93. data/test/unit/test_tee_input.rb +10 -0
  94. data/test/unit/test_upload.rb +10 -15
  95. data/test/unit/test_util.rb +32 -6
  96. data/test/unit/test_waiter.rb +34 -0
  97. data/unicorn.gemspec +28 -23
  98. data/unicorn_1 +1 -0
  99. data/unicorn_rails_1 +1 -0
  100. metadata +37 -58
  101. data/.wrongdoc.yml +0 -11
  102. data/ChangeLog +0 -5027
  103. data/Documentation/GNUmakefile +0 -30
  104. data/Documentation/unicorn.1.txt +0 -178
  105. data/Documentation/unicorn_rails.1.txt +0 -175
  106. data/examples/git.ru +0 -13
  107. data/lib/unicorn/app/exec_cgi.rb +0 -154
  108. data/lib/unicorn/app/inetd.rb +0 -109
  109. data/lib/unicorn/ssl_client.rb +0 -11
  110. data/lib/unicorn/ssl_configurator.rb +0 -104
  111. data/lib/unicorn/ssl_server.rb +0 -42
  112. data/local.mk.sample +0 -59
  113. data/script/isolate_for_tests +0 -31
  114. data/t/hijack.ru +0 -42
  115. data/t/t0016-trust-x-forwarded-false.sh +0 -30
  116. data/t/t0017-trust-x-forwarded-true.sh +0 -30
  117. data/t/t0200-rack-hijack.sh +0 -27
  118. data/test/unit/test_http_parser_xftrust.rb +0 -38
  119. data/test/unit/test_sni_hostnames.rb +0 -47
data/PHILOSOPHY CHANGED
@@ -137,9 +137,3 @@ unicorn is highly inefficient for Comet/reverse-HTTP/push applications
137
137
  where the HTTP connection spends a large amount of time idle.
138
138
  Nevertheless, the ease of troubleshooting, debugging, and management of
139
139
  unicorn may still outweigh the drawbacks for these applications.
140
-
141
- The {Rainbows!}[http://rainbows.bogomips.org/] aims to fill the gap for
142
- odd corner cases where the nginx + unicorn combination is not enough.
143
- While Rainbows! management/administration is largely identical to
144
- unicorn, Rainbows! is far more ambitious and has seen little real-world
145
- usage.
data/README CHANGED
@@ -1,22 +1,22 @@
1
- = Unicorn: Rack HTTP server for fast clients and Unix
1
+ = unicorn: Rack HTTP server for fast clients and Unix
2
2
 
3
- \Unicorn is an HTTP server for Rack applications designed to only serve
3
+ unicorn is an HTTP server for Rack applications designed to only serve
4
4
  fast clients on low-latency, high-bandwidth connections and take
5
5
  advantage of features in Unix/Unix-like kernels. Slow clients should
6
6
  only be served by placing a reverse proxy capable of fully buffering
7
- both the the request and response in between \Unicorn and slow clients.
7
+ both the the request and response in between unicorn and slow clients.
8
8
 
9
9
  == Features
10
10
 
11
11
  * Designed for Rack, Unix, fast clients, and ease-of-debugging. We
12
12
  cut out everything that is better supported by the operating system,
13
- {nginx}[http://nginx.net/] or {Rack}[http://rack.github.io/].
13
+ {nginx}[https://nginx.org/] or {Rack}[https://rack.github.io/].
14
14
 
15
- * Compatible with Ruby 1.8 and later. Rubinius support is in-progress.
15
+ * Compatible with Ruby 2.0.0 and later.
16
16
 
17
- * Process management: \Unicorn will reap and restart workers that
17
+ * Process management: unicorn will reap and restart workers that
18
18
  die from broken apps. There is no need to manage multiple processes
19
- or ports yourself. \Unicorn can spawn and manage any number of
19
+ or ports yourself. unicorn can spawn and manage any number of
20
20
  worker processes you choose to scale to your backend.
21
21
 
22
22
  * Load balancing is done entirely by the operating system kernel.
@@ -26,25 +26,25 @@ both the the request and response in between \Unicorn and slow clients.
26
26
  all run within their own isolated address space and only serve one
27
27
  client at a time for maximum robustness.
28
28
 
29
- * Supports all Rack applications, along with pre-Rack versions of
30
- Ruby on Rails via a Rack wrapper.
31
-
32
29
  * Builtin reopening of all log files in your application via
33
30
  USR1 signal. This allows logrotate to rotate files atomically and
34
31
  quickly via rename instead of the racy and slow copytruncate method.
35
- \Unicorn also takes steps to ensure multi-line log entries from one
32
+ unicorn also takes steps to ensure multi-line log entries from one
36
33
  request all stay within the same file.
37
34
 
38
35
  * nginx-style binary upgrades without losing connections.
39
- You can upgrade \Unicorn, your entire application, libraries
36
+ You can upgrade unicorn, your entire application, libraries
40
37
  and even your Ruby interpreter without dropping clients.
41
38
 
39
+ * transparent upgrades using systemd socket activation is
40
+ supported since unicorn 5.0
41
+
42
42
  * before_fork and after_fork hooks in case your application
43
43
  has special needs when dealing with forked processes. These
44
44
  should not be needed when the "preload_app" directive is
45
45
  false (the default).
46
46
 
47
- * Can be used with copy-on-write-friendly memory management
47
+ * Can be used with copy-on-write-friendly GC in Ruby 2.0+
48
48
  to save memory (by setting "preload_app" to true).
49
49
 
50
50
  * Able to listen on multiple interfaces including UNIX sockets,
@@ -53,21 +53,19 @@ both the the request and response in between \Unicorn and slow clients.
53
53
 
54
54
  * Simple and easy Ruby DSL for configuration.
55
55
 
56
- * Decodes chunked transfers on-the-fly, thus allowing upload progress
57
- notification to be implemented as well as being able to tunnel
58
- arbitrary stream-based protocols over HTTP.
56
+ * Decodes chunked requests on-the-fly.
59
57
 
60
58
  == License
61
59
 
62
- \Unicorn is copyright 2009 by all contributors (see logs in git).
60
+ unicorn is copyright 2009-2018 by all contributors (see logs in git).
63
61
  It is based on Mongrel 1.1.5.
64
62
  Mongrel is copyright 2007 Zed A. Shaw and contributors.
65
63
 
66
- \Unicorn is licensed under (your choice) of the GPLv2 or later
64
+ unicorn is licensed under (your choice) of the GPLv2 or later
67
65
  (GPLv3+ preferred), or Ruby (1.8)-specific terms.
68
66
  See the included LICENSE file for details.
69
67
 
70
- \Unicorn is 100% Free Software.
68
+ unicorn is 100% Free Software (including all development tools used).
71
69
 
72
70
  == Install
73
71
 
@@ -81,65 +79,73 @@ You may install it via RubyGems on RubyGems.org:
81
79
  You can get the latest source via git from the following locations
82
80
  (these versions may not be stable):
83
81
 
84
- git://bogomips.org/unicorn.git
85
- git://repo.or.cz/unicorn.git (mirror)
82
+ https://yhbt.net/unicorn.git
83
+ https://repo.or.cz/unicorn.git (mirror)
86
84
 
87
- You may browse the code from the web and download the latest snapshot
88
- tarballs here:
85
+ You may browse the code from the web:
89
86
 
90
- * http://bogomips.org/unicorn.git (cgit)
91
- * http://repo.or.cz/w/unicorn.git (gitweb)
87
+ * https://yhbt.net/unicorn.git
88
+ * https://repo.or.cz/w/unicorn.git (gitweb)
92
89
 
93
90
  See the HACKING guide on how to contribute and build prerelease gems
94
91
  from git.
95
92
 
96
93
  == Usage
97
94
 
98
- === non-Rails Rack applications
95
+ === Rack (including Rails 3+) applications
99
96
 
100
97
  In APP_ROOT, run:
101
98
 
102
99
  unicorn
103
100
 
104
- === for Rails applications (should work for all 1.2 or later versions)
105
-
106
- In RAILS_ROOT, run:
107
-
108
- unicorn_rails
109
-
110
- \Unicorn will bind to all interfaces on TCP port 8080 by default.
101
+ unicorn will bind to all interfaces on TCP port 8080 by default.
111
102
  You may use the +--listen/-l+ switch to bind to a different
112
103
  address:port or a UNIX socket.
113
104
 
114
105
  === Configuration File(s)
115
106
 
116
- \Unicorn will look for the config.ru file used by rackup in APP_ROOT.
107
+ unicorn will look for the config.ru file used by rackup in APP_ROOT.
117
108
 
118
- For deployments, it can use a config file for \Unicorn-specific options
109
+ For deployments, it can use a config file for unicorn-specific options
119
110
  specified by the +--config-file/-c+ command-line switch. See
120
- Unicorn::Configurator for the syntax of the \Unicorn-specific options.
111
+ Unicorn::Configurator for the syntax of the unicorn-specific options.
121
112
  The default settings are designed for maximum out-of-the-box
122
113
  compatibility with existing applications.
123
114
 
124
115
  Most command-line options for other Rack applications (above) are also
125
- supported. Run `unicorn -h` or `unicorn_rails -h` to see command-line
126
- options.
116
+ supported. Run `unicorn -h` to see command-line options.
127
117
 
128
118
  == Disclaimer
129
119
 
130
120
  There is NO WARRANTY whatsoever if anything goes wrong, but
131
121
  {let us know}[link:ISSUES.html] and we'll try our best to fix it.
132
122
 
133
- \Unicorn is designed to only serve fast clients either on the local host
123
+ unicorn is designed to only serve fast clients either on the local host
134
124
  or a fast LAN. See the PHILOSOPHY and DESIGN documents for more details
135
125
  regarding this.
136
126
 
127
+ Due to its ability to tolerate crashes and isolate clients, unicorn
128
+ is unfortunately known to prolong the existence of bugs in applications
129
+ and libraries which run on top of it.
130
+
137
131
  == Contact
138
132
 
139
133
  All feedback (bug reports, user/development dicussion, patches, pull
140
134
  requests) go to the mailing list/newsgroup. See the ISSUES document for
141
- information on the {mailing list}[mailto:unicorn-public@bogomips.org].
135
+ information on the {mailing list}[mailto:unicorn-public@yhbt.net].
136
+
137
+ The mailing list is archived at https://yhbt.net/unicorn-public/
138
+
139
+ Read-only NNTP access is available at:
140
+ nntps://news.public-inbox.org/inbox.comp.lang.ruby.unicorn and
141
+ nntp://news.gmane.io/gmane.comp.lang.ruby.unicorn.general
142
+
143
+ Read-only IMAP access is also avaialble at:
144
+ imaps://yhbt.net/inbox.comp.lang.ruby.unicorn.0 and
145
+ imap://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/inbox.comp.lang.ruby.unicorn.0
146
+ The AUTH=ANONYMOUS mechanism is supported, as is any username+password
147
+ combination.
142
148
 
143
- For the latest on \Unicorn releases, you may also finger us at
144
- unicorn@bogomips.org or check our NEWS page (and subscribe to our Atom
149
+ For the latest on unicorn releases, you may also finger us at
150
+ unicorn@yhbt.net or check our NEWS page (and subscribe to our Atom
145
151
  feed).
data/Rakefile CHANGED
@@ -1,47 +1,3 @@
1
- # -*- encoding: binary -*-
2
- autoload :Gem, 'rubygems'
3
- require 'wrongdoc'
4
-
5
- cgit_url = Wrongdoc.config[:cgit_url]
6
- git_url = Wrongdoc.config[:git_url]
7
-
8
- desc "post to FM"
9
- task :fm_update do
10
- require 'tempfile'
11
- require 'net/http'
12
- require 'net/netrc'
13
- require 'json'
14
- version = ENV['VERSION'] or abort "VERSION= needed"
15
- uri = URI.parse('https://freecode.com/projects/unicorn/releases.json')
16
- rc = Net::Netrc.locate('unicorn-fm') or abort "~/.netrc not found"
17
- api_token = rc.password
18
- _, subject, body = `git cat-file tag v#{version}`.split(/\n\n/, 3)
19
- tmp = Tempfile.new('fm-changelog')
20
- tmp.puts subject
21
- tmp.puts
22
- tmp.puts body
23
- tmp.flush
24
- system(ENV["VISUAL"], tmp.path) or abort "#{ENV["VISUAL"]} failed: #$?"
25
- changelog = File.read(tmp.path).strip
26
-
27
- req = {
28
- "auth_code" => api_token,
29
- "release" => {
30
- "tag_list" => "Experimental",
31
- "version" => version,
32
- "changelog" => changelog,
33
- },
34
- }.to_json
35
-
36
- if ! changelog.strip.empty? && version =~ %r{\A[\d\.]+\d+\z}
37
- Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
38
- p http.post(uri.path, req, {'Content-Type'=>'application/json'})
39
- end
40
- else
41
- warn "not updating freshmeat for v#{version}"
42
- end
43
- end
44
-
45
1
  # optional rake-compiler support in case somebody needs to cross compile
46
2
  begin
47
3
  mk = "ext/unicorn_http/Makefile"
data/SIGNALS CHANGED
@@ -3,12 +3,12 @@
3
3
  In general, signals need only be sent to the master process. However,
4
4
  the signals Unicorn uses internally to communicate with the worker
5
5
  processes are documented here as well. With the exception of TTIN/TTOU,
6
- signal handling matches the behavior of {nginx}[http://nginx.net/] so it
6
+ signal handling matches the behavior of {nginx}[http://nginx.org/] so it
7
7
  should be possible to easily share process management scripts between
8
8
  Unicorn and nginx.
9
9
 
10
10
  One example init script is distributed with unicorn:
11
- http://unicorn.bogomips.org/examples/init.sh
11
+ https://yhbt.net/unicorn/examples/init.sh
12
12
 
13
13
  === Master Process
14
14
 
data/Sandbox CHANGED
@@ -1,10 +1,10 @@
1
- = Tips for using \Unicorn with Sandbox installation tools
1
+ = Tips for using unicorn with Sandbox installation tools
2
2
 
3
3
  Since unicorn includes executables and is usually used to start a Ruby
4
4
  process, there are certain caveats to using it with tools that sandbox
5
5
  RubyGems installations such as
6
- {Bundler}[http://gembundler.com/] or
7
- {Isolate}[http://github.com/jbarnette/isolate].
6
+ {Bundler}[https://bundler.io/] or
7
+ {Isolate}[https://github.com/jbarnette/isolate].
8
8
 
9
9
  == General deployment
10
10
 
@@ -34,7 +34,7 @@ is the primary issue with sandboxing tools such as Bundler and Isolate.
34
34
  If you're bundling unicorn, use "bundle exec unicorn" (or "bundle exec
35
35
  unicorn_rails") to start unicorn with the correct environment variables
36
36
 
37
- ref: http://mid.gmane.org/9ECF07C4-5216-47BE-961D-AFC0F0C82060@internetfamo.us
37
+ ref: https://yhbt.net/unicorn-public/9ECF07C4-5216-47BE-961D-AFC0F0C82060@internetfamo.us/
38
38
 
39
39
  Otherwise (if you choose to not sandbox your unicorn installation), we
40
40
  expect the tips for Isolate (below) apply, too.
@@ -43,7 +43,8 @@ expect the tips for Isolate (below) apply, too.
43
43
 
44
44
  This is no longer be an issue as of bundler 0.9.17
45
45
 
46
- ref: http://mid.gmane.org/8FC34B23-5994-41CC-B5AF-7198EF06909E@tramchase.com
46
+ ref:
47
+ https://yhbt.net/unicorn-public/8FC34B23-5994-41CC-B5AF-7198EF06909E@tramchase.com/
47
48
 
48
49
  === BUNDLE_GEMFILE for Capistrano users
49
50
 
@@ -58,14 +59,14 @@ the before_exec hook:
58
59
 
59
60
  If you're using an older Bundler version (0.9.x), you may need to set or
60
61
  reset GEM_HOME, GEM_PATH and PATH environment variables in the
61
- before_exec hook as illustrated by http://gist.github.com/534668
62
+ before_exec hook as illustrated by https://gist.github.com/534668
62
63
 
63
64
  === Ruby 2.0.0 close-on-exec and SIGUSR2 incompatibility
64
65
 
65
66
  Ruby 2.0.0 enforces FD_CLOEXEC on file descriptors by default. unicorn
66
- has been prepared for this behavior since unicorn 4.1.0, but we forgot
67
- to remind the Bundler developers. This issue is being tracked here:
68
- https://github.com/bundler/bundler/issues/2628
67
+ has been prepared for this behavior since unicorn 4.1.0, and bundler
68
+ needs the "--keep-file-descriptors" option for "bundle exec":
69
+ https://bundler.io/man/bundle-exec.1.html
69
70
 
70
71
  == Isolate
71
72
 
@@ -86,7 +87,7 @@ For now workarounds include doing one of the following:
86
87
 
87
88
  3. Explicitly setting RUBYLIB or $LOAD_PATH to include any gem path
88
89
  where the unicorn gem is installed
89
- (e.g. /usr/lib/ruby/gems/1.9.1/gems/unicorn-VERSION/lib)
90
+ (e.g. /usr/lib/ruby/gems/3.0.0/gems/unicorn-VERSION/lib)
90
91
 
91
92
  === RUBYOPT pollution from SIGUSR2 upgrades
92
93
 
data/TODO CHANGED
@@ -1,5 +1,3 @@
1
1
  * Documentation improvements
2
2
 
3
3
  * improve test suite
4
-
5
- * Rack 2.x support (when Rack 2.x exists)
data/TUNING CHANGED
@@ -1,10 +1,10 @@
1
- = Tuning \Unicorn
1
+ = Tuning unicorn
2
2
 
3
- \Unicorn performance is generally as good as a (mostly) Ruby web server
3
+ unicorn performance is generally as good as a (mostly) Ruby web server
4
4
  can provide. Most often the performance bottleneck is in the web
5
5
  application running on Unicorn rather than Unicorn itself.
6
6
 
7
- == \Unicorn Configuration
7
+ == unicorn Configuration
8
8
 
9
9
  See Unicorn::Configurator for details on the config file format.
10
10
  +worker_processes+ is the most-commonly needed tuning parameter.
@@ -14,12 +14,15 @@ See Unicorn::Configurator for details on the config file format.
14
14
  * worker_processes should be scaled to the number of processes your
15
15
  backend system(s) can support. DO NOT scale it to the number of
16
16
  external network clients your application expects to be serving.
17
- \Unicorn is NOT for serving slow clients, that is the job of nginx.
17
+ unicorn is NOT for serving slow clients, that is the job of nginx.
18
18
 
19
19
  * worker_processes should be *at* *least* the number of CPU cores on
20
- a dedicated server. If your application has occasionally slow
21
- responses that are /not/ CPU-intensive, you may increase this to
22
- workaround those inefficiencies.
20
+ a dedicated server (unless you do not have enough memory).
21
+ If your application has occasionally slow responses that are /not/
22
+ CPU-intensive, you may increase this to workaround those inefficiencies.
23
+
24
+ * Under Ruby 2.2 or later, Etc.nprocessors may be used to determine
25
+ the number of CPU cores present.
23
26
 
24
27
  * worker_processes may be increased for Unicorn::OobGC users to provide
25
28
  more consistent response times.
@@ -55,7 +58,7 @@ See Unicorn::Configurator for details on the config file format.
55
58
  * UNIX domain sockets are slightly faster than TCP sockets, but only
56
59
  work if nginx is on the same machine.
57
60
 
58
- == Other \Unicorn settings
61
+ == Other unicorn settings
59
62
 
60
63
  * Setting "preload_app true" can allow copy-on-write-friendly GC to
61
64
  be used to save memory. It will probably not work out of the box with
@@ -69,10 +72,28 @@ See Unicorn::Configurator for details on the config file format.
69
72
  have them unbuffered (File#sync = true) or they are
70
73
  record(line)-buffered in userspace before any writes.
71
74
 
72
- == Kernel Parameters (Linux sysctl)
75
+ == Kernel Parameters (Linux sysctl and sysfs)
73
76
 
74
77
  WARNING: Do not change system parameters unless you know what you're doing!
75
78
 
79
+ * Transparent hugepages (THP) improves performance in many cases,
80
+ but can also increase memory use when relying on a
81
+ copy-on-write(CoW)-friendly GC (Ruby 2.0+) with "preload_app true".
82
+ CoW operates at the page level, so writing to a huge page would
83
+ trigger a 2 MB copy (x86-64), as opposed to a 4 KB copy on a
84
+ regular (non-huge) page.
85
+
86
+ Consider only allowing THP to be used when it is requested via the
87
+ madvise(2) syscall:
88
+
89
+ echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
90
+
91
+ Or disabling it system-wide, via "never".
92
+
93
+ n.b. "page" in this context only applies to the OS kernel,
94
+ Ruby GC implementations also use this term for the same concept
95
+ in a way that is agnostic to the OS.
96
+
76
97
  * net.core.rmem_max and net.core.wmem_max can increase the allowed
77
98
  size of :rcvbuf and :sndbuf respectively. This is mostly only useful
78
99
  for UNIX domain sockets which do not have auto-tuning buffer sizes.
@@ -1,4 +1,4 @@
1
1
  # group_name max expire headers_only
2
2
  gmane.comp.lang.ruby.unicorn.general 1000000000 1000000000 0
3
3
 
4
- # usage: slrnpull -d $PWD -h news.gmane.org --no-post
4
+ # usage: slrnpull -d $PWD -h news.gmane.io --no-post
data/bin/unicorn CHANGED
@@ -6,6 +6,7 @@ require 'optparse'
6
6
  ENV["RACK_ENV"] ||= "development"
7
7
  rackup_opts = Unicorn::Configurator::RACKUP
8
8
  options = rackup_opts[:options]
9
+ set_no_default_middleware = true
9
10
 
10
11
  op = OptionParser.new("", 24, ' ') do |opts|
11
12
  cmd = File.basename($0)
@@ -29,7 +30,7 @@ op = OptionParser.new("", 24, ' ') do |opts|
29
30
 
30
31
  opts.on("-I", "--include PATH",
31
32
  "specify $LOAD_PATH (may be used more than once)") do |path|
32
- $LOAD_PATH.unshift(*path.split(/:/))
33
+ $LOAD_PATH.unshift(*path.split(':'))
33
34
  end
34
35
 
35
36
  opts.on("-r", "--require LIBRARY",
@@ -60,7 +61,7 @@ op = OptionParser.new("", 24, ' ') do |opts|
60
61
 
61
62
  opts.on("-N", "--no-default-middleware",
62
63
  "do not load middleware implied by RACK_ENV") do |e|
63
- rackup_opts[:no_default_middleware] = true
64
+ rackup_opts[:no_default_middleware] = true if set_no_default_middleware
64
65
  end
65
66
 
66
67
  opts.on("-D", "--daemonize", "run daemonized in the background") do |d|
@@ -110,6 +111,7 @@ op = OptionParser.new("", 24, ' ') do |opts|
110
111
  opts.parse! ARGV
111
112
  end
112
113
 
114
+ set_no_default_middleware = false
113
115
  app = Unicorn.builder(ARGV[0] || 'config.ru', op)
114
116
  op = nil
115
117
 
data/bin/unicorn_rails CHANGED
@@ -30,7 +30,7 @@ op = OptionParser.new("", 24, ' ') do |opts|
30
30
 
31
31
  opts.on("-I", "--include PATH",
32
32
  "specify $LOAD_PATH (may be used more than once)") do |path|
33
- $LOAD_PATH.unshift(*path.split(/:/))
33
+ $LOAD_PATH.unshift(*path.split(':'))
34
34
  end
35
35
 
36
36
  opts.on("-r", "--require LIBRARY",
@@ -132,11 +132,11 @@ def rails_builder(ru, op, daemonize)
132
132
 
133
133
  # this lambda won't run until after forking if preload_app is false
134
134
  # this runs after config file reloading
135
- lambda do ||
135
+ lambda do |x, server|
136
136
  # Rails 3 includes a config.ru, use it if we find it after
137
137
  # working_directory is bound.
138
138
  ::File.exist?('config.ru') and
139
- return Unicorn.builder('config.ru', op).call
139
+ return Unicorn.builder('config.ru', op).call(x, server)
140
140
 
141
141
  # Load Rails and (possibly) the private version of Rack it bundles.
142
142
  begin
@@ -1,2 +1,2 @@
1
- # see {Unicorn::OobGC}[http://unicorn.bogomips.org/Unicorn/OobGC.html]
1
+ # see {Unicorn::OobGC}[https://yhbt.net/unicorn/Unicorn/OobGC.html]
2
2
  # Unicorn::OobGC was broken in Unicorn v3.3.1 - v3.6.1 and fixed in v3.6.2
data/examples/init.sh CHANGED
@@ -1,7 +1,16 @@
1
1
  #!/bin/sh
2
2
  set -e
3
+ ### BEGIN INIT INFO
4
+ # Provides: unicorn
5
+ # Required-Start: $local_fs $network
6
+ # Required-Stop: $local_fs $network
7
+ # Default-Start: 2 3 4 5
8
+ # Default-Stop: 0 1 6
9
+ # Short-Description: Start/stop unicorn Rack app server
10
+ ### END INIT INFO
11
+
3
12
  # Example init script, this can be used with nginx, too,
4
- # since nginx and unicorn accept the same signals
13
+ # since nginx and unicorn accept the same signals.
5
14
 
6
15
  # Feel free to change any of the following variables for your app:
7
16
  TIMEOUT=${TIMEOUT-60}
@@ -9,21 +18,22 @@ APP_ROOT=/home/x/my_app/current
9
18
  PID=$APP_ROOT/tmp/pids/unicorn.pid
10
19
  CMD="/usr/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
11
20
  INIT_CONF=$APP_ROOT/config/init.conf
21
+ UPGRADE_DELAY=${UPGRADE_DELAY-2}
12
22
  action="$1"
13
23
  set -u
14
24
 
15
25
  test -f "$INIT_CONF" && . $INIT_CONF
16
26
 
17
- old_pid="$PID.oldbin"
27
+ OLD="$PID.oldbin"
18
28
 
19
29
  cd $APP_ROOT || exit 1
20
30
 
21
31
  sig () {
22
- test -s "$PID" && kill -$1 `cat $PID`
32
+ test -s "$PID" && kill -$1 $(cat $PID)
23
33
  }
24
34
 
25
35
  oldsig () {
26
- test -s $old_pid && kill -$1 `cat $old_pid`
36
+ test -s "$OLD" && kill -$1 $(cat $OLD)
27
37
  }
28
38
 
29
39
  case $action in
@@ -45,18 +55,36 @@ restart|reload)
45
55
  $CMD
46
56
  ;;
47
57
  upgrade)
48
- if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
58
+ if oldsig 0
59
+ then
60
+ echo >&2 "Old upgraded process still running with $OLD"
61
+ exit 1
62
+ fi
63
+
64
+ cur_pid=
65
+ if test -s "$PID"
66
+ then
67
+ cur_pid=$(cat $PID)
68
+ fi
69
+
70
+ if test -n "$cur_pid" &&
71
+ kill -USR2 "$cur_pid" &&
72
+ sleep $UPGRADE_DELAY &&
73
+ new_pid=$(cat $PID) &&
74
+ test x"$new_pid" != x"$cur_pid" &&
75
+ kill -0 "$new_pid" &&
76
+ kill -QUIT "$cur_pid"
49
77
  then
50
78
  n=$TIMEOUT
51
- while test -s $old_pid && test $n -ge 0
79
+ while kill -0 "$cur_pid" 2>/dev/null && test $n -ge 0
52
80
  do
53
81
  printf '.' && sleep 1 && n=$(( $n - 1 ))
54
82
  done
55
83
  echo
56
84
 
57
- if test $n -lt 0 && test -s $old_pid
85
+ if test $n -lt 0 && kill -0 "$cur_pid" 2>/dev/null
58
86
  then
59
- echo >&2 "$old_pid still exists after $TIMEOUT seconds"
87
+ echo >&2 "$cur_pid still running after $TIMEOUT seconds"
60
88
  exit 1
61
89
  fi
62
90
  exit 0
@@ -2,7 +2,10 @@
2
2
  # /etc/logrotate.d/unicorn_app on my Debian systems
3
3
  #
4
4
  # See the logrotate(8) manpage for more information:
5
- # http://linux.die.net/man/8/logrotate
5
+ # https://linux.die.net/man/8/logrotate
6
+ #
7
+ # public logrotate-related discussion in our archives:
8
+ # https://yhbt.net/unicorn-public/?q=logrotate
6
9
 
7
10
  # Modify the following glob to match the logfiles your app writes to:
8
11
  /var/log/unicorn_app/*.log {
@@ -22,7 +25,19 @@
22
25
  # config. Unicorn supports the USR1 signal and we send it
23
26
  # as our "lastaction" action:
24
27
  lastaction
25
- # assuming your pid file is in /var/run/unicorn_app/pid
28
+ # For systemd users, assuming you use two services
29
+ # (as recommended) to allow zero-downtime upgrades.
30
+ # Only one service needs to be started, but signaling
31
+ # both here is harmless as long as they're both enabled
32
+ systemctl kill -s SIGUSR1 unicorn@1.service
33
+ systemctl kill -s SIGUSR1 unicorn@2.service
34
+
35
+ # Examples for other process management systems appreciated
36
+ # Mail us at unicorn-public@yhbt.net
37
+ # (see above for archives)
38
+
39
+ # If you use a pid file and assuming your pid file
40
+ # is in /var/run/unicorn_app/pid
26
41
  pid=/var/run/unicorn_app/pid
27
42
  test -s $pid && kill -USR1 "$(cat $pid)"
28
43
  endscript
data/examples/nginx.conf CHANGED
@@ -1,5 +1,5 @@
1
1
  # This is example contains the bare mininum to get nginx going with
2
- # Unicorn or Rainbows! servers. Generally these configuration settings
2
+ # unicorn servers. Generally these configuration settings
3
3
  # are applicable to other HTTP application servers (and not just Ruby
4
4
  # ones), so if you have one working well for proxying another app
5
5
  # server, feel free to continue using it.
@@ -44,8 +44,8 @@ http {
44
44
  # click tracking!
45
45
  access_log /path/to/nginx.access.log combined;
46
46
 
47
- # you generally want to serve static files with nginx since neither
48
- # Unicorn nor Rainbows! is optimized for it at the moment
47
+ # you generally want to serve static files with nginx since
48
+ # unicorn is not and will never be optimized for it
49
49
  sendfile on;
50
50
 
51
51
  tcp_nopush on; # off may be better for *some* Comet/long-poll stuff
@@ -56,7 +56,8 @@ http {
56
56
  # to configure it all in one place here for static files and also
57
57
  # to disable gzip for clients who don't get gzip/deflate right.
58
58
  # There are other gzip settings that may be needed used to deal with
59
- # bad clients out there, see http://wiki.nginx.org/NginxHttpGzipModule
59
+ # bad clients out there, see
60
+ # https://nginx.org/en/docs/http/ngx_http_gzip_module.html
60
61
  gzip on;
61
62
  gzip_http_version 1.0;
62
63
  gzip_proxied any;
@@ -67,10 +68,10 @@ http {
67
68
  text/javascript application/x-javascript
68
69
  application/atom+xml;
69
70
 
70
- # this can be any application server, not just Unicorn/Rainbows!
71
+ # this can be any application server, not just unicorn
71
72
  upstream app_server {
72
73
  # fail_timeout=0 means we always retry an upstream even if it failed
73
- # to return a good HTTP response (in case the Unicorn master nukes a
74
+ # to return a good HTTP response (in case the unicorn master nukes a
74
75
  # single worker for timing out).
75
76
 
76
77
  # for UNIX domain socket setups:
@@ -112,12 +113,12 @@ http {
112
113
  # try_files directive appeared in in nginx 0.7.27 and has stabilized
113
114
  # over time. Older versions of nginx (e.g. 0.6.x) requires
114
115
  # "if (!-f $request_filename)" which was less efficient:
115
- # http://bogomips.org/unicorn.git/tree/examples/nginx.conf?id=v3.3.1#n127
116
+ # https://yhbt.net/unicorn.git/tree/examples/nginx.conf?id=v3.3.1#n127
116
117
  try_files $uri/index.html $uri.html $uri @app;
117
118
 
118
119
  location @app {
119
120
  # an HTTP header important enough to have its own Wikipedia entry:
120
- # http://en.wikipedia.org/wiki/X-Forwarded-For
121
+ # https://en.wikipedia.org/wiki/X-Forwarded-For
121
122
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
122
123
 
123
124
  # enable this if you forward HTTPS traffic to unicorn,
@@ -132,12 +133,11 @@ http {
132
133
  # redirects, we set the Host: header above already.
133
134
  proxy_redirect off;
134
135
 
135
- # set "proxy_buffering off" *only* for Rainbows! when doing
136
- # Comet/long-poll/streaming. It's also safe to set if you're using
137
- # only serving fast clients with Unicorn + nginx, but not slow
138
- # clients. You normally want nginx to buffer responses to slow
139
- # clients, even with Rails 3.1 streaming because otherwise a slow
140
- # client can become a bottleneck of Unicorn.
136
+ # It's also safe to set if you're using only serving fast clients
137
+ # with unicorn + nginx, but not slow clients. You normally want
138
+ # nginx to buffer responses to slow clients, even with Rails 3.1
139
+ # streaming because otherwise a slow client can become a bottleneck
140
+ # of unicorn.
141
141
  #
142
142
  # The Rack application may also set "X-Accel-Buffering (yes|no)"
143
143
  # in the response headers do disable/enable buffering on a