yahns 0.0.1 → 0.0.2

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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Documentation/.gitignore +5 -0
  4. data/Documentation/GNUmakefile +50 -0
  5. data/Documentation/yahns-rackup.txt +152 -0
  6. data/Documentation/yahns.txt +68 -0
  7. data/Documentation/yahns_config.txt +563 -0
  8. data/GIT-VERSION-GEN +1 -1
  9. data/GNUmakefile +14 -7
  10. data/HACKING +56 -0
  11. data/INSTALL +8 -0
  12. data/README +15 -2
  13. data/Rakefile +2 -2
  14. data/bin/yahns +1 -2
  15. data/bin/yahns-rackup +9 -0
  16. data/examples/yahns_multi.conf.rb +14 -4
  17. data/examples/yahns_rack_basic.conf.rb +17 -1
  18. data/extras/README +16 -0
  19. data/extras/autoindex.rb +151 -0
  20. data/extras/exec_cgi.rb +108 -0
  21. data/extras/proxy_pass.rb +210 -0
  22. data/extras/try_gzip_static.rb +208 -0
  23. data/lib/yahns.rb +5 -2
  24. data/lib/yahns/acceptor.rb +64 -22
  25. data/lib/yahns/cap_input.rb +2 -2
  26. data/lib/yahns/{client_expire_portable.rb → client_expire_generic.rb} +12 -11
  27. data/lib/yahns/{client_expire.rb → client_expire_tcpi.rb} +7 -6
  28. data/lib/yahns/config.rb +107 -22
  29. data/lib/yahns/daemon.rb +2 -0
  30. data/lib/yahns/fdmap.rb +28 -9
  31. data/lib/yahns/http_client.rb +123 -37
  32. data/lib/yahns/http_context.rb +21 -3
  33. data/lib/yahns/http_response.rb +80 -19
  34. data/lib/yahns/log.rb +23 -4
  35. data/lib/yahns/queue_epoll.rb +20 -9
  36. data/lib/yahns/queue_quitter.rb +16 -0
  37. data/lib/yahns/queue_quitter_pipe.rb +24 -0
  38. data/lib/yahns/rack.rb +0 -1
  39. data/lib/yahns/rackup_handler.rb +57 -0
  40. data/lib/yahns/server.rb +189 -59
  41. data/lib/yahns/server_mp.rb +43 -35
  42. data/lib/yahns/sigevent_pipe.rb +1 -0
  43. data/lib/yahns/socket_helper.rb +37 -11
  44. data/lib/yahns/stream_file.rb +14 -4
  45. data/lib/yahns/stream_input.rb +13 -7
  46. data/lib/yahns/tcp_server.rb +7 -0
  47. data/lib/yahns/tmpio.rb +10 -3
  48. data/lib/yahns/unix_server.rb +7 -0
  49. data/lib/yahns/wbuf.rb +19 -2
  50. data/lib/yahns/wbuf_common.rb +10 -3
  51. data/lib/yahns/wbuf_str.rb +24 -0
  52. data/lib/yahns/worker.rb +5 -26
  53. data/test/helper.rb +15 -5
  54. data/test/server_helper.rb +37 -1
  55. data/test/test_bin.rb +17 -8
  56. data/test/test_buffer_tmpdir.rb +103 -0
  57. data/test/test_client_expire.rb +71 -35
  58. data/test/test_client_max_body_size.rb +5 -13
  59. data/test/test_config.rb +1 -1
  60. data/test/test_expect_100.rb +176 -0
  61. data/test/test_extras_autoindex.rb +53 -0
  62. data/test/test_extras_exec_cgi.rb +81 -0
  63. data/test/test_extras_exec_cgi.sh +35 -0
  64. data/test/test_extras_try_gzip_static.rb +177 -0
  65. data/test/test_input.rb +128 -0
  66. data/test/test_mt_accept.rb +48 -0
  67. data/test/test_output_buffering.rb +90 -63
  68. data/test/test_rack.rb +1 -1
  69. data/test/test_rack_hijack.rb +2 -6
  70. data/test/test_reopen_logs.rb +2 -8
  71. data/test/test_serve_static.rb +104 -8
  72. data/test/test_server.rb +448 -73
  73. data/test/test_stream_file.rb +1 -1
  74. data/test/test_unix_socket.rb +72 -0
  75. data/test/test_wbuf.rb +20 -17
  76. data/yahns.gemspec +3 -0
  77. metadata +57 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c03354f508bb8d5ece9deaac06b265c9f97c7254
4
- data.tar.gz: e0bcd2f85d316a6ff76b9e7f38b9449f088e59aa
3
+ metadata.gz: 32f85a4c4ed36a082242c5b58bae7f18528543c1
4
+ data.tar.gz: e741b37a8b0f62d47d9ea08ce36ab69b31536f15
5
5
  SHA512:
6
- metadata.gz: d1cf5fae66ee58b4a5435d2d760c6b4283a327e58919c67bcfc7a6ec4805b3a80747e47a9565dab2042bebcfd9ec210ee7f6665397e863ab7cd03cddb9b34493
7
- data.tar.gz: 761d334654d9b44ba58f96fbe78d087a8e9c323ce55ef5d1597e6681d5d0076d34f41918858aca66ab3056ce2b52f524d5a2d5ba4f70fc60916f815c1213710b
6
+ metadata.gz: 8eb0d76f793c6bc787ec789214e05f2f03face6e7772cad38ca7da67986e6a579f9b69c927ed39224b75f72e2dafaa3f886a4dc9c17eea24ccd0d3ae59aaf994
7
+ data.tar.gz: d9b233d340ef2ca35c5f5c085cac97bb6090d3ba2dbf2c89b57edcc1577d6ea5ef8b67f4821f6cbe04e36938b9d49ebd6d8898838f370baeb89da1845297bbe5
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  .manifest
14
14
  .gem-manifest
15
15
  .tgz-manifest
16
+ /doc
@@ -0,0 +1,5 @@
1
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
2
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ *.1
4
+ *.5
5
+ *.7
@@ -0,0 +1,50 @@
1
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
2
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ all::
4
+
5
+ INSTALL = install
6
+ PANDOC = pandoc
7
+ PANDOC_OPTS = -f markdown --email-obfuscation=none
8
+ pandoc = $(PANDOC) $(PANDOC_OPTS)
9
+
10
+ m1 =
11
+ m1 += yahns
12
+ m1 += yahns-rackup
13
+
14
+ m5 =
15
+ m5 += yahns_config
16
+
17
+ m7 =
18
+
19
+ man1 := $(addsuffix .1, $(m1))
20
+ man5 := $(addsuffix .5, $(m5))
21
+ man7 := $(addsuffix .7, $(m7))
22
+
23
+ all:: man
24
+
25
+ man: $(man1) $(man5) $(man7)
26
+
27
+ prefix ?= $(HOME)
28
+ mandir ?= $(prefix)/share/man
29
+ man1dir = $(mandir)/man1
30
+ man5dir = $(mandir)/man5
31
+ man7dir = $(mandir)/man7
32
+
33
+ gem-man: man
34
+ $(INSTALL) -d -m 755 ../man
35
+ $(INSTALL) -m 644 $(man1) ../man
36
+ $(INSTALL) -m 644 $(man5) ../man
37
+ test -z "$(man7)" || $(INSTALL) -m 644 $(man7) ../man
38
+
39
+ install-man: man
40
+ $(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
41
+ $(INSTALL) -d -m 755 $(DESTDIR)$(man5dir)
42
+ test -z "$(man7)" || $(INSTALL) -d -m 755 $(DESTDIR)$(man7dir)
43
+ $(INSTALL) -m 644 $(man1) $(DESTDIR)$(man1dir)
44
+ $(INSTALL) -m 644 $(man5) $(DESTDIR)$(man5dir)
45
+ test -z "$(man7)" || $(INSTALL) -m 644 $(man7) $(DESTDIR)$(man7dir)
46
+ %.1 %.5 %.7 : %.txt
47
+ $(pandoc) -s -t man < $< > $@+ && mv $@+ $@
48
+
49
+ clean::
50
+ $(RM) $(man1) $(man5) $(man7)
@@ -0,0 +1,152 @@
1
+ % yahns-rackup(1) yahns user manual
2
+
3
+ # NAME
4
+
5
+ yahns-rackup - a rackup-like command to launch yahns
6
+
7
+ # SYNOPSIS
8
+
9
+ yahns-rackup [-E RACK_ENV] [-O worker_threads=NUM] [RACKUP_FILE]
10
+
11
+ # DESCRIPTION
12
+
13
+ A rackup(1)-like command to launch Rack applications using yahns.
14
+ It is expected to start in your application root (APP_ROOT).
15
+
16
+ # RACKUP FILE
17
+
18
+ This defaults to \"config.ru\" in APP_ROOT. It should be the same
19
+ file used by rackup(1) and other Rack launchers, it uses the
20
+ *Rack::Builder* DSL.
21
+
22
+ # YAHNS OPTIONS
23
+ -O client_timeout=SECONDS
24
+ : Defines the timeout expiring idle connections.
25
+
26
+ Increase this if your application takes longer to run than the
27
+ default timeout. Lower this if you run out of FDs.
28
+
29
+ Default: 15 (seconds)
30
+
31
+ -O listen=ADDRESS[,ADDRESS...]
32
+ : Listens on a given ADDRESS. ADDRESS may be in the form of
33
+ HOST:PORT or PATH, HOST:PORT is taken to mean a TCP socket
34
+ and PATH is meant to be a path to a UNIX domain socket.
35
+ Defaults to "0.0.0.0:9292" (all addresses on TCP port 9292).
36
+ Multiple addresses may be separated with commas.
37
+
38
+ -O stderr_path=PATHNAME
39
+ : Allow redirecting $stderr to a given path. Unlike doing this from
40
+ the shell, this allows the yahns process to know the path its
41
+ writing to and rotate the file if it is used for logging. The
42
+ file will be opened with the O_APPEND flag and writes
43
+ synchronized to the kernel (but not necessarily to _disk_) so
44
+ multiple processes can safely append to it.
45
+
46
+ If you are daemonizing and using the default logger, it is important
47
+ to specify this as errors will otherwise be lost to /dev/null.
48
+ Some applications/libraries may also triggering warnings that go to
49
+ stderr, and they will end up here.
50
+
51
+ Default: /dev/null if daemonized, controlling terminal if not
52
+
53
+ -O stdout_path=PATH
54
+ : Same as stderr_path, except for $stdout. Not many applications
55
+ write to $stdout, but any that do will have their output written here.
56
+ It is safe to point this to the same location a stderr_path.
57
+ Like stderr_path, this defaults to /dev/null when daemonized.
58
+
59
+ Default: /dev/null if daemonized, controlling terminal if not
60
+
61
+ -O worker_threads=INTEGER
62
+ : This controls the number of threads for application processing.
63
+ Each queue has its own thread pool. Increase this number if your
64
+ applications are able to use more threads effectively or if either
65
+ (or both) input/output buffering are disabled. Lower this number if
66
+ you do not need multi-thread concurrency at all.
67
+
68
+ Default: 7
69
+
70
+ # RACKUP OPTIONS
71
+ -D, \--daemonize
72
+ : Run daemonized in the background. The process is detached from
73
+ the controlling terminal and stdin is redirected to /dev/null.
74
+ Unless specified via stderr_path and stdout_path, stderr and stdout will
75
+ also be redirected to "/dev/null".
76
+
77
+ -E, \--env RACK_ENV
78
+ : Run under the given RACK_ENV. See the RACK ENVIRONMENT section
79
+ for more details.
80
+
81
+ -o, \--host HOST
82
+ : Listen on a TCP socket belonging to HOST, default is
83
+ "0.0.0.0" (all addresses).
84
+ If specified multiple times on the command-line, only the
85
+ last-specified value takes effect.
86
+ This option only exists for compatibility with the rackup(1) command,
87
+ use of "-l"/"\--listen" switch is recommended instead.
88
+
89
+ -p, \--port PORT
90
+ : Listen on the specified TCP PORT, default is 9292.
91
+ If specified multiple times on the command-line, only the last-specified
92
+ value takes effect.
93
+ This option only exists for compatibility with the rackup(1) command,
94
+ use of "-l"/"\--listen" switch is recommended instead.
95
+
96
+ # RUBY OPTIONS
97
+ -e, \--eval LINE
98
+ : Evaluate a LINE of Ruby code. This evaluation happens
99
+ immediately as the command-line is being parsed.
100
+
101
+ -d, \--debug
102
+ : Turn on debug mode, the $DEBUG variable is set to true.
103
+
104
+ -w, \--warn
105
+ : Turn on verbose warnings, the $VERBOSE variable is set to true.
106
+
107
+ -I, \--include PATH
108
+ : specify $LOAD_PATH. PATH will be prepended to $LOAD_PATH.
109
+ The \':\' character may be used to delimit multiple directories.
110
+ This directive may be used more than once. Modifications to
111
+ $LOAD_PATH take place immediately and in the order they were
112
+ specified on the command-line.
113
+
114
+ -r, \--require LIBRARY
115
+ : require a specified LIBRARY before executing the application. The
116
+ \"require\" statement will be executed immediately and in the order
117
+ they were specified on the command-line.
118
+
119
+ # SIGNALS
120
+
121
+ See yahns(1)
122
+
123
+ # FILES
124
+
125
+ See Rack documentation for a description of the rackup file format.
126
+
127
+ # ENVIRONMENT VARIABLES
128
+
129
+ The RACK_ENV variable is set by the aforementioned \-E switch.
130
+ If RACK_ENV is already set, it will be used unless \-E is used.
131
+ See rackup documentation for more details.
132
+
133
+ # CONTACT
134
+
135
+ All feedback welcome via plain-text mail to <yahns-public@rubyforge.org>\
136
+ No subscription is necessary to post to the mailing list.
137
+
138
+ # COPYRIGHT
139
+
140
+ Copyright 2013, Eric Wong <normalperson@yhbt.net> and all contributors.\
141
+ License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
142
+
143
+ # SEE ALSO
144
+
145
+ yahns(1), yahns_config(5)
146
+
147
+ * *Rack::Builder* ri/RDoc
148
+ * [Rack RDoc][1]
149
+ * [Rackup HowTo][2]
150
+
151
+ [1]: http://rack.rubyforge.org/doc/
152
+ [2]: http://wiki.github.com/rack/rack/tutorial-rackup-howto
@@ -0,0 +1,68 @@
1
+ % yahns(1) yahns user manual
2
+ %
3
+
4
+ # NAME
5
+
6
+ yahns - multi-threaded, non-blocking application server for Ruby
7
+
8
+ # SYNOPSYS
9
+
10
+ yahns -c CONFIG_FILE [-D|--daemonize]
11
+
12
+ # DESCRIPTION
13
+
14
+ yahns(1) is the primary interface for launching a yahns application
15
+ server. The configuration file is documented in yahns_config(5). yahns
16
+ hosts Rack HTTP applications, but may support others in the future such
17
+ as DRb.
18
+
19
+ # SIGNALS
20
+
21
+ The following UNIX signals may be sent to the running yahns process.
22
+ If yahns is configured for worker_processes (optional), signals should
23
+ only be sent to the master process.
24
+
25
+ * INT/TERM/QUIT - graceful shutdown. If repeated (any of these signals
26
+ is sent twice), shutdown occurs immediately.
27
+ * USR1 - reopen all logs owned by the master and all workers.
28
+ This scans the Ruby ObjectSpace for all open File objects with the O_APPEND
29
+ file flag and buffering disabled (IO#sync==false)
30
+ * USR2 - reexecute the running binary. A separate QUIT should be sent to
31
+ * HUP - if worker_processes are not used, this will reexecute the running
32
+ binary and gracefully exit the running process. If worker_processes are
33
+ used, this will reload config file, app, and gracefully restart all workers
34
+ * WINCH - gracefully stops workers but keep the master running.
35
+ This will only work for daemonized processes and only if the
36
+ worker_processes configuration directive is used.
37
+ * TTIN - increment the number of worker processes by one
38
+ (only if the worker_processes directive is used)
39
+ * TTOU - decrement the number of worker processes by one
40
+ (only if the worker_processes directive is used)
41
+
42
+ # ENVIRONMENT
43
+
44
+ yahns(1) itself requires no special environment variables. However,
45
+ environment variables such as RACK_ENV and RAILS_ENV can affect Rack and
46
+ Rails applications it hosts. Ruby and C library implementation-specific
47
+ environment variables will also affect it.
48
+
49
+ yahns will update the PWD (current working directory) env if the
50
+ working_directory directive is set (see yahns_config(5)).
51
+
52
+ # FILES
53
+
54
+ See yahns_config(5) for documentation on the configuration file format.
55
+
56
+ # CONTACT
57
+
58
+ All feedback welcome via plain-text mail to <yahns-public@rubyforge.org>\
59
+ No subscription is necessary to post to the mailing list.
60
+
61
+ # COPYRIGHT
62
+
63
+ Copyright 2013, Eric Wong <normalperson@yhbt.net> and all contributors.\
64
+ License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
65
+
66
+ # SEE ALSO
67
+
68
+ yahns-rackup(1), yahns_config(5)
@@ -0,0 +1,563 @@
1
+ % yahns_config(5) yahns user manual
2
+ %
3
+
4
+ # NAME
5
+
6
+ yahns_config - configuration file description for yahns(1)
7
+
8
+ # DESCRIPTION
9
+
10
+ Since yahns is a Ruby application server, its configuration file is
11
+ implemented in Ruby syntax, making it dependent on the version of
12
+ Ruby it is running under.
13
+
14
+ # TOP-LEVEL DIRECTIVES
15
+
16
+ * app :TYPE, *APP_ARGUMENTS, &BLOCK
17
+
18
+ This defines an application context for yahns to run. :TYPE defines
19
+ the type of application it runs. yahns will eventually support
20
+ application types other than :rack, but for now, only :rack is
21
+ supported.
22
+
23
+ The &BLOCK given configures the which sockets the app listens on,
24
+ buffering and logging settings.
25
+
26
+ An app with the same :TYPE and APP_ARGUMENTS may be defined multiple
27
+ times with different &BLOCK contents (with different listeners and
28
+ buffering settings).
29
+
30
+ See the APP-BLOCK DIRECTIVES section for details on what goes into
31
+ the &BLOCK.
32
+
33
+ This directive may be specified multiple times for different or
34
+ identical applications.
35
+
36
+ If the "working_directory" directive is used, all app directives may
37
+ only be specified after setting "working_directory".
38
+
39
+ For Rack HTTP applications, see RACK APP ARGUMENTS for more
40
+ information.
41
+
42
+ * before_exec &BLOCK
43
+
44
+ This runs &BLOCK before Kernel#exec (execve(2) wrapper). The command
45
+ array to be passed to Kernel#exec may be modified within this hook:
46
+
47
+ before_exec do |cmd|
48
+ # you may modify ENV here inside the child process
49
+ ENV["MALLOC_ARENA_MAX"] = ENV["MALLOC_ARENA_TEST"] = "1"
50
+
51
+ # You may change to a different installation of Ruby or yahns
52
+ # by doing an in-place modification of cmd:
53
+ cmd.replace(%W(/another/install/of/yahns -c cfg.rb))
54
+ end
55
+
56
+ Default: (none)
57
+
58
+ * client_expire_threshold {INTEGER|FLOAT}
59
+
60
+ yahns will start expiring idle clients when it hits this threshold.
61
+ If the threshold is a floating point number, it is that fraction of
62
+ the soft open file limit (RLIMIT_NOFILE ir `ulimit -S -n` in shell).
63
+ Thus if the soft open file limit is 1024 (a typical value) and the
64
+ client_expire_threshold is 0.3, yahns will start expiring clients once
65
+ it hits 307 clients (0.3 * 1024).
66
+
67
+ If given a positive integer, yahns will start expiring clients once it
68
+ its this absolute threshold of connected clients.
69
+
70
+ If given a negative integer, yahns will start expiring clients once it
71
+ reaches N clients away from the the soft file limit. That is, if
72
+ client_expire_threshold is -666 and the soft open file limit is 1024,
73
+ it will start expiring once it hits 358 clients.
74
+
75
+ Clients are expired when the configured client_timeout for their
76
+ app context is hit.
77
+
78
+ Default: 0.5
79
+
80
+ * logger LOGGER
81
+
82
+ Sets LOGGER as the default logger of the process. The new
83
+ LOGGER must respond to the following methods:
84
+
85
+ debug, info, warn, error, fatal
86
+
87
+ The default logger will log its output to the path specified
88
+ by stderr_path. If you're running yahns daemonized, then
89
+ you must specify a path to prevent error messages from going
90
+ to /dev/null
91
+
92
+ A per-APP &BLOCK logger may also be configured inside an app &BLOCK.
93
+
94
+ Default: Logger.new($stderr)
95
+
96
+ * pid PATHNAME
97
+
98
+ Sets the path of the PID file for use with management/init scripts.
99
+
100
+ Default: none
101
+
102
+ * queue [NAME] &BLOCK
103
+
104
+ As a top-level directive, this configures or defines a queue.
105
+ If no NAME is specified, a default queue (named :default) is
106
+ assumed. See the QUEUE-LEVEL DIRECTIVES section for details.
107
+
108
+ A &BLOCK must be given if used as a top-level directive. This
109
+ behaves slightly differently inside an app &BLOCK. This may also
110
+ be given without a block to associate an app block with a named
111
+ queue.
112
+
113
+ Usually, only one queue is necessary. Each queue corresponds to
114
+ an epoll descriptor and worker thread pool.
115
+
116
+ Default: NAME defaults to :default
117
+
118
+ * stderr_path PATHNAME
119
+
120
+ Allow redirecting $stderr to a given path. Unlike doing this from
121
+ the shell, this allows the yahns process to know the path its
122
+ writing to and rotate the file if it is used for logging. The
123
+ file will be opened with the O_APPEND flag and writes
124
+ synchronized to the kernel (but not necessarily to _disk_) so
125
+ multiple processes can safely append to it.
126
+
127
+ If you are daemonizing and using the default logger, it is important
128
+ to specify this as errors will otherwise be lost to /dev/null.
129
+ Some applications/libraries may also triggering warnings that go to
130
+ stderr, and they will end up here.
131
+
132
+ Default: /dev/null if daemonized, controlling terminal if not
133
+
134
+ * stdout_path PATHNAME
135
+
136
+ Same as stderr_path, except for $stdout. Not many applications
137
+ write to $stdout, but any that do will have their output written here.
138
+ It is safe to point this to the same location a stderr_path.
139
+ Like stderr_path, this defaults to /dev/null when daemonized.
140
+
141
+ Default: /dev/null if daemonized, controlling terminal if not
142
+
143
+ * working_directory PATHNAME
144
+
145
+ Sets the working directory for the process. This ensures SIGUSR2 will
146
+ start a new instance of yahns in this directory. This may be
147
+ a symlink, a common scenario for Capistrano users. Unlike
148
+ all other yahns configuration directives, this binds immediately
149
+ for error checking and cannot be undone by unsetting it in the
150
+ configuration file and reloading.
151
+
152
+ This must be specified before any "app" directives
153
+
154
+ Default: / if daemonized, current working directory if not
155
+
156
+ # QUEUE-LEVEL DIRECTIVES
157
+
158
+ * max_events INTEGER
159
+
160
+ This controls the number of events a worker thread will fetch at
161
+ once via epoll_wait(2). There is no good reason to change this
162
+ unless you use very few (e.g. 1) worker_threads. Leaving this at
163
+ 1 will give the fairest load balancing behavior with epoll.
164
+
165
+ Default: 1
166
+
167
+ * worker_threads INTEGER
168
+
169
+ This controls the number of threads for application processing.
170
+ Each queue has its own thread pool. Increase this number if your
171
+ applications are able to use more threads effectively or if either
172
+ (or both) input/output buffering are disabled. Lower this number if
173
+ you do not need multi-thread concurrency at all.
174
+
175
+ Default: 7
176
+
177
+ ## APP-BLOCK DIRECTIVES
178
+
179
+ * atfork_prepare, atfork_parent, atfork_child
180
+
181
+ These are identical to the methods defined in WORKER_PROCESSES-LEVEL
182
+ DIRECTIVES, however they are available inside the app blocks for
183
+ convenience in case it is easier to organize per-app hooks.
184
+
185
+ Default: (none)
186
+
187
+ * check_client_connection BOOLEAN
188
+
189
+ When enabled, yahns will check the client connection by writing
190
+ the beginning of the HTTP headers before calling the application.
191
+
192
+ This can prevent calling the application for clients who have
193
+ disconnected while their connection was waiting for a free
194
+ worker thread.
195
+
196
+ This only affects clients connecting over Unix domain sockets and
197
+ TCP via loopback (127.*.*.*). It is unlikely to detect disconnects
198
+ if the client is on a remote host (even on a fast LAN).
199
+
200
+ This has no effect for (rare) HTTP/0.9 clients.
201
+
202
+ Default: false
203
+
204
+ * client_body_buffer_size INTEGER
205
+
206
+ This controls the maximum size of a request body before it is
207
+ buffered to the filesystem (instead of memory). This has no effect
208
+ if input_buffering is false. This also governs the size of an
209
+ individual read(2) system call when reading a request body.
210
+
211
+ Default: 8192 bytes (8 kilobytes)
212
+
213
+ * client_header_buffer_size INTEGER
214
+
215
+ This controls the size of a single read(2) syscall for reading
216
+ client request headers. Increase this as needed if your application
217
+ uses large cookies or long URLs. Lowering this may reduce GC and
218
+ memory allocator overhead.
219
+
220
+ Default 4000 bytes
221
+
222
+ * client_max_body_size {INTEGER|nil}
223
+
224
+ This controls the maximum request body size before a client is
225
+ rejected with an HTTP 413 error.
226
+
227
+ Setting this to nil will allow unlimited-sized inputs.
228
+
229
+ Default: 1048576 bytes (one megabyte)
230
+
231
+ * client_timeout SECONDS
232
+
233
+ Defines the timeout expiring idle connections.
234
+
235
+ If input_buffering is false or :lazy, this defines the maximum
236
+ amount of time a worker thread will wait synchronously for a client
237
+ request body.
238
+
239
+ If output_buffering is false, this defines the maximm amount of
240
+ time a worker thread will wait synchronously for a client socket
241
+ to become writable.
242
+
243
+ It makes sense to lower this to a low value (e.g. 5 seconds) if
244
+ either output or input buffering are disabled. The default value
245
+ of 15 seconds is suitable for configurations with both input and
246
+ output buffering enabled and assumes all application dispatch
247
+ finishes in less than 15 seconds.
248
+
249
+ Default: 15 (seconds)
250
+
251
+ * errors {IO|PATHNAME}
252
+
253
+ For Rack applications, this controls the env["rack.errors"]
254
+ destination. If given a PATHNAME, it will be a writable file
255
+ opened with O_APPEND without userspace buffering, making it suitable
256
+ for concurrent appends by multiple processes and threads, as well as
257
+ making it eligible for reopening via SIGUSR1 after log rotation.
258
+
259
+ Default: $stderr
260
+
261
+ * input_buffering {:lazy|true|false}[, OPTIONS]
262
+
263
+ This controls buffering of the HTTP request body.
264
+
265
+ + true - fully buffers the request before application dispatch. This is
266
+ most suitable for slow and untrusted clients which may trickle
267
+ the request to the server.
268
+
269
+ + :lazy - provides streaming, but rewindable input. This is suitable
270
+ for fast, trusted clients and is fully-compatible with Rack 1.x
271
+ specifications. :lazy buffering may also be suitable for slow and
272
+ untrusted clients if you are able and willing to run a queue with
273
+ many worker threads.
274
+
275
+ + false - disable input buffering completely. This violates the
276
+ Rack 1.x spec and is only suitable for fast, trusted clients or
277
+ queues with many worker threads.
278
+
279
+ HTTP request headers are always buffered in memory.
280
+
281
+ Default: true
282
+
283
+ The following OPTIONS may be specified:
284
+
285
+ + tmpdir: DIRECTORY
286
+
287
+ Specify an alternative temporary directory of input_buffering is
288
+ :lazy or true. This can be used in case the normal temporary
289
+ directory is too small or busy to be used for input buffering.
290
+
291
+ Default: Dir.tmpdir (usually from TMPDIR env or /tmp)
292
+
293
+ * listen ADDRESS [, OPTIONS]
294
+
295
+ Adds an ADDRESS to the existing listener set. May be specified more
296
+ than once. ADDRESS may be an Integer port number for a TCP port, an
297
+ "IP_ADDRESS:PORT" for TCP listeners or a pathname for UNIX domain sockets.
298
+
299
+ listen 3000 # listen to port 3000 on all TCP interfaces
300
+ listen "127.0.0.1:3000" # listen to port 3000 on the loopback interface
301
+ listen "/path/to/.unicorn.sock" # listen on the given Unix domain socket
302
+ listen "[::1]:3000" # listen to port 3000 on the IPv6 loopback interface
303
+
304
+ When using Unix domain sockets, be sure:
305
+ 1) the path matches the one used by nginx
306
+ 2) uses the same filesystem namespace as the nginx process
307
+ For systemd users using PrivateTmp=true (for either nginx or yahns),
308
+ this means Unix domain sockets must not be placed in /tmp
309
+
310
+ The following OPTIONS may be specified (but are generally not needed):
311
+
312
+ + backlog: INTEGER
313
+
314
+ This is the backlog of the listen(2) syscall.
315
+
316
+ Some operating systems allow negative values here to specify the
317
+ maximum allowable value. In most cases, this number is only
318
+ recommendation and there are other OS-specific tunables and
319
+ variables that can affect this number. See the listen(2)
320
+ syscall documentation of your OS for the exact semantics of
321
+ this.
322
+
323
+ If you are running unicorn on multiple machines, lowering this number
324
+ can help your load balancer detect when a machine is overloaded
325
+ and give requests to a different machine.
326
+
327
+ Default: 1024
328
+
329
+ + ipv6only: BOOLEAN
330
+
331
+ This option makes IPv6-capable TCP listeners IPv6-only and unable
332
+ to receive IPv4 queries on dual-stack systems. A separate IPv4-only
333
+ listener is required if this is true.
334
+
335
+ Enabling this option for the IPv6-only listener and having a
336
+ separate IPv4 listener is recommended if you wish to support IPv6
337
+ on the same TCP port. Otherwise, the value of env["REMOTE_ADDR"]
338
+ will appear as an ugly IPv4-mapped-IPv6 address for IPv4 clients
339
+ (e.g ":ffff:10.0.0.1" instead of just "10.0.0.1").
340
+
341
+ Default: Operating-system dependent
342
+
343
+ + sndbuf / rcvbuf: INTEGER
344
+
345
+ Maximum receive and send buffer sizes (in bytes) of sockets.
346
+
347
+ These correspond to the SO_RCVBUF and SO_SNDBUF settings which
348
+ can be set via the setsockopt(2) syscall. Some kernels
349
+ (e.g. Linux 2.4+) have intelligent auto-tuning mechanisms and
350
+ there is no need (and it is sometimes detrimental) to specify them.
351
+
352
+ See the socket API documentation of your operating system
353
+ to determine the exact semantics of these settings and
354
+ other operating system-specific knobs where they can be
355
+ specified.
356
+
357
+ Defaults: operating system defaults
358
+
359
+ + reuseport: BOOLEAN
360
+
361
+ This enables multiple, independently-started yahns instances to
362
+ bind to the same port (as long as all the processes enable this).
363
+
364
+ This option must be used when yahns first binds the listen socket.
365
+ It cannot be enabled when a socket is inherited via SIGUSR2
366
+ (but it will remain on if inherited), and it cannot be enabled
367
+ directly via SIGHUP.
368
+
369
+ Note: there is a chance of connections being dropped if
370
+ one of the yahns instances is stopped while using this.
371
+
372
+ This is supported on *BSD systems and Linux 3.9 or later.
373
+
374
+ ref: https://lwn.net/Articles/542629/
375
+
376
+ Default: false (unset)
377
+
378
+ + threads: INTEGER
379
+
380
+ Used to control the number of threads blocking on the accept(2)
381
+ or accept4(2) system call (per listen socket).
382
+
383
+ Usually, only one thread here is necessary, especially when
384
+ multiple worker_processes are configured (as there'll be one
385
+ thread per-process). Having extra threads may increase
386
+ contention with epoll and FD allocation within one process.
387
+
388
+ Note: do not confuse this option with worker_threads for queues,
389
+ each queue has their own thread pool and it makes sense to
390
+ have multiple threads there.
391
+
392
+ Default: 1
393
+
394
+ + umask: MODE
395
+
396
+ Sets the file mode creation mask for UNIX sockets. If specified,
397
+ this is usually in octal notation.
398
+
399
+ Typically UNIX domain sockets are created with more liberal
400
+ file permissions than the rest of the application. By default,
401
+ we create UNIX domain sockets to be readable and writable by
402
+ all local users to give them the same accessibility as
403
+ locally-bound TCP listeners.
404
+
405
+ This has no effect on TCP listeners.
406
+
407
+ Default: 0000 (world-read/writable)
408
+
409
+ * logger LOGGER
410
+
411
+ Configures a logger within the current app &BLOCK.
412
+ This behaves the same as the logger directive described in
413
+ TOP-LEVEL DIRECTIVES
414
+
415
+ Default: uses the top-level logger
416
+
417
+ * output_buffering BOOLEAN [, OPTIONS]
418
+
419
+ This enables or disables buffering of the HTTP response. If enabled,
420
+ buffering is only performed lazily. In other words, buffering only
421
+ happens if socket buffers (in the kernel) are filled up.
422
+
423
+ Disabling output buffering is only recommended if all clients
424
+ connecting to this application context are fast, trusted or
425
+ you are willing and able to run many worker threads.
426
+
427
+ If output buffering is disabled, client_timeout controls the maximum
428
+ amount of time a worker thread will wait synchronously.
429
+
430
+ Default: true
431
+
432
+ The following OPTIONS may be specified:
433
+
434
+ + tmpdir: DIRECTORY
435
+
436
+ Specify an alternative temporary directory of output_buffering is
437
+ enabled. This can be used in case the normal temporary directory
438
+ is too small or busy to be used for output buffering.
439
+
440
+ Default: Dir.tmpdir (usually from TMPDIR env or /tmp)
441
+
442
+ * persistent_connections BOOLEAN
443
+
444
+ Enable or disables persistent connections and pipelining for HTTP
445
+ connections. Persistent connections only expire when the global
446
+ client_expire_threshold is hit and a client hits its client_timeout.
447
+
448
+ Default: true
449
+
450
+ * user USER [,GROUP]
451
+
452
+ Runs application process(es) as the specified USER and GROUP.
453
+
454
+ If using worker_processes, this only affects the workers and the
455
+ master stays running as the user who started it. This switch will
456
+ occur before calling the atfork_child hook(s).
457
+
458
+ GROUP is optional and will not change if unspecified.
459
+
460
+ Default: none (no user switching is done)
461
+
462
+ * queue [NAME or &BLOCK]
463
+
464
+ If given a NAME-only, this will associate this app &BLOCK with an
465
+ existing queue.
466
+
467
+ If given a &BLOCK-only, this will create an anonymous queue for this
468
+ application context only. If given a &BLOCK, this takes the same
469
+ parameters (worker_threads and max_events) as described in
470
+ QUEUE-LEVEL DIRECTIVES.
471
+
472
+ NAME and &BLOCK may not be combined inside an app &BLOCK.
473
+
474
+ Default: uses the global, :default queue if none is specified
475
+
476
+ * shutdown_timeout SECONDS
477
+
478
+ This defines the timeout for gracefully exiting the process if there
479
+ are still connected clients. This should generally be higher or equal
480
+ to the app with the highest client_timeout value.
481
+
482
+ Increase this if your application has slow endpoints which may take
483
+ longer than the default timeout.
484
+
485
+ Default: max client_timeout value of all apps in the process
486
+
487
+ * worker_processes INTEGER [&BLOCK]
488
+
489
+ This directive allows yahns to use a master/worker configuration to
490
+ use multiple processes. Specifying any numeric value (including 1)
491
+ here means yahns will enable yahns to use a master/worker process
492
+ model instead of a single process.
493
+
494
+ If an optional &BLOCK is given, it may be used to configure
495
+ pthread_atfork(3)-style hooks. See WORKER_PROCESSES-LEVEL DIRECTIVES
496
+ for details.
497
+
498
+ Default: nil (single process, no master/worker separation)
499
+
500
+ ## WORKER_PROCESSES-LEVEL DIRECTIVES
501
+
502
+ Note: all of the atfork_* hooks described here are available inside the
503
+ "app" blocks, too.
504
+
505
+ * atfork_prepare &BLOCK
506
+
507
+ This &BLOCK is executed in the parent before fork(2) operation.
508
+ This may be useful for app directives which specify "preload: true"
509
+ to disconnect from databases or otherwise close open file descriptors
510
+ to prevent them from being shared with the children.
511
+
512
+ Default: none
513
+
514
+ * atfork_parent &BLOCK
515
+
516
+ This &BLOCK is executed in the parent after the fork(2) operation.
517
+ This may not be useful, but exists in case somebody finds a use for it.
518
+
519
+ Default: none
520
+
521
+ * atfork_child &BLOCK
522
+
523
+ This &BLOCK is executed in the child after the fork(2) operation.
524
+
525
+ This may be useful for app directives which specify "preload: true"
526
+ to reconnect to databases or reopen closed file descriptors which
527
+ were closed in the atfork_prepare hook.
528
+
529
+ Default: none
530
+
531
+ # RACK APP ARGUMENTS
532
+
533
+ Rack applications take a PATHNAME to the rackup(1) config file (e.g.
534
+ "config.ru") as its first argument.
535
+
536
+ The only supported keyword argument is the preload: BOOLEAN.
537
+
538
+ preload: only makes sense if worker_processes are configured.
539
+ Preloading an app allows memory to be saved under a copy-on-write GC,
540
+ but will often require atfork_* hooks to be registered when configuring
541
+ worker_processes. preload: defaults to false for maximum out-of-the-box
542
+ compatibility.
543
+
544
+ ## RACK APP EXAMPLE
545
+
546
+ app(:rack, "/path/to/config.ru", preload: false) do
547
+ # APP-BLOCK DIRECTIVES GO HERE
548
+ end
549
+
550
+ # EXAMPLES
551
+
552
+ See the examples/ directory in the git source tree.
553
+
554
+ git clone git://yhbt.net/yahns.git
555
+
556
+ # COPYRIGHT
557
+
558
+ Copyright 2013, Eric Wong <normalperson@yhbt.net> and all contributors.\
559
+ License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
560
+
561
+ # SEE ALSO
562
+
563
+ yahns(1)