unicorn 4.8.0 → 6.1.0

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 (123) hide show
  1. checksums.yaml +7 -0
  2. data/.document +0 -1
  3. data/.gitattributes +5 -0
  4. data/.gitignore +2 -2
  5. data/.manifest +17 -21
  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 +10 -32
  18. data/ISSUES +80 -19
  19. data/KNOWN_ISSUES +18 -18
  20. data/LATEST +23 -27
  21. data/LICENSE +2 -2
  22. data/Links +24 -22
  23. data/NEWS +823 -0
  24. data/PHILOSOPHY +0 -6
  25. data/README +49 -48
  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/.gitignore +3 -0
  32. data/archive/slrnpull.conf +4 -0
  33. data/bin/unicorn +4 -2
  34. data/bin/unicorn_rails +3 -3
  35. data/examples/big_app_gc.rb +1 -1
  36. data/examples/init.sh +36 -8
  37. data/examples/logrotate.conf +17 -2
  38. data/examples/nginx.conf +14 -14
  39. data/examples/unicorn.conf.minimal.rb +2 -2
  40. data/examples/unicorn.conf.rb +14 -6
  41. data/examples/unicorn.socket +11 -0
  42. data/examples/unicorn@.service +40 -0
  43. data/ext/unicorn_http/c_util.h +5 -13
  44. data/ext/unicorn_http/common_field_optimization.h +22 -5
  45. data/ext/unicorn_http/epollexclusive.h +124 -0
  46. data/ext/unicorn_http/ext_help.h +0 -44
  47. data/ext/unicorn_http/extconf.rb +32 -5
  48. data/ext/unicorn_http/global_variables.h +2 -2
  49. data/ext/unicorn_http/httpdate.c +3 -2
  50. data/ext/unicorn_http/unicorn_http.c +926 -638
  51. data/ext/unicorn_http/unicorn_http.rl +159 -170
  52. data/ext/unicorn_http/unicorn_http_common.rl +1 -1
  53. data/lib/unicorn/configurator.rb +110 -46
  54. data/lib/unicorn/const.rb +2 -25
  55. data/lib/unicorn/http_request.rb +110 -31
  56. data/lib/unicorn/http_response.rb +17 -31
  57. data/lib/unicorn/http_server.rb +272 -180
  58. data/lib/unicorn/launcher.rb +1 -1
  59. data/lib/unicorn/oob_gc.rb +16 -6
  60. data/lib/unicorn/select_waiter.rb +6 -0
  61. data/lib/unicorn/socket_helper.rb +58 -78
  62. data/lib/unicorn/stream_input.rb +8 -7
  63. data/lib/unicorn/tee_input.rb +16 -11
  64. data/lib/unicorn/tmpio.rb +10 -6
  65. data/lib/unicorn/util.rb +5 -4
  66. data/lib/unicorn/version.rb +1 -1
  67. data/lib/unicorn/worker.rb +36 -23
  68. data/lib/unicorn.rb +64 -44
  69. data/man/man1/unicorn.1 +124 -122
  70. data/man/man1/unicorn_rails.1 +113 -127
  71. data/t/.gitignore +0 -1
  72. data/t/GNUmakefile +3 -80
  73. data/t/README +4 -4
  74. data/t/t0002-parser-error.sh +3 -3
  75. data/t/t0011-active-unix-socket.sh +1 -1
  76. data/t/t0012-reload-empty-config.sh +2 -1
  77. data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
  78. data/t/t0301.ru +13 -0
  79. data/t/test-lib.sh +4 -3
  80. data/test/benchmark/README +14 -4
  81. data/test/benchmark/ddstream.ru +50 -0
  82. data/test/benchmark/readinput.ru +40 -0
  83. data/test/benchmark/uconnect.perl +66 -0
  84. data/test/exec/test_exec.rb +74 -20
  85. data/test/test_helper.rb +42 -33
  86. data/test/unit/test_ccc.rb +91 -0
  87. data/test/unit/test_droplet.rb +1 -1
  88. data/test/unit/test_http_parser.rb +49 -19
  89. data/test/unit/test_http_parser_ng.rb +98 -115
  90. data/test/unit/test_request.rb +11 -11
  91. data/test/unit/test_response.rb +31 -19
  92. data/test/unit/test_server.rb +89 -15
  93. data/test/unit/test_signals.rb +9 -9
  94. data/test/unit/test_socket_helper.rb +16 -12
  95. data/test/unit/test_tee_input.rb +10 -0
  96. data/test/unit/test_upload.rb +10 -15
  97. data/test/unit/test_util.rb +32 -6
  98. data/test/unit/test_waiter.rb +34 -0
  99. data/unicorn.gemspec +28 -23
  100. data/unicorn_1 +1 -0
  101. data/unicorn_rails_1 +1 -0
  102. metadata +68 -134
  103. data/.wrongdoc.yml +0 -10
  104. data/ChangeLog +0 -4861
  105. data/Documentation/GNUmakefile +0 -30
  106. data/Documentation/unicorn.1.txt +0 -178
  107. data/Documentation/unicorn_rails.1.txt +0 -175
  108. data/examples/git.ru +0 -13
  109. data/lib/unicorn/app/exec_cgi.rb +0 -154
  110. data/lib/unicorn/app/inetd.rb +0 -109
  111. data/lib/unicorn/ssl_client.rb +0 -11
  112. data/lib/unicorn/ssl_configurator.rb +0 -104
  113. data/lib/unicorn/ssl_server.rb +0 -42
  114. data/local.mk.sample +0 -59
  115. data/script/isolate_for_tests +0 -32
  116. data/t/hijack.ru +0 -42
  117. data/t/sslgen.sh +0 -71
  118. data/t/t0016-trust-x-forwarded-false.sh +0 -30
  119. data/t/t0017-trust-x-forwarded-true.sh +0 -30
  120. data/t/t0200-rack-hijack.sh +0 -27
  121. data/t/t0600-https-server-basic.sh +0 -48
  122. data/test/unit/test_http_parser_xftrust.rb +0 -38
  123. data/test/unit/test_sni_hostnames.rb +0 -47
@@ -0,0 +1,207 @@
1
+ .TH "UNICORN_RAILS" "1" "September 17, 2009" "Unicorn User Manual" ""
2
+ .hy
3
+ .SH NAME
4
+ .PP
5
+ unicorn_rails \- unicorn launcher for Rails 1.x and 2.x users
6
+ .SH SYNOPSIS
7
+ .PP
8
+ unicorn_rails [\-c CONFIG_FILE] [\-E RAILS_ENV] [\-D] [RACKUP_FILE]
9
+ .SH DESCRIPTION
10
+ .PP
11
+ A rackup(1)\-like command to launch ancient Rails (2.x and earlier)
12
+ applications using Unicorn. Rails 3 (and later) support Rack natively,
13
+ so users are encouraged to use unicorn(1) instead of unicorn_rails(1).
14
+ .PP
15
+ It is expected to be started in your Rails application root (RAILS_ROOT),
16
+ but the "working_directory" directive may be used in the CONFIG_FILE.
17
+ .PP
18
+ The outward interface resembles rackup(1), the internals and default
19
+ middleware loading is designed like the \f[C]script/server\f[] command
20
+ distributed with Rails.
21
+ .PP
22
+ While Unicorn takes a myriad of command\-line options for compatibility
23
+ with ruby(1) and rackup(1), it is recommended to stick to the few
24
+ command\-line options specified in the SYNOPSIS and use the CONFIG_FILE
25
+ as much as possible.
26
+ .SH UNICORN OPTIONS
27
+ .TP
28
+ .B \-c, \-\-config\-file CONFIG_FILE
29
+ Path to the Unicorn\-specific config file. The config file is
30
+ 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 full
32
+ list of directives available from the DSL.
33
+ Using an absolute path for for CONFIG_FILE is recommended as it
34
+ makes multiple instances of Unicorn easily distinguishable when
35
+ viewing ps(1) output.
36
+ .RS
37
+ .RE
38
+ .TP
39
+ .B \-D, \-\-daemonize
40
+ Run daemonized in the background. The process is detached from
41
+ the controlling terminal and stdin is redirected to "/dev/null".
42
+ Unlike many common UNIX daemons, we do not chdir to "/" upon
43
+ daemonization to allow more control over the startup/upgrade
44
+ process.
45
+ Unless specified in the CONFIG_FILE, stderr and stdout will
46
+ also be redirected to "/dev/null".
47
+ Daemonization will \f[I]skip\f[] loading of the
48
+ \f[I]Rails::Rack::LogTailer\f[]
49
+ middleware under Rails >= 2.3.x.
50
+ By default, unicorn_rails(1) will create a PID file in
51
+ \f[I]"RAILS_ROOT/tmp/pids/unicorn.pid"\f[]. You may override this
52
+ by specifying the "pid" directive to override this Unicorn config file.
53
+ .RS
54
+ .RE
55
+ .TP
56
+ .B \-E, \-\-env RAILS_ENV
57
+ Run under the given RAILS_ENV. This sets the RAILS_ENV environment
58
+ variable. Acceptable values are exactly those you expect in your Rails
59
+ application, typically "development" or "production".
60
+ .RS
61
+ .RE
62
+ .TP
63
+ .B \-l, \-\-listen ADDRESS
64
+ Listens on a given ADDRESS. ADDRESS may be in the form of
65
+ HOST:PORT or PATH, HOST:PORT is taken to mean a TCP socket
66
+ and PATH is meant to be a path to a UNIX domain socket.
67
+ Defaults to "0.0.0.0:8080" (all addresses on TCP port 8080).
68
+ For production deployments, specifying the "listen" directive in
69
+ CONFIG_FILE is recommended as it allows fine\-tuning of socket
70
+ options.
71
+ .RS
72
+ .RE
73
+ .SH RACKUP COMPATIBILITY OPTIONS
74
+ .TP
75
+ .B \-o, \-\-host HOST
76
+ Listen on a TCP socket belonging to HOST, default is
77
+ "0.0.0.0" (all addresses).
78
+ If specified multiple times on the command\-line, only the
79
+ last\-specified value takes effect.
80
+ This option only exists for compatibility with the rackup(1) command,
81
+ use of "\-l"/"\-\-listen" switch is recommended instead.
82
+ .RS
83
+ .RE
84
+ .TP
85
+ .B \-p, \-\-port PORT
86
+ Listen on the specified TCP PORT, default is 8080.
87
+ If specified multiple times on the command\-line, only the last\-specified
88
+ value takes effect.
89
+ This option only exists for compatibility with the rackup(1) command,
90
+ use of "\-l"/"\-\-listen" switch is recommended instead.
91
+ .RS
92
+ .RE
93
+ .TP
94
+ .B \-\-path PATH
95
+ Mounts the Rails application at the given PATH (instead of "/").
96
+ This is equivalent to setting the RAILS_RELATIVE_URL_ROOT
97
+ environment variable. This is only supported under Rails 2.3
98
+ or later at the moment.
99
+ .RS
100
+ .RE
101
+ .SH RUBY OPTIONS
102
+ .TP
103
+ .B \-e, \-\-eval LINE
104
+ Evaluate a LINE of Ruby code. This evaluation happens
105
+ immediately as the command\-line is being parsed.
106
+ .RS
107
+ .RE
108
+ .TP
109
+ .B \-d, \-\-debug
110
+ Turn on debug mode, the $DEBUG variable is set to true.
111
+ For Rails >= 2.3.x, this loads the \f[I]Rails::Rack::Debugger\f[]
112
+ middleware.
113
+ .RS
114
+ .RE
115
+ .TP
116
+ .B \-w, \-\-warn
117
+ Turn on verbose warnings, the $VERBOSE variable is set to true.
118
+ .RS
119
+ .RE
120
+ .TP
121
+ .B \-I, \-\-include PATH
122
+ specify $LOAD_PATH. PATH will be prepended to $LOAD_PATH.
123
+ The \[aq]:\[aq] character may be used to delimit multiple directories.
124
+ This directive may be used more than once. Modifications to
125
+ $LOAD_PATH take place immediately and in the order they were
126
+ specified on the command\-line.
127
+ .RS
128
+ .RE
129
+ .TP
130
+ .B \-r, \-\-require LIBRARY
131
+ require a specified LIBRARY before executing the application. The
132
+ "require" statement will be executed immediately and in the order
133
+ they were specified on the command\-line.
134
+ .RS
135
+ .RE
136
+ .SH RACKUP FILE
137
+ .PP
138
+ This defaults to "config.ru" in RAILS_ROOT. It should be the same
139
+ file used by rackup(1) and other Rack launchers, it uses the
140
+ \f[I]Rack::Builder\f[] DSL. Unlike many other Rack applications, RACKUP_FILE
141
+ is completely \f[I]optional\f[] for Rails, but may be used to disable
142
+ some of the default middleware for performance.
143
+ .PP
144
+ Embedded command\-line options are mostly parsed for compatibility
145
+ with rackup(1) but strongly discouraged.
146
+ .SH ENVIRONMENT VARIABLES
147
+ .PP
148
+ The RAILS_ENV variable is set by the aforementioned \-E switch. The
149
+ RAILS_RELATIVE_URL_ROOT is set by the aforementioned \-\-path switch.
150
+ Either of these variables may also be set in the shell or the Unicorn
151
+ CONFIG_FILE. All application or library\-specific environment variables
152
+ (e.g. TMPDIR, RAILS_ASSET_ID) may always be set in the Unicorn
153
+ CONFIG_FILE in addition to the spawning shell. When transparently
154
+ upgrading Unicorn, all environment variables set in the old master
155
+ process are inherited by the new master process. Unicorn only uses (and
156
+ will overwrite) the UNICORN_FD environment variable internally when
157
+ doing transparent upgrades.
158
+ .SH SIGNALS
159
+ .PP
160
+ The following UNIX signals may be sent to the master process:
161
+ .IP \[bu] 2
162
+ HUP \- reload config file, app, and gracefully restart all workers
163
+ .IP \[bu] 2
164
+ INT/TERM \- quick shutdown, kills all workers immediately
165
+ .IP \[bu] 2
166
+ QUIT \- graceful shutdown, waits for workers to finish their current
167
+ request before finishing.
168
+ .IP \[bu] 2
169
+ USR1 \- reopen all logs owned by the master and all workers
170
+ See Unicorn::Util.reopen_logs for what is considered a log.
171
+ .IP \[bu] 2
172
+ USR2 \- reexecute the running binary. A separate QUIT
173
+ should be sent to the original process once the child is verified to
174
+ be up and running.
175
+ .IP \[bu] 2
176
+ WINCH \- gracefully stops workers but keep the master running.
177
+ This will only work for daemonized processes.
178
+ .IP \[bu] 2
179
+ TTIN \- increment the number of worker processes by one
180
+ .IP \[bu] 2
181
+ TTOU \- decrement the number of worker processes by one
182
+ .PP
183
+ See the SIGNALS (https://yhbt.net/unicorn/SIGNALS.html) document for
184
+ full description of all signals used by Unicorn.
185
+ .SH SEE ALSO
186
+ .IP \[bu] 2
187
+ unicorn(1)
188
+ .IP \[bu] 2
189
+ \f[I]Rack::Builder\f[] ri/RDoc
190
+ .IP \[bu] 2
191
+ \f[I]Unicorn::Configurator\f[] ri/RDoc
192
+ .UR https://yhbt.net/unicorn/Unicorn/Configurator.html
193
+ .UE
194
+ .IP \[bu] 2
195
+ unicorn RDoc
196
+ .UR https://yhbt.net/unicorn/
197
+ .UE
198
+ .IP \[bu] 2
199
+ Rack RDoc
200
+ .UR https://www.rubydoc.info/github/rack/rack/
201
+ .UE
202
+ .IP \[bu] 2
203
+ Rackup HowTo
204
+ .UR https://github.com/rack/rack/wiki/(tutorial)-rackup-howto
205
+ .UE
206
+ .SH AUTHORS
207
+ The Unicorn Community <unicorn-public@yhbt.net>.
data/FAQ CHANGED
@@ -1,12 +1,21 @@
1
1
  = Frequently Asked Questions about Unicorn
2
2
 
3
- === I've installed Rack 1.1.x, why can't Unicorn load Rails (2.3.5)?
3
+ === Why is nginx getting ECONNRESET as a reverse proxy?
4
4
 
5
- Rails 2.3.5 is not compatible with Rack 1.1.x. Unicorn is compatible
6
- with both Rack 1.1.x and Rack 1.0.x, and RubyGems will load the latest
7
- version of Rack installed on the system. Uninstalling the Rack 1.1.x
8
- gem should solve gem loading issues with Rails 2.3.5. Rails 2.3.6
9
- and later correctly support Rack 1.1.x.
5
+ Request body data (commonly from POST and PUT requests) may not be
6
+ drained entirely by the application. This may happen when request
7
+ bodies are gzipped, as unicorn reads request body data lazily to avoid
8
+ overhead from bad requests.
9
+
10
+ Ref: https://yhbt.net/unicorn-public/FC91211E-FD32-432C-92FC-0318714C2170@zendesk.com/
11
+
12
+ === Why aren't my Rails log files rotated when I use SIGUSR1?
13
+
14
+ The Rails autoflush_log option must remain disabled with multiprocess
15
+ servers such as unicorn. Buffering in userspace may cause lines to be
16
+ partially written and lead to corruption in the presence of multiple
17
+ processes. With reasonable amounts of logging, the performance impact
18
+ of autoflush_log should be negligible on Linux and other modern kernels.
10
19
 
11
20
  === Why are my redirects going to "http" URLs when my site uses https?
12
21
 
@@ -51,3 +60,11 @@ queue makes failover to a different machine more difficult.
51
60
 
52
61
  See the TUNING and Unicorn::Configurator documents for more information
53
62
  on :backlog-related topics.
63
+
64
+ === I've installed Rack 1.1.x, why can't Unicorn load Rails (2.3.5)?
65
+
66
+ Rails 2.3.5 is not compatible with Rack 1.1.x. Unicorn is compatible
67
+ with both Rack 1.1.x and Rack 1.0.x, and RubyGems will load the latest
68
+ version of Rack installed on the system. Uninstalling the Rack 1.1.x
69
+ gem should solve gem loading issues with Rails 2.3.5. Rails 2.3.6
70
+ and later correctly support Rack 1.1.x.
data/GIT-VERSION-FILE CHANGED
@@ -1 +1 @@
1
- GIT_VERSION = 4.8.0
1
+ GIT_VERSION = 6.1.0
data/GIT-VERSION-GEN CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- DEF_VER = "v4.8.0"
2
+ DEF_VER = "v6.1.0"
3
3
  CONSTANT = "Unicorn::Const::UNICORN_VERSION"
4
4
  RVF = "lib/unicorn/version.rb"
5
5
  GVF = "GIT-VERSION-FILE"
data/GNUmakefile CHANGED
@@ -8,6 +8,9 @@ RUBY = ruby
8
8
  RAKE = rake
9
9
  RAGEL = ragel
10
10
  RSYNC = rsync
11
+ OLDDOC = olddoc
12
+ RDOC = rdoc
13
+ INSTALL = install
11
14
 
12
15
  GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
13
16
  @./GIT-VERSION-GEN
@@ -23,11 +26,38 @@ endif
23
26
 
24
27
  RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
25
28
 
26
- isolate_libs := tmp/isolate/$(RUBY_ENGINE)-$(RUBY_VERSION).mk
27
- $(isolate_libs): script/isolate_for_tests
28
- @$(RUBY) script/isolate_for_tests
29
- -include $(isolate_libs)
30
- MYLIBS = $(RUBYLIB):$(ISOLATE_LIBS)
29
+ # we should never package more than one ext to avoid DSO proliferation:
30
+ # https://udrepper.livejournal.com/8790.html
31
+ ext := $(firstword $(wildcard ext/*))
32
+
33
+ ragel: $(ext)/unicorn_http.c
34
+
35
+ rl_files := $(wildcard $(ext)/*.rl)
36
+ ragel: $(ext)/unicorn_http.c
37
+ $(ext)/unicorn_http.c: $(rl_files)
38
+ cd $(@D) && $(RAGEL) unicorn_http.rl -C $(RLFLAGS) -o $(@F)
39
+ ext_pfx := test/$(RUBY_ENGINE)-$(RUBY_VERSION)
40
+ tmp_bin := $(ext_pfx)/bin
41
+ ext_h := $(wildcard $(ext)/*/*.h $(ext)/*.h)
42
+ ext_src := $(sort $(wildcard $(ext)/*.c) $(ext_h) $(ext)/unicorn_http.c)
43
+ ext_pfx_src := $(addprefix $(ext_pfx)/,$(ext_src))
44
+ ext_dir := $(ext_pfx)/$(ext)
45
+ $(ext)/extconf.rb:
46
+ @>>$@
47
+ $(ext_dir) $(tmp_bin) man/man1 doc/man1 pkg t/trash:
48
+ @mkdir -p $@
49
+ $(ext_pfx)/$(ext)/%: $(ext)/% | $(ext_dir)
50
+ $(INSTALL) -m 644 $< $@
51
+ $(ext_pfx)/$(ext)/Makefile: $(ext)/extconf.rb | $(ext_dir)
52
+ $(RM) -f $(@D)/*.o
53
+ cd $(@D) && $(RUBY) $(CURDIR)/$(ext)/extconf.rb $(EXTCONF_ARGS)
54
+ ext_sfx := _ext.$(DLEXT)
55
+ ext_dl := $(ext_pfx)/$(ext)/$(notdir $(ext)_ext.$(DLEXT))
56
+ $(ext_dl): $(ext_src) $(ext_pfx_src) $(ext_pfx)/$(ext)/Makefile
57
+ $(MAKE) -C $(@D)
58
+ lib := $(CURDIR)/lib:$(CURDIR)/$(ext_pfx)/$(ext)
59
+ http build: $(ext_dl)
60
+ $(ext_pfx)/$(ext)/unicorn_http.c: ext/unicorn_http/unicorn_http.c
31
61
 
32
62
  # dunno how to implement this as concisely in Ruby, and hell, I love awk
33
63
  awk_slow := awk '/def test_/{print FILENAME"--"$$2".n"}' 2>/dev/null
@@ -39,43 +69,21 @@ T := $(filter-out $(slow_tests), $(wildcard test/*/test*.rb))
39
69
  T_n := $(shell $(awk_slow) $(slow_tests))
40
70
  T_log := $(subst .rb,$(log_suffix),$(T))
41
71
  T_n_log := $(subst .n,$(log_suffix),$(T_n))
42
- test_prefix = $(CURDIR)/test/$(RUBY_ENGINE)-$(RUBY_VERSION)
43
72
 
44
- ext := ext/unicorn_http
45
- c_files := $(ext)/unicorn_http.c $(ext)/httpdate.c $(wildcard $(ext)/*.h)
46
- rl_files := $(wildcard $(ext)/*.rl)
47
73
  base_bins := unicorn unicorn_rails
48
74
  bins := $(addprefix bin/, $(base_bins))
49
75
  man1_rdoc := $(addsuffix _1, $(base_bins))
50
76
  man1_bins := $(addsuffix .1, $(base_bins))
51
77
  man1_paths := $(addprefix man/man1/, $(man1_bins))
52
- rb_files := $(bins) $(shell find lib ext -type f -name '*.rb')
53
- inst_deps := $(c_files) $(rb_files) GNUmakefile test/test_helper.rb
78
+ tmp_bins = $(addprefix $(tmp_bin)/, unicorn unicorn_rails)
79
+ pid := $(shell echo $$PPID)
54
80
 
55
- ragel: $(ext)/unicorn_http.c
56
- $(ext)/unicorn_http.c: $(rl_files)
57
- cd $(@D) && $(RAGEL) unicorn_http.rl -C $(RLFLAGS) -o $(@F)
58
- $(ext)/Makefile: $(ext)/extconf.rb $(c_files)
59
- cd $(@D) && $(RUBY) extconf.rb
60
- $(ext)/unicorn_http.$(DLEXT): $(ext)/Makefile
61
- $(MAKE) -C $(@D)
62
- lib/unicorn_http.$(DLEXT): $(ext)/unicorn_http.$(DLEXT)
63
- @mkdir -p lib
64
- install -m644 $< $@
65
- http: lib/unicorn_http.$(DLEXT)
66
-
67
- test-install: $(test_prefix)/.stamp
68
- $(test_prefix)/.stamp: $(inst_deps)
69
- mkdir -p $(test_prefix)/.ccache
70
- tar cf - $(inst_deps) GIT-VERSION-GEN | \
71
- (cd $(test_prefix) && tar xf -)
72
- $(MAKE) -C $(test_prefix) clean
73
- $(MAKE) -C $(test_prefix) http shebang RUBY="$(RUBY)"
74
- > $@
75
-
76
- # this is only intended to be run within $(test_prefix)
77
- shebang: $(bins)
78
- $(MRI) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $^
81
+ $(tmp_bin)/%: bin/% | $(tmp_bin)
82
+ $(INSTALL) -m 755 $< $@.$(pid)
83
+ $(MRI) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $@.$(pid)
84
+ mv $@.$(pid) $@
85
+
86
+ bins: $(tmp_bins)
79
87
 
80
88
  t_log := $(T_log) $(T_n_log)
81
89
  test: $(T) $(T_n)
@@ -84,13 +92,56 @@ test: $(T) $(T_n)
84
92
 
85
93
  test-exec: $(wildcard test/exec/test_*.rb)
86
94
  test-unit: $(wildcard test/unit/test_*.rb)
87
- $(slow_tests): $(test_prefix)/.stamp
95
+ $(slow_tests): $(ext_dl)
88
96
  @$(MAKE) $(shell $(awk_slow) $@)
89
97
 
90
- test-integration: $(test_prefix)/.stamp
91
- $(MAKE) -C t
98
+ # ensure we can require just the HTTP parser without the rest of unicorn
99
+ test-require: $(ext_dl)
100
+ $(RUBY) --disable-gems -I$(ext_pfx)/$(ext) -runicorn_http -e Unicorn
101
+
102
+ test_prereq := $(tmp_bins) $(ext_dl)
103
+
104
+ SH_TEST_OPTS =
105
+ ifdef V
106
+ ifeq ($(V),2)
107
+ SH_TEST_OPTS += --trace
108
+ else
109
+ SH_TEST_OPTS += --verbose
110
+ endif
111
+ endif
92
112
 
93
- check: test test-integration
113
+ # do we trust Ruby behavior to be stable? some tests are
114
+ # (mostly) POSIX sh (not bash or ksh93, so no "set -o pipefail"
115
+ # TRACER = strace -f -o $(t_pfx).strace -s 100000
116
+ # TRACER = /usr/bin/time -o $(t_pfx).time
117
+ t_pfx = trash/$@-$(RUBY_ENGINE)-$(RUBY_VERSION)
118
+ T_sh = $(wildcard t/t[0-9][0-9][0-9][0-9]-*.sh)
119
+ $(T_sh): export RUBY := $(RUBY)
120
+ $(T_sh): export PATH := $(CURDIR)/$(tmp_bin):$(PATH)
121
+ $(T_sh): export RUBYLIB := $(lib):$(RUBYLIB)
122
+ $(T_sh): dep $(test_prereq) t/random_blob t/trash/.gitignore
123
+ cd t && $(TRACER) $(SHELL) $(SH_TEST_OPTS) $(@F) $(TEST_OPTS)
124
+
125
+ t/trash/.gitignore : | t/trash
126
+ echo '*' >$@
127
+
128
+ dependencies := socat curl
129
+ deps := $(addprefix t/.dep+,$(dependencies))
130
+ $(deps): dep_bin = $(lastword $(subst +, ,$@))
131
+ $(deps):
132
+ @which $(dep_bin) > $@.$(pid) 2>/dev/null || :
133
+ @test -s $@.$(pid) || \
134
+ { echo >&2 "E '$(dep_bin)' not found in PATH=$(PATH)"; exit 1; }
135
+ @mv $@.$(pid) $@
136
+ dep: $(deps)
137
+
138
+ t/random_blob:
139
+ dd if=/dev/urandom bs=1M count=30 of=$@.$(pid)
140
+ mv $@.$(pid) $@
141
+
142
+ test-integration: $(T_sh)
143
+
144
+ check: test-require test test-integration
94
145
  test-all: check
95
146
 
96
147
  TEST_OPTS = -v
@@ -119,21 +170,20 @@ run_test = $(quiet_pre) \
119
170
 
120
171
  %.n: arg = $(subst .n,,$(subst --, -n ,$@))
121
172
  %.n: t = $(subst .n,$(log_suffix),$@)
122
- %.n: export PATH := $(test_prefix)/bin:$(PATH)
123
- %.n: export RUBYLIB := $(test_prefix):$(test_prefix)/lib:$(MYLIBS)
124
- %.n: $(test_prefix)/.stamp
173
+ %.n: export PATH := $(CURDIR)/$(tmp_bin):$(PATH)
174
+ %.n: export RUBYLIB := $(lib):$(RUBYLIB)
175
+ %.n: $(test_prereq)
125
176
  $(run_test)
126
177
 
127
178
  $(T): arg = $@
128
179
  $(T): t = $(subst .rb,$(log_suffix),$@)
129
- $(T): export PATH := $(test_prefix)/bin:$(PATH)
130
- $(T): export RUBYLIB := $(test_prefix):$(test_prefix)/lib:$(MYLIBS)
131
- $(T): $(test_prefix)/.stamp
180
+ $(T): export PATH := $(CURDIR)/$(tmp_bin):$(PATH)
181
+ $(T): export RUBYLIB := $(lib):$(RUBYLIB)
182
+ $(T): $(test_prereq)
132
183
  $(run_test)
133
184
 
134
185
  install: $(bins) $(ext)/unicorn_http.c
135
186
  $(prep_setup_rb)
136
- $(RM) lib/unicorn_http.$(DLEXT)
137
187
  $(RM) -r .install-tmp
138
188
  mkdir .install-tmp
139
189
  cp -p bin/* .install-tmp
@@ -148,71 +198,68 @@ prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
148
198
 
149
199
  clean:
150
200
  -$(MAKE) -C $(ext) clean
151
- -$(MAKE) -C Documentation clean
152
- $(RM) $(ext)/Makefile lib/unicorn_http.$(DLEXT)
201
+ $(RM) $(ext)/Makefile
153
202
  $(RM) $(setup_rb_files) $(t_log)
154
- $(RM) -r $(test_prefix) man
203
+ $(RM) -r $(ext_pfx) man t/trash
204
+ $(RM) $(html1)
205
+
206
+ man1 := $(addprefix Documentation/, unicorn.1 unicorn_rails.1)
207
+ html1 := $(addsuffix .html, $(man1))
208
+ man : $(man1) | man/man1
209
+ $(INSTALL) -m 644 $(man1) man/man1
210
+
211
+ html : $(html1) | doc/man1
212
+ $(INSTALL) -m 644 $(html1) doc/man1
155
213
 
156
- man html:
157
- $(MAKE) -C Documentation install-$@
214
+ %.1.html: %.1
215
+ $(OLDDOC) man2html -o $@ ./$<
158
216
 
159
- pkg_extra := GIT-VERSION-FILE lib/unicorn/version.rb ChangeLog LATEST NEWS \
217
+ pkg_extra := GIT-VERSION-FILE lib/unicorn/version.rb LATEST NEWS \
160
218
  $(ext)/unicorn_http.c $(man1_paths)
161
219
 
162
- ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
163
- wrongdoc prepare
220
+ NEWS:
221
+ $(OLDDOC) prepare
164
222
 
165
- .manifest: ChangeLog $(ext)/unicorn_http.c man
223
+ .manifest: $(ext)/unicorn_http.c man NEWS
166
224
  (git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
167
225
  LC_ALL=C sort > $@+
168
226
  cmp $@+ $@ || mv $@+ $@
169
227
  $(RM) $@+
170
228
 
171
- doc: .document $(ext)/unicorn_http.c man html .wrongdoc.yml
172
- for i in $(man1_rdoc); do echo > $$i; done
229
+ PLACEHOLDERS = $(man1_rdoc)
230
+ doc: .document $(ext)/unicorn_http.c man html .olddoc.yml $(PLACEHOLDERS)
173
231
  find bin lib -type f -name '*.rbc' -exec rm -f '{}' ';'
174
232
  $(RM) -r doc
175
- wrongdoc all
176
- install -m644 COPYING doc/COPYING
177
- install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
178
- install -m644 $(man1_paths) doc/
233
+ $(OLDDOC) prepare
234
+ $(RDOC) -f dark216
235
+ $(OLDDOC) merge
236
+ $(INSTALL) -m 644 COPYING doc/COPYING
237
+ $(INSTALL) -m 644 NEWS.atom.xml doc/NEWS.atom.xml
238
+ $(INSTALL) -m 644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
239
+ $(INSTALL) -m 644 $(man1_paths) doc/
179
240
  tar cf - $$(git ls-files examples/) | (cd doc && tar xf -)
180
- $(RM) $(man1_rdoc)
181
241
 
182
- # publishes docs to http://unicorn.bogomips.org
242
+ # publishes docs to https://yhbt.net/unicorn/
183
243
  publish_doc:
184
244
  -git set-file-times
185
245
  $(MAKE) doc
186
- find doc/images -type f | \
187
- TZ=UTC xargs touch -d '1970-01-01 00:00:02' doc/rdoc.css
188
246
  $(MAKE) doc_gz
189
247
  chmod 644 $$(find doc -type f)
190
- $(RSYNC) -av doc/ unicorn.bogomips.org:/srv/unicorn/
248
+ $(RSYNC) -av doc/ yhbt.net:/srv/yhbt/unicorn/ \
249
+ --exclude index.html* --exclude created.rid*
191
250
  git ls-files | xargs touch
192
251
 
193
252
  # Create gzip variants of the same timestamp as the original so nginx
194
253
  # "gzip_static on" can serve the gzipped versions directly.
195
- doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
254
+ doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.gz$$')
196
255
  doc_gz:
197
256
  for i in $(docs); do \
198
257
  gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
199
258
 
200
259
  ifneq ($(VERSION),)
201
- rfproject := mongrel
202
260
  rfpackage := unicorn
203
261
  pkggem := pkg/$(rfpackage)-$(VERSION).gem
204
262
  pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
205
- release_notes := release_notes-$(VERSION)
206
- release_changes := release_changes-$(VERSION)
207
-
208
- release-notes: $(release_notes)
209
- release-changes: $(release_changes)
210
- $(release_changes):
211
- wrongdoc release_changes > $@+
212
- $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
213
- $(release_notes):
214
- wrongdoc release_notes > $@+
215
- $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
216
263
 
217
264
  # ensures we're actually on the tagged $(VERSION), only used for release
218
265
  verify:
@@ -229,11 +276,10 @@ fix-perms:
229
276
  gem: $(pkggem)
230
277
 
231
278
  install-gem: $(pkggem)
232
- gem install $(CURDIR)/$<
279
+ gem install --local $(CURDIR)/$<
233
280
 
234
- $(pkggem): .manifest fix-perms
281
+ $(pkggem): .manifest fix-perms | pkg
235
282
  gem build $(rfpackage).gemspec
236
- mkdir -p pkg
237
283
  mv $(@F) $@
238
284
 
239
285
  $(pkgtgz): distdir = $(basename $@)
@@ -248,20 +294,20 @@ $(pkgtgz): .manifest fix-perms
248
294
 
249
295
  package: $(pkgtgz) $(pkggem)
250
296
 
251
- release: verify package $(release_notes) $(release_changes)
252
- # make tgz release on RubyForge
253
- rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
254
- $(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
297
+ release: verify package
255
298
  # push gem to Gemcutter
256
299
  gem push $(pkggem)
257
- # in case of gem downloads from RubyForge releases page
258
- -rubyforge add_file \
259
- $(rfproject) $(rfpackage) $(VERSION) $(pkggem)
260
- $(RAKE) fm_update VERSION=$(VERSION)
261
300
  else
262
301
  gem install-gem: GIT-VERSION-FILE
263
302
  $(MAKE) $@ VERSION=$(GIT_VERSION)
264
303
  endif
265
304
 
266
- .PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) man
267
- .PHONY: test-install
305
+ $(PLACEHOLDERS):
306
+ echo olddoc_placeholder > $@
307
+
308
+ check-warnings:
309
+ @(for i in $$(git ls-files '*.rb' bin | grep -v '^setup\.rb$$'); \
310
+ do $(RUBY) --disable-gems -d -W2 -c \
311
+ $$i; done) | grep -v '^Syntax OK$$' || :
312
+
313
+ .PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) man $(T_sh) clean
data/HACKING CHANGED
@@ -19,13 +19,6 @@ RubyGems.
19
19
  Users of GNU-based systems (such as GNU/Linux) usually have GNU make
20
20
  installed as "make" instead of "gmake".
21
21
 
22
- Since we don't load RubyGems by default, loading Rack properly requires
23
- setting up RUBYLIB to point to where Rack is located. Not loading
24
- RubyGems drastically lowers the time to run the full test suite. You
25
- may setup a "local.mk" file in the top-level working directory to setup
26
- your RUBYLIB and any other environment variables. A "local.mk.sample"
27
- file is provided for reference.
28
-
29
22
  Running the entire test suite with 4 tests in parallel:
30
23
 
31
24
  gmake -j4 check
@@ -57,24 +50,19 @@ programming experience will come in handy (or be learned) here.
57
50
 
58
51
  === Documentation
59
52
 
60
- We use RDoc 2.5.x with Darkfish for documentation as much as possible,
61
- if you're on Ruby 1.8 you want to install the latest "rdoc" gem. Due to
62
- the lack of RDoc-to-manpage converters we know about, we're writing
63
- manpages in Markdown and converting to troff/HTML with Pandoc.
64
-
65
53
  Please wrap documentation at 72 characters-per-line or less (long URLs
66
54
  are exempt) so it is comfortably readable from terminals.
67
55
 
68
56
  When referencing mailing list posts, use
69
- "http://mid.gmane.org/$MESSAGE_ID" if possible since the Message-ID
70
- remains searchable even if Gmane becomes unavailable.
57
+ <tt>https://yhbt.net/unicorn-public/$MESSAGE_ID/</tt> if possible
58
+ since the Message-ID remains searchable even if a particular site
59
+ becomes unavailable.
71
60
 
72
61
  === Ruby/C Compatibility
73
62
 
74
- We target Ruby 1.8.6+, 1.9 and will target Rubinius as it becomes
75
- production-ready. We need the Ruby implementation to support fork,
76
- exec, pipe, UNIX signals, access to integer file descriptors and
77
- ability to use unlinked files.
63
+ We target C Ruby 2.0 and later. We need the Ruby
64
+ implementation to support fork, exec, pipe, UNIX signals, access to
65
+ integer file descriptors and ability to use unlinked files.
78
66
 
79
67
  All of our C code is OS-independent and should run on compilers
80
68
  supported by the versions of Ruby we target.
@@ -103,17 +91,14 @@ preferred because they allow code review and comments in the reply to
103
91
  the patch.
104
92
 
105
93
  We will adhere to mostly the same conventions for patch submissions as
106
- git itself. See the Documentation/SubmittingPatches document
94
+ git itself. See the
95
+ {SubmittingPatches}[https://git.kernel.org/cgit/git/git.git/tree/Documentation/SubmittingPatches]
96
+ document
107
97
  distributed with git on on patch submission guidelines to follow. Just
108
98
  don't email the git mailing list or maintainer with Unicorn patches :)
109
99
 
110
100
  == Building a Gem
111
101
 
112
- In order to build the gem, you must install the following components:
113
-
114
- * wrongdoc
115
- * pandoc
116
-
117
102
  You can build the Unicorn gem with the following command:
118
103
 
119
104
  gmake gem
@@ -122,13 +107,6 @@ You can build the Unicorn gem with the following command:
122
107
 
123
108
  It is easy to install the contents of your git working directory:
124
109
 
125
- Via RubyGems (RubyGems 1.3.5+ recommended for prerelease versions):
110
+ Via RubyGems
126
111
 
127
112
  gmake install-gem
128
-
129
- Without RubyGems (via setup.rb):
130
-
131
- gmake install
132
-
133
- It is not at all recommended to mix a RubyGems installation with an
134
- installation done without RubyGems, however.