From: "Lin Jen-Shin (godfat)" <godfat@godfat.org>
To: unicorn list <mongrel-unicorn@rubyforge.org>
Subject: No middleware without touching RACK_ENV
Date: Fri, 25 Jan 2013 18:52:29 +0800 [thread overview]
Message-ID: <CAA2_N1ubebBWGcK1+a4VnQObGwEMcEnPoOcZizujJcFugtWJeg@mail.gmail.com> (raw)
Hi,
This might be a bit silly, but finally I decided to bring this up.
We're running a Rails app along with another Rack app in
the same config.ru, and what I want to do is telling Unicorn
that we don't want any middleware which Unicorn might
insert with RACK_ENV=development and RACK_ENV=
deployment, because we're adding Rack::CommonLogger
and other middleware by ourselves, while we're using
RACK_ENV=development for Rails when developing.
That is, we want to use RACK_ENV=development for Rails
because that's how it used to be, but we also don't want
those additional middleware got inserted automatically.
This has no problem with RACK_ENV=production.
I know this is somehow a spec from Rack, but I guess I
don't like this behaviour. One workaround would be
providing a `after_app_load' hook, and we add this to
the bottom of config.ru:
ENV['RACK_ENV_ORIGINAL'] = ENV['RACK_ENV']
ENV['RACK_ENV'] = 'none'
and add this to the unicorn configuration file:
after_app_load do |_|
ENV['RACK_ENV'] = ENV['RACK_ENV_ORIGINAL']
end
This is probably a stupid hack, but I wonder if after_app_load
hook would be useful for other cases?
Or if we could have an option to turn off this Rack behaviour
simulation, like:
default_middleware false
That might be more straightforward for what we want. Oh but
it seems it's not that easy to add this. What about an option
for unicorn?
unicorn -E development -N
or
unicorn -E development --no-default-middleware
This would need to be applied to `rainbows' and `zbatery', too,
though. Patches below for consideration:
(Sorry if Gmail messed the format up, but from last time
I tried, it doesn't accept attachments :( What's the best way?
Links to raw patches?)
https://github.com/godfat/unicorn/pull/2
commit 95de5abf38a81a76af15476d4705713d2d644664
Author: Lin Jen-Shin <godfat@godfat.org>
Date: Fri Jan 25 18:18:21 2013 +0800
Add `after_app_load' hook.
The hook would be called right after application is loaded.
diff --git a/lib/unicorn/configurator.rb b/lib/unicorn/configurator.rb
index 7651093..332bdbc 100644
--- a/lib/unicorn/configurator.rb
+++ b/lib/unicorn/configurator.rb
@@ -43,6 +43,9 @@ class Unicorn::Configurator
:before_exec => lambda { |server|
server.logger.info("forked child re-executing...")
},
+ :after_app_load => lambda { |server|
+ server.logger.info("application loaded")
+ },
:pid => nil,
:preload_app => false,
:check_client_connection => false,
@@ -171,6 +174,13 @@ class Unicorn::Configurator
set_hook(:before_exec, block_given? ? block : args[0], 1)
end
+ # sets the after_app_load hook to a given Proc object. This
+ # Proc object will be called by the master process right
+ # after application loaded.
+ def after_app_load(*args, &block)
+ set_hook(:after_app_load, block_given? ? block : args[0], 1)
+ end
+
# sets the timeout of worker processes to +seconds+. Workers
# handling the request/app.call/response cycle taking longer than
# this time period will be forcibly killed (via SIGKILL). This
diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb
index aa98aeb..a3b30ee 100644
--- a/lib/unicorn/http_server.rb
+++ b/lib/unicorn/http_server.rb
@@ -14,6 +14,7 @@ class Unicorn::HttpServer
# :stopdoc:
attr_accessor :app, :request, :timeout, :worker_processes,
:before_fork, :after_fork, :before_exec,
+ :after_app_load,
:listener_opts, :preload_app,
:reexec_pid, :orig_app, :init_listeners,
:master_pid, :config, :ready_pipe, :user
@@ -716,6 +717,7 @@ class Unicorn::HttpServer
Gem.refresh
end
self.app = app.call
+ config.after_app_load.call(self)
end
end
And --no-default-middleware
https://github.com/godfat/unicorn/pull/3
commit e3575db2a36e3ca2acda18bfee97bf95609a9860
Author: Lin Jen-Shin <godfat@godfat.org>
Date: Fri Jan 25 18:38:52 2013 +0800
Add -N or --no-default-middleware option.
This would prevent Unicorn from adding default middleware,
as if RACK_ENV is always none. (not development nor deployment)
This should also apply to `rainbows' and `zbatery'.
diff --git a/bin/unicorn b/bin/unicorn
index 9962b58..415d164 100755
--- a/bin/unicorn
+++ b/bin/unicorn
@@ -58,6 +58,11 @@ op = OptionParser.new("", 24, ' ') do |opts|
ENV["RACK_ENV"] = e
end
+ opts.on("-N", "--no-default-middleware",
+ "no default middleware even if RACK_ENV is development") do |e|
+ rackup_opts[:no_default_middleware] = true
+ end
+
opts.on("-D", "--daemonize", "run daemonized in the background") do |d|
rackup_opts[:daemonize] = !!d
end
diff --git a/lib/unicorn.rb b/lib/unicorn.rb
index d96ff91..f0ceffe 100644
--- a/lib/unicorn.rb
+++ b/lib/unicorn.rb
@@ -49,6 +49,8 @@ module Unicorn
pp({ :inner_app => inner_app }) if $DEBUG
+ return inner_app if op[:no_default_middleware]
+
# return value, matches rackup defaults based on env
# Unicorn does not support persistent connections, but Rainbows!
# and Zbatery both do. Users accustomed to the Rack::Server default
_______________________________________________
Unicorn mailing list - mongrel-unicorn@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying
next reply other threads:[~2013-01-25 10:59 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-25 10:52 Lin Jen-Shin (godfat) [this message]
2013-01-25 18:39 ` No middleware without touching RACK_ENV Eric Wong
2013-01-28 14:43 ` Lin Jen-Shin (godfat)
2013-01-28 23:21 ` Eric Wong
2013-01-29 2:31 ` Lin Jen-Shin (godfat)
2013-01-29 2:52 ` Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://yhbt.net/unicorn/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAA2_N1ubebBWGcK1+a4VnQObGwEMcEnPoOcZizujJcFugtWJeg@mail.gmail.com \
--to=godfat@godfat.org \
--cc=mongrel-unicorn@rubyforge.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/unicorn.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).