boourns-unicorn 4.4.1

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 (155) hide show
  1. data/.CHANGELOG.old +25 -0
  2. data/.document +29 -0
  3. data/.gitignore +24 -0
  4. data/.mailmap +26 -0
  5. data/.wrongdoc.yml +10 -0
  6. data/Application_Timeouts +77 -0
  7. data/CONTRIBUTORS +35 -0
  8. data/COPYING +674 -0
  9. data/DESIGN +97 -0
  10. data/Documentation/.gitignore +5 -0
  11. data/Documentation/GNUmakefile +30 -0
  12. data/Documentation/unicorn.1.txt +174 -0
  13. data/Documentation/unicorn_rails.1.txt +175 -0
  14. data/FAQ +53 -0
  15. data/GIT-VERSION-GEN +40 -0
  16. data/GNUmakefile +267 -0
  17. data/HACKING +134 -0
  18. data/ISSUES +36 -0
  19. data/KNOWN_ISSUES +79 -0
  20. data/LICENSE +64 -0
  21. data/Links +56 -0
  22. data/PHILOSOPHY +145 -0
  23. data/README +149 -0
  24. data/Rakefile +97 -0
  25. data/SIGNALS +114 -0
  26. data/Sandbox +96 -0
  27. data/TODO +5 -0
  28. data/TUNING +98 -0
  29. data/bin/unicorn +121 -0
  30. data/bin/unicorn_rails +209 -0
  31. data/examples/big_app_gc.rb +2 -0
  32. data/examples/echo.ru +27 -0
  33. data/examples/git.ru +13 -0
  34. data/examples/init.sh +74 -0
  35. data/examples/logger_mp_safe.rb +25 -0
  36. data/examples/logrotate.conf +29 -0
  37. data/examples/nginx.conf +156 -0
  38. data/examples/unicorn.conf.minimal.rb +13 -0
  39. data/examples/unicorn.conf.rb +94 -0
  40. data/ext/unicorn_http/CFLAGS +13 -0
  41. data/ext/unicorn_http/c_util.h +124 -0
  42. data/ext/unicorn_http/common_field_optimization.h +111 -0
  43. data/ext/unicorn_http/ext_help.h +86 -0
  44. data/ext/unicorn_http/extconf.rb +10 -0
  45. data/ext/unicorn_http/global_variables.h +97 -0
  46. data/ext/unicorn_http/httpdate.c +82 -0
  47. data/ext/unicorn_http/unicorn_http.rl +1036 -0
  48. data/ext/unicorn_http/unicorn_http_common.rl +76 -0
  49. data/lib/unicorn.rb +107 -0
  50. data/lib/unicorn/app/exec_cgi.rb +154 -0
  51. data/lib/unicorn/app/inetd.rb +109 -0
  52. data/lib/unicorn/app/old_rails.rb +35 -0
  53. data/lib/unicorn/app/old_rails/static.rb +59 -0
  54. data/lib/unicorn/cgi_wrapper.rb +147 -0
  55. data/lib/unicorn/configurator.rb +630 -0
  56. data/lib/unicorn/const.rb +40 -0
  57. data/lib/unicorn/http_request.rb +83 -0
  58. data/lib/unicorn/http_response.rb +45 -0
  59. data/lib/unicorn/http_server.rb +755 -0
  60. data/lib/unicorn/launcher.rb +62 -0
  61. data/lib/unicorn/oob_gc.rb +71 -0
  62. data/lib/unicorn/preread_input.rb +33 -0
  63. data/lib/unicorn/socket_helper.rb +208 -0
  64. data/lib/unicorn/ssl_client.rb +11 -0
  65. data/lib/unicorn/ssl_configurator.rb +104 -0
  66. data/lib/unicorn/ssl_server.rb +42 -0
  67. data/lib/unicorn/stream_input.rb +149 -0
  68. data/lib/unicorn/tee_input.rb +126 -0
  69. data/lib/unicorn/tmpio.rb +29 -0
  70. data/lib/unicorn/util.rb +69 -0
  71. data/lib/unicorn/worker.rb +88 -0
  72. data/local.mk.sample +59 -0
  73. data/script/isolate_for_tests +32 -0
  74. data/setup.rb +1586 -0
  75. data/t/.gitignore +5 -0
  76. data/t/GNUmakefile +82 -0
  77. data/t/README +42 -0
  78. data/t/bin/content-md5-put +36 -0
  79. data/t/bin/sha1sum.rb +17 -0
  80. data/t/bin/unused_listen +40 -0
  81. data/t/bin/utee +12 -0
  82. data/t/broken-app.ru +12 -0
  83. data/t/detach.ru +11 -0
  84. data/t/env.ru +3 -0
  85. data/t/heartbeat-timeout.ru +12 -0
  86. data/t/listener_names.ru +4 -0
  87. data/t/my-tap-lib.sh +201 -0
  88. data/t/oob_gc.ru +21 -0
  89. data/t/oob_gc_path.ru +21 -0
  90. data/t/pid.ru +3 -0
  91. data/t/preread_input.ru +17 -0
  92. data/t/rack-input-tests.ru +21 -0
  93. data/t/sslgen.sh +71 -0
  94. data/t/t0000-http-basic.sh +50 -0
  95. data/t/t0001-reload-bad-config.sh +53 -0
  96. data/t/t0002-config-conflict.sh +49 -0
  97. data/t/t0002-parser-error.sh +94 -0
  98. data/t/t0003-working_directory.sh +51 -0
  99. data/t/t0004-heartbeat-timeout.sh +69 -0
  100. data/t/t0004-working_directory_broken.sh +24 -0
  101. data/t/t0005-working_directory_app.rb.sh +37 -0
  102. data/t/t0006-reopen-logs.sh +83 -0
  103. data/t/t0006.ru +13 -0
  104. data/t/t0007-working_directory_no_embed_cli.sh +44 -0
  105. data/t/t0008-back_out_of_upgrade.sh +110 -0
  106. data/t/t0009-broken-app.sh +56 -0
  107. data/t/t0009-winch_ttin.sh +59 -0
  108. data/t/t0010-reap-logging.sh +55 -0
  109. data/t/t0011-active-unix-socket.sh +79 -0
  110. data/t/t0012-reload-empty-config.sh +85 -0
  111. data/t/t0013-rewindable-input-false.sh +24 -0
  112. data/t/t0013.ru +12 -0
  113. data/t/t0014-rewindable-input-true.sh +24 -0
  114. data/t/t0014.ru +12 -0
  115. data/t/t0015-configurator-internals.sh +25 -0
  116. data/t/t0016-trust-x-forwarded-false.sh +30 -0
  117. data/t/t0017-trust-x-forwarded-true.sh +30 -0
  118. data/t/t0018-write-on-close.sh +23 -0
  119. data/t/t0019-max_header_len.sh +49 -0
  120. data/t/t0020-at_exit-handler.sh +49 -0
  121. data/t/t0021-process_detach.sh +29 -0
  122. data/t/t0022-listener_names-preload_app.sh +32 -0
  123. data/t/t0100-rack-input-tests.sh +124 -0
  124. data/t/t0116-client_body_buffer_size.sh +80 -0
  125. data/t/t0116.ru +16 -0
  126. data/t/t0600-https-server-basic.sh +48 -0
  127. data/t/t9000-preread-input.sh +48 -0
  128. data/t/t9001-oob_gc.sh +47 -0
  129. data/t/t9002-oob_gc-path.sh +75 -0
  130. data/t/test-lib.sh +113 -0
  131. data/t/write-on-close.ru +11 -0
  132. data/test/aggregate.rb +15 -0
  133. data/test/benchmark/README +50 -0
  134. data/test/benchmark/dd.ru +18 -0
  135. data/test/benchmark/stack.ru +8 -0
  136. data/test/exec/README +5 -0
  137. data/test/exec/test_exec.rb +1041 -0
  138. data/test/test_helper.rb +300 -0
  139. data/test/unit/test_configurator.rb +158 -0
  140. data/test/unit/test_droplet.rb +28 -0
  141. data/test/unit/test_http_parser.rb +860 -0
  142. data/test/unit/test_http_parser_ng.rb +716 -0
  143. data/test/unit/test_http_parser_xftrust.rb +38 -0
  144. data/test/unit/test_request.rb +197 -0
  145. data/test/unit/test_response.rb +99 -0
  146. data/test/unit/test_server.rb +289 -0
  147. data/test/unit/test_signals.rb +207 -0
  148. data/test/unit/test_sni_hostnames.rb +47 -0
  149. data/test/unit/test_socket_helper.rb +192 -0
  150. data/test/unit/test_stream_input.rb +204 -0
  151. data/test/unit/test_tee_input.rb +296 -0
  152. data/test/unit/test_upload.rb +306 -0
  153. data/test/unit/test_util.rb +99 -0
  154. data/unicorn.gemspec +44 -0
  155. metadata +333 -0
data/bin/unicorn_rails ADDED
@@ -0,0 +1,209 @@
1
+ #!/this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby
2
+ # -*- encoding: binary -*-
3
+ require 'unicorn/launcher'
4
+ require 'optparse'
5
+ require 'fileutils'
6
+
7
+ ENV['RAILS_ENV'] ||= "development"
8
+ rackup_opts = Unicorn::Configurator::RACKUP
9
+ options = rackup_opts[:options]
10
+
11
+ op = OptionParser.new("", 24, ' ') do |opts|
12
+ cmd = File.basename($0)
13
+ opts.banner = "Usage: #{cmd} " \
14
+ "[ruby options] [#{cmd} options] [rackup config file]"
15
+ opts.separator "Ruby options:"
16
+
17
+ lineno = 1
18
+ opts.on("-e", "--eval LINE", "evaluate a LINE of code") do |line|
19
+ eval line, TOPLEVEL_BINDING, "-e", lineno
20
+ lineno += 1
21
+ end
22
+
23
+ opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") do
24
+ $DEBUG = true
25
+ end
26
+
27
+ opts.on("-w", "--warn", "turn warnings on for your script") do
28
+ $-w = true
29
+ end
30
+
31
+ opts.on("-I", "--include PATH",
32
+ "specify $LOAD_PATH (may be used more than once)") do |path|
33
+ $LOAD_PATH.unshift(*path.split(/:/))
34
+ end
35
+
36
+ opts.on("-r", "--require LIBRARY",
37
+ "require the library, before executing your script") do |library|
38
+ require library
39
+ end
40
+
41
+ opts.separator "#{cmd} options:"
42
+
43
+ # some of these switches exist for rackup command-line compatibility,
44
+
45
+ opts.on("-o", "--host HOST",
46
+ "listen on HOST (default: #{Unicorn::Const::DEFAULT_HOST})") do |h|
47
+ rackup_opts[:host] = h
48
+ rackup_opts[:set_listener] = true
49
+ end
50
+
51
+ opts.on("-p", "--port PORT",
52
+ "use PORT (default: #{Unicorn::Const::DEFAULT_PORT})") do |p|
53
+ rackup_opts[:port] = p.to_i
54
+ rackup_opts[:set_listener] = true
55
+ end
56
+
57
+ opts.on("-E", "--env RAILS_ENV",
58
+ "use RAILS_ENV for defaults (default: development)") do |e|
59
+ ENV['RAILS_ENV'] = e
60
+ end
61
+
62
+ opts.on("-D", "--daemonize", "run daemonized in the background") do |d|
63
+ rackup_opts[:daemonize] = !!d
64
+ end
65
+
66
+ # Unicorn-specific stuff
67
+ opts.on("-l", "--listen {HOST:PORT|PATH}",
68
+ "listen on HOST:PORT or PATH",
69
+ "this may be specified multiple times",
70
+ "(default: #{Unicorn::Const::DEFAULT_LISTEN})") do |address|
71
+ options[:listeners] << address
72
+ end
73
+
74
+ opts.on("-c", "--config-file FILE", "Unicorn-specific config file") do |f|
75
+ options[:config_file] = f
76
+ end
77
+
78
+ opts.on("-P PATH", "DEPRECATED") do |v|
79
+ warn %q{Use of -P is ambiguous and discouraged}
80
+ warn %q{Use --path or RAILS_RELATIVE_URL_ROOT instead}
81
+ ENV['RAILS_RELATIVE_URL_ROOT'] = v
82
+ end
83
+
84
+ opts.on("--path PATH", "Runs Rails app mounted at a specific path.",
85
+ "(default: /)") do |v|
86
+ ENV['RAILS_RELATIVE_URL_ROOT'] = v
87
+ end
88
+
89
+ # I'm avoiding Unicorn-specific config options on the command-line.
90
+ # IMNSHO, config options on the command-line are redundant given
91
+ # config files and make things unnecessarily complicated with multiple
92
+ # places to look for a config option.
93
+
94
+ opts.separator "Common options:"
95
+
96
+ opts.on_tail("-h", "--help", "Show this message") do
97
+ puts opts.to_s.gsub(/^.*DEPRECATED.*$/s, '')
98
+ exit
99
+ end
100
+
101
+ opts.on_tail("-v", "--version", "Show version") do
102
+ puts "#{cmd} v#{Unicorn::Const::UNICORN_VERSION}"
103
+ exit
104
+ end
105
+
106
+ opts.parse! ARGV
107
+ end
108
+
109
+ def rails_dispatcher
110
+ if ::Rails::VERSION::MAJOR >= 3 && ::File.exist?('config/application.rb')
111
+ if ::File.read('config/application.rb') =~ /^module\s+([\w:]+)\s*$/
112
+ app_module = Object.const_get($1)
113
+ begin
114
+ result = app_module::Application
115
+ rescue NameError
116
+ end
117
+ end
118
+ end
119
+
120
+ if result.nil? && defined?(ActionController::Dispatcher)
121
+ result = ActionController::Dispatcher.new
122
+ end
123
+
124
+ result || abort("Unable to locate the application dispatcher class")
125
+ end
126
+
127
+ def rails_builder(ru, op, daemonize)
128
+ return Unicorn.builder(ru, op) if ru
129
+
130
+ # allow Configurator to parse cli switches embedded in the ru file
131
+ Unicorn::Configurator::RACKUP.update(:file => :rails, :optparse => op)
132
+
133
+ # this lambda won't run until after forking if preload_app is false
134
+ # this runs after config file reloading
135
+ lambda do ||
136
+ # Rails 3 includes a config.ru, use it if we find it after
137
+ # working_directory is bound.
138
+ ::File.exist?('config.ru') and
139
+ return Unicorn.builder('config.ru', op).call
140
+
141
+ # Load Rails and (possibly) the private version of Rack it bundles.
142
+ begin
143
+ require ::File.expand_path('config/boot')
144
+ require ::File.expand_path('config/environment')
145
+ rescue LoadError => err
146
+ abort "#$0 must be run inside RAILS_ROOT: #{err.inspect}"
147
+ end
148
+
149
+ defined?(::Rails::VERSION::STRING) or
150
+ abort "Rails::VERSION::STRING not defined by config/{boot,environment}"
151
+ # it seems Rails >=2.2 support Rack, but only >=2.3 requires it
152
+ old_rails = case ::Rails::VERSION::MAJOR
153
+ when 0, 1 then true
154
+ when 2 then Rails::VERSION::MINOR < 3 ? true : false
155
+ else
156
+ false
157
+ end
158
+
159
+ Rack::Builder.new do
160
+ map_path = ENV['RAILS_RELATIVE_URL_ROOT'] || '/'
161
+ if old_rails
162
+ if map_path != '/'
163
+ # patches + tests welcome, but I really cbf to deal with this
164
+ # since all apps I've ever dealt with just use "/" ...
165
+ warn "relative URL roots may not work for older Rails"
166
+ end
167
+ warn "LogTailer not available for Rails < 2.3" unless daemonize
168
+ warn "Debugger not available" if $DEBUG
169
+ require 'unicorn/app/old_rails'
170
+ map(map_path) do
171
+ use Unicorn::App::OldRails::Static
172
+ run Unicorn::App::OldRails.new
173
+ end
174
+ else
175
+ use Rails::Rack::LogTailer unless daemonize
176
+ use Rails::Rack::Debugger if $DEBUG
177
+ map(map_path) do
178
+ unless defined?(ActionDispatch::Static)
179
+ use Rails::Rack::Static
180
+ end
181
+ run rails_dispatcher
182
+ end
183
+ end
184
+ end.to_app
185
+ end
186
+ end
187
+
188
+ app = rails_builder(ARGV[0], op, rackup_opts[:daemonize])
189
+ op = nil
190
+
191
+ if $DEBUG
192
+ require 'pp'
193
+ pp({
194
+ :unicorn_options => options,
195
+ :app => app,
196
+ :daemonize => rackup_opts[:daemonize],
197
+ })
198
+ end
199
+
200
+ # ensure Rails standard tmp paths exist
201
+ options[:after_reload] = lambda do
202
+ FileUtils.mkdir_p(%w(cache pids sessions sockets).map! { |d| "tmp/#{d}" })
203
+ end
204
+
205
+ if rackup_opts[:daemonize]
206
+ options[:pid] = "tmp/pids/unicorn.pid"
207
+ Unicorn::Launcher.daemonize!(options)
208
+ end
209
+ Unicorn::HttpServer.new(app, options).start.join
@@ -0,0 +1,2 @@
1
+ # see {Unicorn::OobGC}[http://unicorn.bogomips.org/Unicorn/OobGC.html]
2
+ # Unicorn::OobGC was broken in Unicorn v3.3.1 - v3.6.1 and fixed in v3.6.2
data/examples/echo.ru ADDED
@@ -0,0 +1,27 @@
1
+ #\-E none
2
+ #
3
+ # Example application that echoes read data back to the HTTP client.
4
+ # This emulates the old echo protocol people used to run.
5
+ #
6
+ # An example of using this in a client would be to run:
7
+ # curl --no-buffer -T- http://host:port/
8
+ #
9
+ # Then type random stuff in your terminal to watch it get echoed back!
10
+
11
+ class EchoBody < Struct.new(:input)
12
+
13
+ def each(&block)
14
+ while buf = input.read(4096)
15
+ yield buf
16
+ end
17
+ self
18
+ end
19
+
20
+ end
21
+
22
+ use Rack::Chunked
23
+ run lambda { |env|
24
+ /\A100-continue\z/i =~ env['HTTP_EXPECT'] and return [100, {}, []]
25
+ [ 200, { 'Content-Type' => 'application/octet-stream' },
26
+ EchoBody.new(env['rack.input']) ]
27
+ }
data/examples/git.ru ADDED
@@ -0,0 +1,13 @@
1
+ #\-E none
2
+
3
+ # See http://thread.gmane.org/gmane.comp.web.curl.general/10473/raw on
4
+ # how to setup git for this. A better version of the above patch was
5
+ # accepted and committed on June 15, 2009, so you can pull the latest
6
+ # curl CVS snapshot to try this out.
7
+ require 'unicorn/app/inetd'
8
+
9
+ use Rack::Lint
10
+ use Rack::Chunked # important!
11
+ run Unicorn::App::Inetd.new(
12
+ *%w(git daemon --verbose --inetd --export-all --base-path=/home/ew/unicorn)
13
+ )
data/examples/init.sh ADDED
@@ -0,0 +1,74 @@
1
+ #!/bin/sh
2
+ set -e
3
+ # Example init script, this can be used with nginx, too,
4
+ # since nginx and unicorn accept the same signals
5
+
6
+ # Feel free to change any of the following variables for your app:
7
+ TIMEOUT=${TIMEOUT-60}
8
+ APP_ROOT=/home/x/my_app/current
9
+ PID=$APP_ROOT/tmp/pids/unicorn.pid
10
+ CMD="/usr/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
11
+ INIT_CONF=$APP_ROOT/config/init.conf
12
+ action="$1"
13
+ set -u
14
+
15
+ test -f "$INIT_CONF" && . $INIT_CONF
16
+
17
+ old_pid="$PID.oldbin"
18
+
19
+ cd $APP_ROOT || exit 1
20
+
21
+ sig () {
22
+ test -s "$PID" && kill -$1 `cat $PID`
23
+ }
24
+
25
+ oldsig () {
26
+ test -s $old_pid && kill -$1 `cat $old_pid`
27
+ }
28
+
29
+ case $action in
30
+ start)
31
+ sig 0 && echo >&2 "Already running" && exit 0
32
+ $CMD
33
+ ;;
34
+ stop)
35
+ sig QUIT && exit 0
36
+ echo >&2 "Not running"
37
+ ;;
38
+ force-stop)
39
+ sig TERM && exit 0
40
+ echo >&2 "Not running"
41
+ ;;
42
+ restart|reload)
43
+ sig HUP && echo reloaded OK && exit 0
44
+ echo >&2 "Couldn't reload, starting '$CMD' instead"
45
+ $CMD
46
+ ;;
47
+ upgrade)
48
+ if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
49
+ then
50
+ n=$TIMEOUT
51
+ while test -s $old_pid && test $n -ge 0
52
+ do
53
+ printf '.' && sleep 1 && n=$(( $n - 1 ))
54
+ done
55
+ echo
56
+
57
+ if test $n -lt 0 && test -s $old_pid
58
+ then
59
+ echo >&2 "$old_pid still exists after $TIMEOUT seconds"
60
+ exit 1
61
+ fi
62
+ exit 0
63
+ fi
64
+ echo >&2 "Couldn't upgrade, starting '$CMD' instead"
65
+ $CMD
66
+ ;;
67
+ reopen-logs)
68
+ sig USR1
69
+ ;;
70
+ *)
71
+ echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
72
+ exit 1
73
+ ;;
74
+ esac
@@ -0,0 +1,25 @@
1
+ # Multi-Processing-safe monkey patch for Logger
2
+ #
3
+ # This monkey patch fixes the case where "preload_app true" is used and
4
+ # the application spawns a background thread upon being loaded.
5
+ #
6
+ # This removes all lock from the Logger code and solely relies on the
7
+ # underlying filesystem to handle write(2) system calls atomically when
8
+ # O_APPEND is used. This is safe in the presence of both multiple
9
+ # threads (native or green) and multiple processes when writing to
10
+ # a filesystem with POSIX O_APPEND semantics.
11
+ #
12
+ # It should be noted that the original locking on Logger could _never_ be
13
+ # considered reliable on non-POSIX filesystems with multiple processes,
14
+ # either, so nothing is lost in that case.
15
+
16
+ require 'logger'
17
+ class Logger::LogDevice
18
+ def write(message)
19
+ @dev.syswrite(message)
20
+ end
21
+
22
+ def close
23
+ @dev.close
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # example logrotate config file, I usually keep this in
2
+ # /etc/logrotate.d/unicorn_app on my Debian systems
3
+ #
4
+ # See the logrotate(8) manpage for more information:
5
+ # http://linux.die.net/man/8/logrotate
6
+
7
+ # Modify the following glob to match the logfiles your app writes to:
8
+ /var/log/unicorn_app/*.log {
9
+ # this first block is mostly just personal preference, though
10
+ # I wish logrotate offered an "hourly" option...
11
+ daily
12
+ missingok
13
+ rotate 180
14
+ compress # must use with delaycompress below
15
+ dateext
16
+
17
+ # this is important if using "compress" since we need to call
18
+ # the "lastaction" script below before compressing:
19
+ delaycompress
20
+
21
+ # note the lack of the evil "copytruncate" option in this
22
+ # config. Unicorn supports the USR1 signal and we send it
23
+ # as our "lastaction" action:
24
+ lastaction
25
+ # assuming your pid file is in /var/run/unicorn_app/pid
26
+ pid=/var/run/unicorn_app/pid
27
+ test -s $pid && kill -USR1 "$(cat $pid)"
28
+ endscript
29
+ }
@@ -0,0 +1,156 @@
1
+ # This is example contains the bare mininum to get nginx going with
2
+ # Unicorn or Rainbows! servers. Generally these configuration settings
3
+ # are applicable to other HTTP application servers (and not just Ruby
4
+ # ones), so if you have one working well for proxying another app
5
+ # server, feel free to continue using it.
6
+ #
7
+ # The only setting we feel strongly about is the fail_timeout=0
8
+ # directive in the "upstream" block. max_fails=0 also has the same
9
+ # effect as fail_timeout=0 for current versions of nginx and may be
10
+ # used in its place.
11
+ #
12
+ # Users are strongly encouraged to refer to nginx documentation for more
13
+ # details and search for other example configs.
14
+
15
+ # you generally only need one nginx worker unless you're serving
16
+ # large amounts of static files which require blocking disk reads
17
+ worker_processes 1;
18
+
19
+ # # drop privileges, root is needed on most systems for binding to port 80
20
+ # # (or anything < 1024). Capability-based security may be available for
21
+ # # your system and worth checking out so you won't need to be root to
22
+ # # start nginx to bind on 80
23
+ user nobody nogroup; # for systems with a "nogroup"
24
+ # user nobody nobody; # for systems with "nobody" as a group instead
25
+
26
+ # Feel free to change all paths to suite your needs here, of course
27
+ pid /tmp/nginx.pid;
28
+ error_log /tmp/nginx.error.log;
29
+
30
+ events {
31
+ worker_connections 1024; # increase if you have lots of clients
32
+ accept_mutex off; # "on" if nginx worker_processes > 1
33
+ # use epoll; # enable for Linux 2.6+
34
+ # use kqueue; # enable for FreeBSD, OSX
35
+ }
36
+
37
+ http {
38
+ # nginx will find this file in the config directory set at nginx build time
39
+ include mime.types;
40
+
41
+ # fallback in case we can't determine a type
42
+ default_type application/octet-stream;
43
+
44
+ # click tracking!
45
+ access_log /tmp/nginx.access.log combined;
46
+
47
+ # you generally want to serve static files with nginx since neither
48
+ # Unicorn nor Rainbows! is optimized for it at the moment
49
+ sendfile on;
50
+
51
+ tcp_nopush on; # off may be better for *some* Comet/long-poll stuff
52
+ tcp_nodelay off; # on may be better for some Comet/long-poll stuff
53
+
54
+ # we haven't checked to see if Rack::Deflate on the app server is
55
+ # faster or not than doing compression via nginx. It's easier
56
+ # to configure it all in one place here for static files and also
57
+ # to disable gzip for clients who don't get gzip/deflate right.
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
60
+ gzip on;
61
+ gzip_http_version 1.0;
62
+ gzip_proxied any;
63
+ gzip_min_length 500;
64
+ gzip_disable "MSIE [1-6]\.";
65
+ gzip_types text/plain text/html text/xml text/css
66
+ text/comma-separated-values
67
+ text/javascript application/x-javascript
68
+ application/atom+xml;
69
+
70
+ # this can be any application server, not just Unicorn/Rainbows!
71
+ upstream app_server {
72
+ # 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
+ # single worker for timing out).
75
+
76
+ # for UNIX domain socket setups:
77
+ server unix:/tmp/.sock fail_timeout=0;
78
+
79
+ # for TCP setups, point these to your backend servers
80
+ # server 192.168.0.7:8080 fail_timeout=0;
81
+ # server 192.168.0.8:8080 fail_timeout=0;
82
+ # server 192.168.0.9:8080 fail_timeout=0;
83
+ }
84
+
85
+ server {
86
+ # enable one of the following if you're on Linux or FreeBSD
87
+ # listen 80 default deferred; # for Linux
88
+ # listen 80 default accept_filter=httpready; # for FreeBSD
89
+
90
+ # If you have IPv6, you'll likely want to have two separate listeners.
91
+ # One on IPv4 only (the default), and another on IPv6 only instead
92
+ # of a single dual-stack listener. A dual-stack listener will make
93
+ # for ugly IPv4 addresses in $remote_addr (e.g ":ffff:10.0.0.1"
94
+ # instead of just "10.0.0.1") and potentially trigger bugs in
95
+ # some software.
96
+ # listen [::]:80 ipv6only=on; # deferred or accept_filter recommended
97
+
98
+ client_max_body_size 4G;
99
+ server_name _;
100
+
101
+ # ~2 seconds is often enough for most folks to parse HTML/CSS and
102
+ # retrieve needed images/icons/frames, connections are cheap in
103
+ # nginx so increasing this is generally safe...
104
+ keepalive_timeout 5;
105
+
106
+ # path for static files
107
+ root /path/to/app/current/public;
108
+
109
+ # Prefer to serve static files directly from nginx to avoid unnecessary
110
+ # data copies from the application server.
111
+ #
112
+ # try_files directive appeared in in nginx 0.7.27 and has stabilized
113
+ # over time. Older versions of nginx (e.g. 0.6.x) requires
114
+ # "if (!-f $request_filename)" which was less efficient:
115
+ # http://bogomips.org/unicorn.git/tree/examples/nginx.conf?id=v3.3.1#n127
116
+ try_files $uri/index.html $uri.html $uri @app;
117
+
118
+ location @app {
119
+ # an HTTP header important enough to have its own Wikipedia entry:
120
+ # http://en.wikipedia.org/wiki/X-Forwarded-For
121
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
122
+
123
+ # enable this if you forward HTTPS traffic to unicorn,
124
+ # this helps Rack set the proper URL scheme for doing redirects:
125
+ # proxy_set_header X-Forwarded-Proto $scheme;
126
+
127
+ # pass the Host: header from the client right along so redirects
128
+ # can be set properly within the Rack application
129
+ proxy_set_header Host $http_host;
130
+
131
+ # we don't want nginx trying to do something clever with
132
+ # redirects, we set the Host: header above already.
133
+ proxy_redirect off;
134
+
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.
141
+ #
142
+ # The Rack application may also set "X-Accel-Buffering (yes|no)"
143
+ # in the response headers do disable/enable buffering on a
144
+ # per-response basis.
145
+ # proxy_buffering off;
146
+
147
+ proxy_pass http://app_server;
148
+ }
149
+
150
+ # Rails error pages
151
+ error_page 500 502 503 504 /500.html;
152
+ location = /500.html {
153
+ root /path/to/app/current/public;
154
+ }
155
+ }
156
+ }