unicorn 5.3.1 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +5 -5
  2. data/.manifest +10 -5
  3. data/.olddoc.yml +15 -7
  4. data/Application_Timeouts +4 -4
  5. data/CONTRIBUTORS +6 -2
  6. data/Documentation/.gitignore +1 -3
  7. data/Documentation/unicorn.1 +222 -0
  8. data/Documentation/unicorn_rails.1 +207 -0
  9. data/FAQ +1 -1
  10. data/GIT-VERSION-FILE +1 -1
  11. data/GIT-VERSION-GEN +1 -1
  12. data/GNUmakefile +117 -57
  13. data/HACKING +2 -9
  14. data/ISSUES +33 -32
  15. data/KNOWN_ISSUES +2 -2
  16. data/LATEST +16 -95
  17. data/LICENSE +2 -2
  18. data/Links +13 -11
  19. data/NEWS +239 -0
  20. data/README +27 -14
  21. data/SIGNALS +1 -1
  22. data/Sandbox +5 -5
  23. data/archive/slrnpull.conf +1 -1
  24. data/bin/unicorn +3 -1
  25. data/bin/unicorn_rails +2 -2
  26. data/examples/big_app_gc.rb +1 -1
  27. data/examples/logrotate.conf +3 -3
  28. data/examples/nginx.conf +4 -3
  29. data/examples/unicorn.conf.minimal.rb +2 -2
  30. data/examples/unicorn.conf.rb +2 -2
  31. data/examples/unicorn@.service +7 -0
  32. data/ext/unicorn_http/c_util.h +5 -13
  33. data/ext/unicorn_http/common_field_optimization.h +23 -6
  34. data/ext/unicorn_http/epollexclusive.h +124 -0
  35. data/ext/unicorn_http/ext_help.h +0 -24
  36. data/ext/unicorn_http/extconf.rb +32 -6
  37. data/ext/unicorn_http/global_variables.h +3 -3
  38. data/ext/unicorn_http/httpdate.c +3 -2
  39. data/ext/unicorn_http/unicorn_http.c +277 -237
  40. data/ext/unicorn_http/unicorn_http.rl +67 -27
  41. data/lib/unicorn/configurator.rb +26 -5
  42. data/lib/unicorn/http_request.rb +13 -3
  43. data/lib/unicorn/http_response.rb +3 -2
  44. data/lib/unicorn/http_server.rb +76 -51
  45. data/lib/unicorn/launcher.rb +1 -1
  46. data/lib/unicorn/oob_gc.rb +5 -5
  47. data/lib/unicorn/select_waiter.rb +6 -0
  48. data/lib/unicorn/socket_helper.rb +4 -3
  49. data/lib/unicorn/tmpio.rb +8 -2
  50. data/lib/unicorn/util.rb +3 -3
  51. data/lib/unicorn/version.rb +1 -1
  52. data/lib/unicorn/worker.rb +16 -2
  53. data/lib/unicorn.rb +25 -10
  54. data/man/man1/unicorn.1 +88 -85
  55. data/man/man1/unicorn_rails.1 +79 -81
  56. data/t/GNUmakefile +3 -72
  57. data/t/README +4 -4
  58. data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
  59. data/t/t0301.ru +13 -0
  60. data/t/test-lib.sh +2 -1
  61. data/test/benchmark/README +14 -4
  62. data/test/benchmark/ddstream.ru +50 -0
  63. data/test/benchmark/readinput.ru +40 -0
  64. data/test/benchmark/uconnect.perl +66 -0
  65. data/test/exec/test_exec.rb +20 -19
  66. data/test/test_helper.rb +38 -30
  67. data/test/unit/test_ccc.rb +5 -4
  68. data/test/unit/test_droplet.rb +1 -1
  69. data/test/unit/test_http_parser.rb +16 -0
  70. data/test/unit/test_http_parser_ng.rb +81 -0
  71. data/test/unit/test_request.rb +10 -10
  72. data/test/unit/test_server.rb +86 -12
  73. data/test/unit/test_signals.rb +8 -8
  74. data/test/unit/test_socket_helper.rb +5 -5
  75. data/test/unit/test_upload.rb +9 -14
  76. data/test/unit/test_util.rb +29 -3
  77. data/test/unit/test_waiter.rb +34 -0
  78. data/unicorn.gemspec +8 -7
  79. metadata +19 -13
  80. data/Documentation/GNUmakefile +0 -30
  81. data/Documentation/unicorn.1.txt +0 -187
  82. data/Documentation/unicorn_rails.1.txt +0 -175
  83. data/t/hijack.ru +0 -43
  84. data/t/t0200-rack-hijack.sh +0 -30
data/lib/unicorn/tmpio.rb CHANGED
@@ -11,12 +11,18 @@ class Unicorn::TmpIO < File
11
11
  # immediately, switched to binary mode, and userspace output
12
12
  # buffering is disabled
13
13
  def self.new
14
+ path = nil
15
+
16
+ # workaround File#path being tainted:
17
+ # https://bugs.ruby-lang.org/issues/14485
14
18
  fp = begin
15
- super("#{Dir::tmpdir}/#{rand}", RDWR|CREAT|EXCL, 0600)
19
+ path = "#{Dir::tmpdir}/#{rand}"
20
+ super(path, RDWR|CREAT|EXCL, 0600)
16
21
  rescue Errno::EEXIST
17
22
  retry
18
23
  end
19
- unlink(fp.path)
24
+
25
+ unlink(path)
20
26
  fp.binmode
21
27
  fp.sync = true
22
28
  fp
data/lib/unicorn/util.rb CHANGED
@@ -11,8 +11,8 @@ module Unicorn::Util # :nodoc:
11
11
  fp.stat.file? &&
12
12
  fp.sync &&
13
13
  (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
14
- rescue IOError, Errno::EBADF
15
- false
14
+ rescue IOError, Errno::EBADF
15
+ false
16
16
  end
17
17
 
18
18
  def self.chown_logs(uid, gid)
@@ -64,7 +64,7 @@ module Unicorn::Util # :nodoc:
64
64
  fp.reopen(fp.path, "a")
65
65
  else
66
66
  # We should not need this workaround, Ruby can be fixed:
67
- # http://bugs.ruby-lang.org/issues/9036
67
+ # https://bugs.ruby-lang.org/issues/9036
68
68
  # MRI will not call call fclose(3) or freopen(3) here
69
69
  # since there's no associated std{in,out,err} FILE * pointer
70
70
  # This should atomically use dup3(2) (or dup2(2)) syscall
@@ -1 +1 @@
1
- Unicorn::Const::UNICORN_VERSION = '5.3.1'
1
+ Unicorn::Const::UNICORN_VERSION = '6.1.0'
@@ -122,6 +122,11 @@ class Unicorn::Worker
122
122
  # the +after_fork+ hook after any privileged functions need to be
123
123
  # run (e.g. to set per-worker CPU affinity, niceness, etc)
124
124
  #
125
+ # +group+ can be specified as a string, or as an array of two
126
+ # strings. If an array of two strings is given, the first string
127
+ # is used as the primary group of the process, and the second is
128
+ # used as the group of the log files.
129
+ #
125
130
  # Any and all errors raised within this method will be propagated
126
131
  # directly back to the caller (usually the +after_fork+ hook.
127
132
  # These errors commonly include ArgumentError for specifying an
@@ -134,8 +139,17 @@ class Unicorn::Worker
134
139
  # insufficient because modern systems have fine-grained
135
140
  # capabilities. Let the caller handle any and all errors.
136
141
  uid = Etc.getpwnam(user).uid
137
- gid = Etc.getgrnam(group).gid if group
138
- Unicorn::Util.chown_logs(uid, gid)
142
+
143
+ if group
144
+ if group.is_a?(Array)
145
+ group, log_group = group
146
+ log_gid = Etc.getgrnam(log_group).gid
147
+ end
148
+ gid = Etc.getgrnam(group).gid
149
+ log_gid ||= gid
150
+ end
151
+
152
+ Unicorn::Util.chown_logs(uid, log_gid)
139
153
  if gid && Process.egid != gid
140
154
  Process.initgroups(user, gid)
141
155
  Process::GID.change_privilege(gid)
data/lib/unicorn.rb CHANGED
@@ -2,6 +2,8 @@
2
2
  require 'etc'
3
3
  require 'stringio'
4
4
  require 'kgio'
5
+ require 'raindrops'
6
+ require 'io/wait'
5
7
 
6
8
  begin
7
9
  require 'rack'
@@ -43,12 +45,8 @@ module Unicorn
43
45
  abort "rack and Rack::Builder must be available for processing #{ru}"
44
46
  end
45
47
 
46
- # Op is going to get cleared before the returned lambda is called, so
47
- # save this value so that it's still there when we need it:
48
- no_default_middleware = op[:no_default_middleware]
49
-
50
48
  # always called after config file parsing, may be called after forking
51
- lambda do ||
49
+ lambda do |_, server|
52
50
  inner_app = case ru
53
51
  when /\.ru$/
54
52
  raw = File.read(ru)
@@ -59,9 +57,12 @@ module Unicorn
59
57
  Object.const_get(File.basename(ru, '.rb').capitalize)
60
58
  end
61
59
 
62
- pp({ :inner_app => inner_app }) if $DEBUG
60
+ if $DEBUG
61
+ require 'pp'
62
+ pp({ :inner_app => inner_app })
63
+ end
63
64
 
64
- return inner_app if no_default_middleware
65
+ return inner_app unless server.default_middleware
65
66
 
66
67
  middleware = { # order matters
67
68
  ContentLength: nil,
@@ -95,7 +96,7 @@ module Unicorn
95
96
 
96
97
  # returns an array of strings representing TCP listen socket addresses
97
98
  # and Unix domain socket paths. This is useful for use with
98
- # Raindrops::Middleware under Linux: https://bogomips.org/raindrops/
99
+ # Raindrops::Middleware under Linux: https://yhbt.net/raindrops/
99
100
  def self.listener_names
100
101
  Unicorn::HttpServer::LISTENERS.map do |io|
101
102
  Unicorn::SocketHelper.sock_name(io)
@@ -109,9 +110,23 @@ module Unicorn
109
110
  exc.backtrace.each { |line| logger.error(line) }
110
111
  end
111
112
 
112
- # remove this when we only support Ruby >= 2.0
113
+ F_SETPIPE_SZ = 1031 if RUBY_PLATFORM =~ /linux/
114
+
113
115
  def self.pipe # :nodoc:
114
- Kgio::Pipe.new.each { |io| io.close_on_exec = true }
116
+ Kgio::Pipe.new.each do |io|
117
+ # shrink pipes to minimize impact on /proc/sys/fs/pipe-user-pages-soft
118
+ # limits.
119
+ if defined?(F_SETPIPE_SZ)
120
+ begin
121
+ io.fcntl(F_SETPIPE_SZ, Raindrops::PAGE_SIZE)
122
+ rescue Errno::EINVAL
123
+ # old kernel
124
+ rescue Errno::EPERM
125
+ # resizes fail if Linux is close to the pipe limit for the user
126
+ # or if the user does not have permissions to resize
127
+ end
128
+ end
129
+ end
115
130
  end
116
131
  # :startdoc:
117
132
  end
data/man/man1/unicorn.1 CHANGED
@@ -1,4 +1,5 @@
1
1
  .TH "UNICORN" "1" "September 15, 2009" "Unicorn User Manual" ""
2
+ .hy
2
3
  .SH NAME
3
4
  .PP
4
5
  unicorn \- a rackup\-like command to launch the Unicorn HTTP server
@@ -8,74 +9,73 @@ unicorn [\-c CONFIG_FILE] [\-E RACK_ENV] [\-D] [RACKUP_FILE]
8
9
  .SH DESCRIPTION
9
10
  .PP
10
11
  A rackup(1)\-like command to launch Rack applications using Unicorn.
11
- It is expected to be started in your application root (APP_ROOT), but
12
- the "working_directory" directive may be used in the CONFIG_FILE.
12
+ It is expected to be started in your application root (APP_ROOT),
13
+ but the "working_directory" directive may be used in the CONFIG_FILE.
13
14
  .PP
14
- While unicorn takes a myriad of command\-line options for compatibility
15
- with ruby(1) and rackup(1), it is recommended to stick to the few
16
- command\-line options specified in the SYNOPSIS and use the CONFIG_FILE
17
- as much as possible.
15
+ While unicorn takes a myriad of command\-line options for
16
+ compatibility with ruby(1) and rackup(1), it is recommended to stick
17
+ to the few command\-line options specified in the SYNOPSIS and use
18
+ the CONFIG_FILE as much as possible.
18
19
  .SH RACKUP FILE
19
20
  .PP
20
- This defaults to "config.ru" in APP_ROOT.
21
- It should be the same file used by rackup(1) and other Rack launchers,
22
- it uses the \f[I]Rack::Builder\f[] DSL.
21
+ This defaults to "config.ru" in APP_ROOT. It should be the same
22
+ file used by rackup(1) and other Rack launchers, it uses the
23
+ \f[I]Rack::Builder\f[] DSL.
23
24
  .PP
24
- Embedded command\-line options are mostly parsed for compatibility with
25
- rackup(1) but strongly discouraged.
25
+ Embedded command\-line options are mostly parsed for compatibility
26
+ with rackup(1) but strongly discouraged.
26
27
  .SH UNICORN OPTIONS
27
28
  .TP
28
29
  .B \-c, \-\-config\-file CONFIG_FILE
29
- Path to the Unicorn\-specific config file.
30
- The config file is implemented as a Ruby DSL, so Ruby code may executed.
31
- See the RDoc/ri for the \f[I]Unicorn::Configurator\f[] class for the
32
- full list of directives available from the DSL.
33
- Using an absolute path for for CONFIG_FILE is recommended as it makes
34
- multiple instances of Unicorn easily distinguishable when viewing ps(1)
35
- output.
30
+ Path to the Unicorn\-specific config file. The config file is
31
+ implemented as a Ruby DSL, so Ruby code may executed.
32
+ See the RDoc/ri for the \f[I]Unicorn::Configurator\f[] class for the full
33
+ list of directives available from the DSL.
34
+ Using an absolute path for for CONFIG_FILE is recommended as it
35
+ makes multiple instances of Unicorn easily distinguishable when
36
+ viewing ps(1) output.
36
37
  .RS
37
38
  .RE
38
39
  .TP
39
40
  .B \-D, \-\-daemonize
40
- Run daemonized in the background.
41
- The process is detached from the controlling terminal and stdin is
42
- redirected to "/dev/null".
43
- Unlike many common UNIX daemons, we do not chdir to "/" upon
44
- daemonization to allow more control over the startup/upgrade process.
45
- Unless specified in the CONFIG_FILE, stderr and stdout will also be
46
- redirected to "/dev/null".
41
+ Run daemonized in the background. The process is detached from
42
+ the controlling terminal and stdin is redirected to "/dev/null".
43
+ Unlike many common UNIX daemons, we do not chdir to "/"
44
+ upon daemonization to allow more control over the startup/upgrade
45
+ process.
46
+ Unless specified in the CONFIG_FILE, stderr and stdout will
47
+ also be redirected to "/dev/null".
47
48
  .RS
48
49
  .RE
49
50
  .TP
50
51
  .B \-E, \-\-env RACK_ENV
51
- Run under the given RACK_ENV.
52
- See the RACK ENVIRONMENT section for more details.
52
+ Run under the given RACK_ENV. See the RACK ENVIRONMENT section
53
+ for more details.
53
54
  .RS
54
55
  .RE
55
56
  .TP
56
57
  .B \-l, \-\-listen ADDRESS
57
- Listens on a given ADDRESS.
58
- ADDRESS may be in the form of HOST:PORT or PATH, HOST:PORT is taken to
59
- mean a TCP socket and PATH is meant to be a path to a UNIX domain
60
- socket.
61
- Defaults to "0.0.0.0:8080" (all addresses on TCP port 8080) For
62
- production deployments, specifying the "listen" directive in CONFIG_FILE
63
- is recommended as it allows fine\-tuning of socket options.
58
+ Listens on a given ADDRESS. ADDRESS may be in the form of
59
+ HOST:PORT or PATH, HOST:PORT is taken to mean a TCP socket
60
+ and PATH is meant to be a path to a UNIX domain socket.
61
+ Defaults to "0.0.0.0:8080" (all addresses on TCP port 8080)
62
+ For production deployments, specifying the "listen" directive in
63
+ CONFIG_FILE is recommended as it allows fine\-tuning of socket
64
+ options.
64
65
  .RS
65
66
  .RE
66
67
  .TP
67
68
  .B \-N, \-\-no\-default\-middleware
68
- Disables loading middleware implied by RACK_ENV.
69
- This bypasses the configuration documented in the RACK ENVIRONMENT
70
- section, but still allows RACK_ENV to be used for
71
- application/framework\-specific purposes.
69
+ Disables loading middleware implied by RACK_ENV. This bypasses the
70
+ configuration documented in the RACK ENVIRONMENT section, but still
71
+ allows RACK_ENV to be used for application/framework\-specific purposes.
72
72
  .RS
73
73
  .RE
74
74
  .SH RACKUP COMPATIBILITY OPTIONS
75
75
  .TP
76
76
  .B \-o, \-\-host HOST
77
- Listen on a TCP socket belonging to HOST, default is "0.0.0.0" (all
78
- addresses).
77
+ Listen on a TCP socket belonging to HOST, default is
78
+ "0.0.0.0" (all addresses).
79
79
  If specified multiple times on the command\-line, only the
80
80
  last\-specified value takes effect.
81
81
  This option only exists for compatibility with the rackup(1) command,
@@ -85,8 +85,8 @@ use of "\-l"/"\-\-listen" switch is recommended instead.
85
85
  .TP
86
86
  .B \-p, \-\-port PORT
87
87
  Listen on the specified TCP PORT, default is 8080.
88
- If specified multiple times on the command\-line, only the
89
- last\-specified value takes effect.
88
+ If specified multiple times on the command\-line, only the last\-specified
89
+ value takes effect.
90
90
  This option only exists for compatibility with the rackup(1) command,
91
91
  use of "\-l"/"\-\-listen" switch is recommended instead.
92
92
  .RS
@@ -99,9 +99,8 @@ No\-op, this exists only for compatibility with rackup(1).
99
99
  .SH RUBY OPTIONS
100
100
  .TP
101
101
  .B \-e, \-\-eval LINE
102
- Evaluate a LINE of Ruby code.
103
- This evaluation happens immediately as the command\-line is being
104
- parsed.
102
+ Evaluate a LINE of Ruby code. This evaluation happens
103
+ immediately as the command\-line is being parsed.
105
104
  .RS
106
105
  .RE
107
106
  .TP
@@ -116,18 +115,17 @@ Turn on verbose warnings, the $VERBOSE variable is set to true.
116
115
  .RE
117
116
  .TP
118
117
  .B \-I, \-\-include PATH
119
- specify
120
- \f[I]L\f[]\f[I]O\f[]\f[I]A\f[]\f[I]D\f[]~\f[I]P\f[]~\f[I]A\f[]\f[I]T\f[]\f[I]H\f[].\f[I]P\f[]\f[I]A\f[]\f[I]T\f[]\f[I]H\f[]\f[I]w\f[]\f[I]i\f[]\f[I]l\f[]\f[I]l\f[]\f[I]b\f[]\f[I]e\f[]\f[I]p\f[]\f[I]r\f[]\f[I]e\f[]\f[I]p\f[]\f[I]e\f[]\f[I]n\f[]\f[I]d\f[]\f[I]e\f[]\f[I]d\f[]\f[I]t\f[]\f[I]o\f[]LOAD_PATH.
118
+ specify $LOAD_PATH. PATH will be prepended to $LOAD_PATH.
121
119
  The \[aq]:\[aq] character may be used to delimit multiple directories.
122
- This directive may be used more than once.
123
- Modifications to $LOAD_PATH take place immediately and in the order they
124
- were specified on the command\-line.
120
+ This directive may be used more than once. Modifications to
121
+ $LOAD_PATH take place immediately and in the order they were
122
+ specified on the command\-line.
125
123
  .RS
126
124
  .RE
127
125
  .TP
128
126
  .B \-r, \-\-require LIBRARY
129
- require a specified LIBRARY before executing the application.
130
- The "require" statement will be executed immediately and in the order
127
+ require a specified LIBRARY before executing the application. The
128
+ "require" statement will be executed immediately and in the order
131
129
  they were specified on the command\-line.
132
130
  .RS
133
131
  .RE
@@ -139,15 +137,15 @@ HUP \- reload config file, app, and gracefully restart all workers
139
137
  .IP \[bu] 2
140
138
  INT/TERM \- quick shutdown, kills all workers immediately
141
139
  .IP \[bu] 2
142
- QUIT \- graceful shutdown, waits for workers to finish their current
143
- request before finishing.
140
+ QUIT \- graceful shutdown, waits for workers to finish their
141
+ current request before finishing.
144
142
  .IP \[bu] 2
145
- USR1 \- reopen all logs owned by the master and all workers See
146
- Unicorn::Util.reopen_logs for what is considered a log.
143
+ USR1 \- reopen all logs owned by the master and all workers
144
+ See Unicorn::Util.reopen_logs for what is considered a log.
147
145
  .IP \[bu] 2
148
- USR2 \- reexecute the running binary.
149
- A separate QUIT should be sent to the original process once the child is
150
- verified to be up and running.
146
+ USR2 \- reexecute the running binary. A separate QUIT
147
+ should be sent to the original process once the child is verified to
148
+ be up and running.
151
149
  .IP \[bu] 2
152
150
  WINCH \- gracefully stops workers but keep the master running.
153
151
  This will only work for daemonized processes.
@@ -156,7 +154,7 @@ TTIN \- increment the number of worker processes by one
156
154
  .IP \[bu] 2
157
155
  TTOU \- decrement the number of worker processes by one
158
156
  .PP
159
- See the SIGNALS (https://bogomips.org/unicorn/SIGNALS.html) document for
157
+ See the SIGNALS (https://yhbt.net/unicorn/SIGNALS.html) document for
160
158
  full description of all signals used by Unicorn.
161
159
  .SH RACK ENVIRONMENT
162
160
  .PP
@@ -164,56 +162,61 @@ Accepted values of RACK_ENV and the middleware they automatically load
164
162
  (outside of RACKUP_FILE) are exactly as those in rackup(1):
165
163
  .IP \[bu] 2
166
164
  development \- loads Rack::CommonLogger, Rack::ShowExceptions, and
167
- Rack::Lint middleware
165
+ Rack::Lint middleware
168
166
  .IP \[bu] 2
169
167
  deployment \- loads Rack::CommonLogger middleware
170
168
  .IP \[bu] 2
171
169
  none \- loads no middleware at all, relying entirely on RACKUP_FILE
172
170
  .PP
173
- All unrecognized values for RACK_ENV are assumed to be "none".
174
- Production deployments are strongly encouraged to use "deployment" or
175
- "none" for maximum performance.
171
+ All unrecognized values for RACK_ENV are assumed to be
172
+ "none". Production deployments are strongly encouraged to use
173
+ "deployment" or "none" for maximum performance.
176
174
  .PP
177
- As of Unicorn 0.94.0, RACK_ENV is exported as a process\-wide
178
- environment variable as well.
179
- While not current a part of the Rack specification as of Rack 1.0.1,
180
- this has become a de facto standard in the Rack world.
175
+ As of Unicorn 0.94.0, RACK_ENV is exported as a process\-wide environment
176
+ variable as well. While not current a part of the Rack specification as
177
+ of Rack 1.0.1, this has become a de facto standard in the Rack world.
181
178
  .PP
182
179
  Note the Rack::ContentLength and Rack::Chunked middlewares are also
183
180
  loaded by "deployment" and "development", but no other values of
184
- RACK_ENV.
185
- If needed, they must be individually specified in the RACKUP_FILE, some
186
- frameworks do not require them.
181
+ RACK_ENV. If needed, they must be individually specified in the
182
+ RACKUP_FILE, some frameworks do not require them.
187
183
  .SH ENVIRONMENT VARIABLES
188
184
  .PP
189
185
  The RACK_ENV variable is set by the aforementioned \-E switch.
190
- All application or library\-specific environment variables (e.g.
191
- TMPDIR) may always be set in the Unicorn CONFIG_FILE in addition to the
192
- spawning shell.
193
- When transparently upgrading Unicorn, all environment variables set in
194
- the old master process are inherited by the new master process.
186
+ All application or library\-specific environment variables (e.g. TMPDIR)
187
+ may always be set in the Unicorn CONFIG_FILE in addition to the spawning
188
+ shell. When transparently upgrading Unicorn, all environment variables
189
+ set in the old master process are inherited by the new master process.
195
190
  Unicorn only uses (and will overwrite) the UNICORN_FD environment
196
191
  variable internally when doing transparent upgrades.
197
192
  .PP
198
193
  UNICORN_FD is a comma\-delimited list of one or more file descriptors
199
- used to implement USR2 upgrades.
200
- Init systems may bind listen sockets itself and spawn unicorn with
201
- UNICORN_FD set to the file descriptor numbers of the listen socket(s).
194
+ used to implement USR2 upgrades. Init systems may bind listen sockets
195
+ itself and spawn unicorn with UNICORN_FD set to the file descriptor
196
+ numbers of the listen socket(s).
202
197
  .PP
203
198
  As of unicorn 5.0, LISTEN_PID and LISTEN_FDS are used for socket
204
- activation as documented in the sd_listen_fds(3) manpage.
205
- Users relying on this feature do not need to specify a listen socket in
199
+ activation as documented in the sd_listen_fds(3) manpage. Users
200
+ relying on this feature do not need to specify a listen socket in
206
201
  the unicorn config file.
207
202
  .SH SEE ALSO
208
203
  .IP \[bu] 2
209
204
  \f[I]Rack::Builder\f[] ri/RDoc
210
205
  .IP \[bu] 2
211
206
  \f[I]Unicorn::Configurator\f[] ri/RDoc
207
+ .UR https://yhbt.net/unicorn/Unicorn/Configurator.html
208
+ .UE
212
209
  .IP \[bu] 2
213
- Unicorn RDoc (https://bogomips.org/unicorn/)
210
+ unicorn RDoc
211
+ .UR https://yhbt.net/unicorn/
212
+ .UE
214
213
  .IP \[bu] 2
215
- Rack RDoc (http://www.rubydoc.info/github/rack/rack/)
214
+ Rack RDoc
215
+ .UR https://www.rubydoc.info/github/rack/rack/
216
+ .UE
216
217
  .IP \[bu] 2
217
- Rackup HowTo (https://github.com/rack/rack/wiki/tutorial-rackup-howto)
218
+ Rackup HowTo
219
+ .UR https://github.com/rack/rack/wiki/(tutorial)-rackup-howto
220
+ .UE
218
221
  .SH AUTHORS
219
- The Unicorn Community <unicorn-public@bogomips.org>.
222
+ The Unicorn Community <unicorn-public@yhbt.net>.